136 lines
4.2 KiB
Lua
136 lines
4.2 KiB
Lua
lib.versionCheck('SamShanks1/fivem-scenes')
|
|
|
|
local scenes = {}
|
|
|
|
local group = ('group.%s'):format(Config.AceGroup)
|
|
local restrictedGroup = Config.AdminOnly and group
|
|
|
|
lib.addCommand('scene', {
|
|
help = 'Create/Delete a scene',
|
|
restricted = restrictedGroup
|
|
}, function(source, args, raw)
|
|
TriggerClientEvent('fivem-scenes:client:startScenes', source)
|
|
end)
|
|
|
|
--Credit https://github.com/ItsANoBrainer/qb-scenes/blob/master/server/server.lua
|
|
|
|
local function updateAllScenes()
|
|
scenes = {}
|
|
MySQL.Async.fetchAll('SELECT * FROM scenes', {}, function(result)
|
|
if result[1] then
|
|
for _, v in pairs(result) do
|
|
local sceneData = json.decode(v.data)
|
|
sceneData.id = v.id
|
|
sceneData.coords = vector3(sceneData.coords.x, sceneData.coords.y, sceneData.coords.z)
|
|
scenes[#scenes+1] = sceneData
|
|
end
|
|
end
|
|
TriggerClientEvent('fivem-scenes:client:updateAllScenes', -1, scenes)
|
|
end)
|
|
end
|
|
|
|
local function deleteExpiredScenes()
|
|
if Config.NeverExpire then
|
|
MySQL.Async.execute('DELETE FROM scenes WHERE deleteAt < NOW() AND `neverExpire` = 0', {}, function(result)
|
|
if result > 0 then
|
|
print('Deleted '..result..' expired scenes from the database.')
|
|
updateAllScenes()
|
|
end
|
|
end)
|
|
else
|
|
MySQL.Async.execute('DELETE FROM scenes WHERE deleteAt < NOW()', {}, function(result)
|
|
if result > 0 then
|
|
print('Deleted '..result..' expired scenes from the database.')
|
|
updateAllScenes()
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
local function countScenes(identifier)
|
|
local count = 0
|
|
for i = 1, #scenes do
|
|
if scenes[i].creator == identifier then
|
|
count = count+1
|
|
end
|
|
end
|
|
return count
|
|
end
|
|
|
|
local function getIdentifier(source)
|
|
for _, v in pairs(GetPlayerIdentifiers(source)) do
|
|
if v:sub(1, #"license:") == "license:" then
|
|
return v
|
|
end
|
|
end
|
|
end
|
|
|
|
RegisterNetEvent('fivem-scenes:server:createScene', function(sceneData)
|
|
local src = source
|
|
local identifier = getIdentifier(src)
|
|
local count = countScenes(identifier)
|
|
if count > Config.MaxScenes then
|
|
return TriggerClientEvent('ox_lib:notify', src, {type = "error", description = "You have exceed the max scene count"})
|
|
end
|
|
sceneData.creator = identifier
|
|
MySQL.Async.insert('INSERT INTO scenes (creator, data, createdAt, deleteAt, neverExpire) VALUES (?, ?, NOW(), DATE_ADD(NOW(), INTERVAL ? HOUR), ?)', {
|
|
identifier, json.encode(sceneData), sceneData.duration, sceneData.neverExpire
|
|
}, function(id)
|
|
sceneData.id = id
|
|
if Config.Log then
|
|
lib.logger(src, 'CreateScene', json.encode(sceneData))
|
|
end
|
|
scenes[#scenes+1] = sceneData
|
|
TriggerClientEvent('fivem-scenes:client:addScene', -1, sceneData)
|
|
end)
|
|
end)
|
|
|
|
RegisterNetEvent('fivem-scenes:server:deleteScene', function(sceneId)
|
|
local src = source
|
|
local identifier = getIdentifier(src)
|
|
local canDelete = false
|
|
local scenePos
|
|
|
|
for i = 1, #scenes do
|
|
if scenes[i].creator == identifier then
|
|
canDelete = true
|
|
scenePos = i
|
|
end
|
|
end
|
|
|
|
if IsPlayerAceAllowed(src, Config.AceGroup) then
|
|
canDelete = true
|
|
end
|
|
|
|
if not canDelete then
|
|
return TriggerClientEvent('ox_lib:notify', src, {type = "error", description = "You did not create this scene"})
|
|
end
|
|
|
|
MySQL.Async.execute('DELETE FROM scenes WHERE id = ?', {sceneId}, function()
|
|
if Config.Log then
|
|
lib.logger(src, 'DeleteScene', scenes[scenePos])
|
|
end
|
|
table.remove(scenes, scenePos)
|
|
TriggerClientEvent('fivem-scenes:client:removeScene', -1, sceneId)
|
|
TriggerClientEvent('ox_lib:notify', src, {type = "success", description = "Scene Deleted"})
|
|
end)
|
|
|
|
end)
|
|
|
|
lib.callback.register('fivem-scenes:server:getScenes', function()
|
|
return scenes
|
|
end)
|
|
|
|
|
|
lib.callback.register('fivem-scenes:server:isAdmin', function(source)
|
|
return IsPlayerAceAllowed(source, Config.AceGroup)
|
|
end)
|
|
|
|
CreateThread(function()
|
|
updateAllScenes()
|
|
while true do
|
|
deleteExpiredScenes()
|
|
Wait(Config.AuditInterval * 1000 * 60)
|
|
end
|
|
end)
|