mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-30 17:58:54 +00:00
Add files
This commit is contained in:
@@ -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'
|
||||
}
|
||||
@@ -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)
|
||||
@@ -0,0 +1,5 @@
|
||||
Config = {}
|
||||
|
||||
Config.StatusMax = 1000000
|
||||
Config.TickTime = 1000
|
||||
Config.UpdateClientTime = 60000
|
||||
@@ -0,0 +1,3 @@
|
||||
USE `essentialmode`;
|
||||
|
||||
ALTER TABLE `users` ADD COLUMN `status` LONGTEXT NULL;
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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) }); }
|
||||
|
||||
})()
|
||||
@@ -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>
|
||||
@@ -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
@@ -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()
|
||||
Reference in New Issue
Block a user