Add files

This commit is contained in:
Jérémie N'gadi
2017-08-12 11:35:52 +02:00
parent 944de1000d
commit 09d76deef3
9 changed files with 469 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937'
description 'ESX Status'
server_scripts {
'@mysql-async/lib/MySQL.lua',
'config.lua',
'server/classes/status.lua',
'server/main.lua'
}
client_scripts {
'config.lua',
'client/main.lua'
}
ui_page 'html/ui.html'
files {
'html/ui.html',
'html/css/app.css',
'html/scripts/app.js'
}
+97
View File
@@ -0,0 +1,97 @@
local Status = {}
local loaded = false
RegisterNetEvent('esx_status:update')
AddEventHandler('esx_status:update', function(status)
Status = status
SendNUIMessage({
update = true,
status = Status
})
if not loaded then
TriggerEvent('esx_status:loaded')
loaded = true
end
end)
AddEventHandler('esx_status:getStatus', function(name, cb)
for i=1, #Status, 1 do
if Status[i].name == name then
cb(Status[i])
return
end
end
end)
AddEventHandler('esx_status:setDisplay', function(val)
SendNUIMessage({
setDisplay = true,
display = val
})
end)
-- Calculate status
Citizen.CreateThread(function()
while true do
for i=1, #Status, 1 do
if Status[i].clientAction.add ~= nil then
local val = Status[i].clientAction.add
if Status[i].val + val > Config.StatusMax then
Status[i].val = StatusMax
else
Status[i].val = Status[i].val + val
end
end
if Status[i].clientAction.remove ~= nil then
local val = Status[i].clientAction.remove
if Status[i].val - val < 0 then
Status[i].val = 0
else
Status[i].val = Status[i].val - val
end
end
end
SendNUIMessage({
update = true,
status = Status
})
Citizen.Wait(Config.TickTime)
end
end)
-- Pause menu disable hud display
local isPaused = false
Citizen.CreateThread(function()
while true do
Citizen.Wait(1)
if IsPauseMenuActive() and not isPaused then
isPaused = true
TriggerEvent('esx_status:setDisplay', 0.0)
elseif not IsPauseMenuActive() and isPaused then
isPaused = false
TriggerEvent('esx_status:setDisplay', 0.5)
end
end
end)
+5
View File
@@ -0,0 +1,5 @@
Config = {}
Config.StatusMax = 1000000
Config.TickTime = 1000
Config.UpdateClientTime = 60000
+3
View File
@@ -0,0 +1,3 @@
USE `essentialmode`;
ALTER TABLE `users` ADD COLUMN `status` LONGTEXT NULL;
+20
View File
@@ -0,0 +1,20 @@
#status_list {
position: absolute;
left : 23;
bottom : 21%;
width : 14.5%;
opacity: 0.3;
}
.status {
padding: 1px;
margin: 0.3em;
}
.status_inner {
padding: 1px;
}
.status_val {
height : 0.5em;
}
+57
View File
@@ -0,0 +1,57 @@
(function(){
let status = []
let renderStatus = function(){
$('#status_list').html('');
for(let i=0; i<status.length; i++){
if(!status[i].visible)
continue;
let statusDiv = $(
'<div class="status">' +
'<div class="status_inner">' +
'<div class="status_val"></div>' +
'</div>' +
'</div>');
statusDiv.find('.status_inner')
.css({'border' : '1px solid ' + status[i].color})
;
statusDiv.find('.status_val')
.css({
'background-color' : status[i].color,
'width' : (status[i].val / 10000) + '%'
})
;
$('#status_list').append(statusDiv)
}
}
window.onData = function(data){
if(data.update){
status.length = 0;
for(let i=0; i<data.status.length; i++)
status.push(data.status[i])
renderStatus();
}
if(data.setDisplay){
$('#status_list').css({'opacity' : data.display})
}
}
window.onload = function(e){ window.addEventListener('message', function(event){ onData(event.data) }); }
})()
+14
View File
@@ -0,0 +1,14 @@
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" href="css/app.css" type="text/css" />
</head>
<body>
<div id="status_list"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="nui://game/ui/jquery.js" type="text/javascript"></script>
<script src="scripts/app.js"></script>
</body>
</html>
+52
View File
@@ -0,0 +1,52 @@
function CreateStatus(xPlayer, name, default, color, visible, tickCallback, clientAction)
local self = {}
self.val = default
self.xPlayer = xPlayer
self.name = name
self.default = default
self.color = color
self.visible = visible
self.tickCallback = tickCallback
self.clientAction = clientAction
self._set = function(k, v)
self[k] = v
end
self._get = function(k)
return self[k]
end
self.onTick = function()
self.tickCallback(self)
end
self.set = function(val)
self.val = val
end
self.add = function(val)
if self.val + val > Config.StatusMax then
self.val = StatusMax
else
self.val = self.val + val
end
end
self.remove = function(val)
if self.val - val < 0 then
self.val = 0
else
self.val = self.val - val
end
end
self.updateClient = function()
TriggerEvent('esx_status:updateClient', self.xPlayer.source)
end
return self
end
+198
View File
@@ -0,0 +1,198 @@
ESX = nil
local RegisteredStatus = {}
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
AddEventHandler('esx_status:registerStatus', function(name, default, color, visible, tickCallback, clientAction)
table.insert(RegisteredStatus, {
name = name,
default = default,
color = color,
visible = visible,
tickCallback = tickCallback,
clientAction = clientAction
})
end)
AddEventHandler('esx:playerLoaded', function(source)
local _source = source
local xPlayer = ESX.GetPlayerFromId(_source)
MySQL.Async.fetchAll(
'SELECT * FROM users WHERE identifier = @identifier',
{
['@identifier'] = xPlayer.identifier
},
function(result)
local data = {}
local savedStatus = {}
if result[1].status ~= nil then
data = json.decode(result[1].status)
end
for i=1, #data, 1 do
savedStatus[data[i].name] = data[i]
end
local status = {}
for i=1, #RegisteredStatus, 1 do
local s = RegisteredStatus[i]
local default = nil
if savedStatus[s.name] ~= nil then
default = savedStatus[s.name].val
else
default = s.default
end
table.insert(status, CreateStatus(xPlayer, s.name, default, s.color, s.visible, s.tickCallback, s.clientAction))
end
xPlayer.set('status', status)
TriggerEvent('esx_status:updateClient', _source)
end
)
end)
AddEventHandler('esx:playerDropped', function(source)
local xPlayer = ESX.GetPlayerFromId(source)
local data = {}
local status = xPlayer.get('status')
for i=1, #status, 1 do
local s = status[i]
table.insert(data, {
name = s._get('name'),
val = s._get('val')
})
end
MySQL.Async.execute(
'UPDATE users SET status = @status WHERE identifier = @identifier',
{
['@status'] = json.encode(data),
['@identifier'] = xPlayer.identifier
}
)
end)
AddEventHandler('esx_status:getStatus', function(playerId, statusName, cb)
local xPlayer = ESX.GetPlayerFromId(playerId)
local status = xPlayer.get('status')
for i=1, #status, 1 do
if status[i]._get('name') == statusName then
cb(status[i])
break
end
end
end)
AddEventHandler('esx_status:updateClient', function(playerId)
local xPlayer = ESX.GetPlayerFromId(playerId)
local data = {}
local status = xPlayer.get('status')
for i=1, #status, 1 do
table.insert(data, {
name = status[i]._get('name'),
val = status[i]._get('val'),
color = status[i]._get('color'),
visible = status[i]._get('visible')(status[i]),
clientAction = status[i]._get('clientAction'),
max = Config.StatusMax
})
end
TriggerClientEvent('esx_status:update', playerId, data)
end)
function TickStatus()
local xPlayers = ESX.GetPlayers()
for k,v in pairs(xPlayers) do
local status = v.get('status')
if status ~= nil then
for i=1, #status, 1 do
status[i]._get('onTick')()
end
end
end
SetTimeout(Config.TickTime, TickStatus)
end
function UpdateClients()
local xPlayers = ESX.GetPlayers()
for k,v in pairs(xPlayers) do
TriggerEvent('esx_status:updateClient', v.source)
end
SetTimeout(Config.UpdateClientTime, UpdateClients)
end
function SaveData()
local xPlayers = ESX.GetPlayers()
for k,v in pairs(xPlayers) do
local data = {}
local status = v.get('status')
for i=1, #status, 1 do
local s = status[i]
table.insert(data, {
name = s._get('name'),
val = s._get('val')
})
end
MySQL.Async.execute(
'UPDATE users SET status = @status WHERE identifier = @identifier',
{
['@status'] = json.encode(data),
['@identifier'] = v.identifier
}
)
end
SetTimeout(60000, SaveData)
end
TickStatus()
UpdateClients()
SaveData()