This commit is contained in:
Jérémie N'gadi
2017-09-02 12:15:18 +02:00
parent 1dfeee2a18
commit 58ab6be31e
5 changed files with 194 additions and 170 deletions
+1 -1
View File
@@ -5,12 +5,12 @@ description 'ESX Status'
server_scripts {
'@mysql-async/lib/MySQL.lua',
'config.lua',
'server/classes/status.lua',
'server/main.lua'
}
client_scripts {
'config.lua',
'client/classes/status.lua',
'client/main.lua'
}
+50
View File
@@ -0,0 +1,50 @@
function CreateStatus(name, default, color, visible, tickCallback)
local self = {}
self.val = default
self.name = name
self.default = default
self.color = color
self.visible = visible
self.tickCallback = tickCallback
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 = Config.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.getPercent = function()
return (self.val / Config.StatusMax) * 100
end
return self
end
+126 -50
View File
@@ -1,21 +1,126 @@
local Status = {}
local loaded = false
RegisterNetEvent('esx_status:update')
AddEventHandler('esx_status:update', function(status)
function GetStatusData(minimal)
local status = {}
for i=1, #Status, 1 do
if minimal then
table.insert(status, {
name = Status[i].name,
val = Status[i].val,
})
else
table.insert(status, {
name = Status[i].name,
val = Status[i].val,
color = Status[i].color,
visible = Status[i].visible(Status[i]),
max = Status[i].max,
})
end
end
return status
end
AddEventHandler('esx_status:registerStatus', function(name, default, color, visible, tickCallback)
local s = CreateStatus(name, default, color, visible, tickCallback)
table.insert(Status, s)
end)
RegisterNetEvent('esx_status:load')
AddEventHandler('esx_status:load', function(status)
for i=1, #Status, 1 do
for j=1, #status, 1 do
if Status[i].name == status[j].name then
Status[i].set(status[j].val)
end
end
end
Citizen.CreateThread(function()
while true do
for i=1, #Status, 1 do
Status[i].onTick()
end
SendNUIMessage({
update = true,
status = GetStatusData()
})
Citizen.Wait(Config.TickTime)
end
end)
end)
RegisterNetEvent('esx_status:set')
AddEventHandler('esx_status:set', function(name, val)
Status = status
for i=1, #Status, 1 do
if Status[i].name == name then
Status[i].set(val)
break
end
end
SendNUIMessage({
update = true,
status = Status
status = GetStatusData()
})
if not loaded then
TriggerEvent('esx_status:loaded')
loaded = true
TriggerServerEvent('esx_status:update', GetStatusData(true))
end)
RegisterNetEvent('esx_status:add')
AddEventHandler('esx_status:add', function(name, val)
for i=1, #Status, 1 do
if Status[i].name == name then
Status[i].add(val)
break
end
end
SendNUIMessage({
update = true,
status = GetStatusData()
})
TriggerServerEvent('esx_status:update', GetStatusData(true))
end)
RegisterNetEvent('esx_status:remove')
AddEventHandler('esx_status:remove', function(name, val)
for i=1, #Status, 1 do
if Status[i].name == name then
Status[i].remove(val)
break
end
end
SendNUIMessage({
update = true,
status = GetStatusData()
})
TriggerServerEvent('esx_status:update', GetStatusData(true))
end)
AddEventHandler('esx_status:getStatus', function(name, cb)
@@ -38,48 +143,6 @@ AddEventHandler('esx_status:setDisplay', function(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 = math.floor(Status[i].clientAction.add / (Config.TickTime / Config.ClientTickTime))
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 = math.floor(Status[i].clientAction.remove / (Config.TickTime / Config.ClientTickTime))
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.ClientqTickTime)
end
end)
-- Pause menu disable hud display
local isPaused = false
@@ -94,4 +157,17 @@ Citizen.CreateThread(function()
TriggerEvent('esx_status:setDisplay', 0.5)
end
end
end)
-- Loaded event
Citizen.CreateThread(function()
TriggerEvent('esx_status:loaded')
end)
-- Update server
Citizen.CreateThread(function()
while true do
Citizen.Wait(Config.UpdateInterval)
TriggerServerEvent('esx_status:update', GetStatusData(true))
end
end)
+3 -4
View File
@@ -1,6 +1,5 @@
Config = {}
Config.StatusMax = 1000000
Config.TickTime = 30000
Config.ClientTickTime = 1000
Config.UpdateClientTime = 65000
Config.StatusMax = 1000000
Config.TickTime = 1000
Config.UpdateInterval = 10000
+14 -115
View File
@@ -3,19 +3,6 @@ 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
@@ -28,36 +15,15 @@ AddEventHandler('esx:playerLoaded', function(source)
},
function(result)
local data = {}
local savedStatus = {}
local data = {}
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
xPlayer.set('status', data)
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)
TriggerClientEvent('esx_status:load', _source, data)
end
)
@@ -71,20 +37,10 @@ AddEventHandler('esx:playerDropped', function(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),
['@status'] = json.encode(status),
['@identifier'] = xPlayer.identifier
}
)
@@ -97,7 +53,7 @@ AddEventHandler('esx_status:getStatus', function(playerId, statusName, cb)
local status = xPlayer.get('status')
for i=1, #status, 1 do
if status[i]._get('name') == statusName then
if status[i].name == statusName then
cb(status[i])
break
end
@@ -105,61 +61,16 @@ AddEventHandler('esx_status:getStatus', function(playerId, statusName, cb)
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)
RegisterServerEvent('esx_status:update')
AddEventHandler('esx_status:update', function(status)
local _source = source
local xPlayer = ESX.GetPlayerFromId(_source)
xPlayer.set('status', status)
end)
function TickStatus()
local xPlayers = ESX.GetPlayers()
for i=1, #xPlayers, 1 do
local xPlayer = ESX.GetPlayerFromId(xPlayers[i])
local status = xPlayer.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 i=1, #xPlayers, 1 do
local xPlayer = ESX.GetPlayerFromId(xPlayers[i])
TriggerEvent('esx_status:updateClient', xPlayer.source)
end
SetTimeout(Config.UpdateClientTime, UpdateClients)
end
function SaveData()
local xPlayers = ESX.GetPlayers()
@@ -170,30 +81,18 @@ function SaveData()
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),
['@status'] = json.encode(status),
['@identifier'] = xPlayer.identifier
}
)
end
SetTimeout(60000, SaveData)
SetTimeout(10 * 60 * 1000, SaveData)
end
TickStatus()
UpdateClients()
SaveData()