mirror of
https://github.com/qbcore-fivem/qb-core.git
synced 2026-08-28 22:01:33 +00:00
74ac036d4a
Major refactor to centralize QBCore and replace the web UI stack: - Move QBConfig into a unified QBCore.Config and initialize QBCore.PlayerData; add shared/functions.lua. - Remove legacy client/main.lua and server/main.lua exports and update fxmanifest to include shared/functions and drop those main scripts. - Update client event handling: adapt player data events to QBCore:Client:OnPlayerUpdated and trigger job/gang update events; remove deprecated exploitable handlers. - Web UI rewrite: remove Vue/Quasar dependency and config module; implement a lightweight vanilla JS notification system (html/js/app.js) with updated html and css assets, plus drawtext tweaks. - CSS overhaul for notification styling and animations; HTML head/meta/font cleanup. - Server fixes: use QBCore.Shared.Locations in teleport command and strengthen numeric parsing/validation for coords. - Add .gitattributes for consistent text/eol handling and small code cleanups (thread/comment removal). These changes consolidate config/shared logic under QBCore, simplify the frontend dependencies, and fix a few parsing/event issues.
289 lines
8.4 KiB
Lua
289 lines
8.4 KiB
Lua
-- Add or change (a) method(s) in the QBCore.Functions table
|
|
local function SetMethod(methodName, handler)
|
|
if type(methodName) ~= 'string' then
|
|
return false, 'invalid_method_name'
|
|
end
|
|
if QBCore.Functions[methodName] ~= nil then
|
|
return false, 'method_exists'
|
|
end
|
|
QBCore.Functions[methodName] = handler
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.SetMethod = SetMethod
|
|
exports('SetMethod', SetMethod)
|
|
|
|
-- Add or change (a) field(s) in the QBCore table
|
|
local function SetField(fieldName, data)
|
|
if type(fieldName) ~= 'string' then
|
|
return false, 'invalid_field_name'
|
|
end
|
|
if QBCore[fieldName] ~= nil then
|
|
return false, 'field_exists'
|
|
end
|
|
QBCore[fieldName] = data
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.SetField = SetField
|
|
exports('SetField', SetField)
|
|
|
|
-- Single add job function which should only be used if you planning on adding a single job
|
|
local function AddJob(jobName, job)
|
|
if type(jobName) ~= 'string' then
|
|
return false, 'invalid_job_name'
|
|
end
|
|
|
|
if QBCore.Shared.Jobs[jobName] then
|
|
return false, 'job_exists'
|
|
end
|
|
|
|
QBCore.Shared.Jobs[jobName] = job
|
|
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Jobs', jobName, job)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.AddJob = AddJob
|
|
exports('AddJob', AddJob)
|
|
|
|
-- Multiple Add Jobs
|
|
local function AddJobs(jobs)
|
|
for key, value in pairs(jobs) do
|
|
if type(key) ~= 'string' then return false, 'invalid_job_name', value end
|
|
if QBCore.Shared.Jobs[key] then return false, 'job_exists', value end
|
|
end
|
|
for key, value in pairs(jobs) do
|
|
QBCore.Shared.Jobs[key] = value
|
|
end
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Jobs', jobs)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success', nil
|
|
end
|
|
|
|
QBCore.Functions.AddJobs = AddJobs
|
|
exports('AddJobs', AddJobs)
|
|
|
|
-- Single Remove Job
|
|
local function RemoveJob(jobName)
|
|
if type(jobName) ~= 'string' then
|
|
return false, 'invalid_job_name'
|
|
end
|
|
|
|
if not QBCore.Shared.Jobs[jobName] then
|
|
return false, 'job_not_exists'
|
|
end
|
|
|
|
QBCore.Shared.Jobs[jobName] = nil
|
|
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Jobs', jobName, nil)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.RemoveJob = RemoveJob
|
|
exports('RemoveJob', RemoveJob)
|
|
|
|
-- Single Update Job
|
|
local function UpdateJob(jobName, job)
|
|
if type(jobName) ~= 'string' then
|
|
return false, 'invalid_job_name'
|
|
end
|
|
|
|
if not QBCore.Shared.Jobs[jobName] then
|
|
return false, 'job_not_exists'
|
|
end
|
|
|
|
QBCore.Shared.Jobs[jobName] = job
|
|
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Jobs', jobName, job)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.UpdateJob = UpdateJob
|
|
exports('UpdateJob', UpdateJob)
|
|
|
|
-- Single add item
|
|
local function AddItem(itemName, item)
|
|
if type(itemName) ~= 'string' then
|
|
return false, 'invalid_item_name'
|
|
end
|
|
|
|
if QBCore.Shared.Items[itemName] then
|
|
return false, 'item_exists'
|
|
end
|
|
|
|
QBCore.Shared.Items[itemName] = item
|
|
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Items', itemName, item)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.AddItem = AddItem
|
|
exports('AddItem', AddItem)
|
|
|
|
-- Single update item
|
|
local function UpdateItem(itemName, item)
|
|
if type(itemName) ~= 'string' then
|
|
return false, 'invalid_item_name'
|
|
end
|
|
if not QBCore.Shared.Items[itemName] then
|
|
return false, 'item_not_exists'
|
|
end
|
|
QBCore.Shared.Items[itemName] = item
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Items', itemName, item)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.UpdateItem = UpdateItem
|
|
exports('UpdateItem', UpdateItem)
|
|
|
|
-- Multiple Add Items
|
|
local function AddItems(items)
|
|
for key, value in pairs(items) do
|
|
if type(key) ~= 'string' then return false, 'invalid_item_name', value end
|
|
if QBCore.Shared.Items[key] then return false, 'item_exists', value end
|
|
end
|
|
for key, value in pairs(items) do
|
|
QBCore.Shared.Items[key] = value
|
|
end
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Items', items)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success', nil
|
|
end
|
|
|
|
QBCore.Functions.AddItems = AddItems
|
|
exports('AddItems', AddItems)
|
|
|
|
-- Single Remove Item
|
|
local function RemoveItem(itemName)
|
|
if type(itemName) ~= 'string' then
|
|
return false, 'invalid_item_name'
|
|
end
|
|
|
|
if not QBCore.Shared.Items[itemName] then
|
|
return false, 'item_not_exists'
|
|
end
|
|
|
|
QBCore.Shared.Items[itemName] = nil
|
|
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Items', itemName, nil)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.RemoveItem = RemoveItem
|
|
exports('RemoveItem', RemoveItem)
|
|
|
|
-- Single Add Gang
|
|
local function AddGang(gangName, gang)
|
|
if type(gangName) ~= 'string' then
|
|
return false, 'invalid_gang_name'
|
|
end
|
|
|
|
if QBCore.Shared.Gangs[gangName] then
|
|
return false, 'gang_exists'
|
|
end
|
|
|
|
QBCore.Shared.Gangs[gangName] = gang
|
|
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Gangs', gangName, gang)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.AddGang = AddGang
|
|
exports('AddGang', AddGang)
|
|
|
|
-- Multiple Add Gangs
|
|
local function AddGangs(gangs)
|
|
for key, value in pairs(gangs) do
|
|
if type(key) ~= 'string' then return false, 'invalid_gang_name', value end
|
|
if QBCore.Shared.Gangs[key] then return false, 'gang_exists', value end
|
|
end
|
|
for key, value in pairs(gangs) do
|
|
QBCore.Shared.Gangs[key] = value
|
|
end
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Gangs', gangs)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success', nil
|
|
end
|
|
|
|
QBCore.Functions.AddGangs = AddGangs
|
|
exports('AddGangs', AddGangs)
|
|
|
|
-- Single Remove Gang
|
|
local function RemoveGang(gangName)
|
|
if type(gangName) ~= 'string' then
|
|
return false, 'invalid_gang_name'
|
|
end
|
|
|
|
if not QBCore.Shared.Gangs[gangName] then
|
|
return false, 'gang_not_exists'
|
|
end
|
|
|
|
QBCore.Shared.Gangs[gangName] = nil
|
|
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Gangs', gangName, nil)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.RemoveGang = RemoveGang
|
|
exports('RemoveGang', RemoveGang)
|
|
|
|
-- Single Update Gang
|
|
local function UpdateGang(gangName, gang)
|
|
if type(gangName) ~= 'string' then
|
|
return false, 'invalid_gang_name'
|
|
end
|
|
|
|
if not QBCore.Shared.Gangs[gangName] then
|
|
return false, 'gang_not_exists'
|
|
end
|
|
|
|
QBCore.Shared.Gangs[gangName] = gang
|
|
|
|
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Gangs', gangName, gang)
|
|
TriggerEvent('QBCore:Server:UpdateObject')
|
|
return true, 'success'
|
|
end
|
|
|
|
QBCore.Functions.UpdateGang = UpdateGang
|
|
exports('UpdateGang', UpdateGang)
|
|
|
|
local resourceName = GetCurrentResourceName()
|
|
local function GetCoreVersion(InvokingResource)
|
|
local resourceVersion = GetResourceMetadata(resourceName, 'version')
|
|
if InvokingResource and InvokingResource ~= '' then
|
|
print(('%s called qbcore version check: %s'):format(InvokingResource or 'Unknown Resource', resourceVersion))
|
|
end
|
|
return resourceVersion
|
|
end
|
|
|
|
QBCore.Functions.GetCoreVersion = GetCoreVersion
|
|
exports('GetCoreVersion', GetCoreVersion)
|
|
|
|
local function ExploitBan(playerId, origin)
|
|
local name = GetPlayerName(playerId)
|
|
MySQL.insert('INSERT INTO bans (name, license, discord, ip, reason, expire, bannedby) VALUES (?, ?, ?, ?, ?, ?, ?)', {
|
|
name,
|
|
QBCore.Functions.GetIdentifier(playerId, 'license'),
|
|
QBCore.Functions.GetIdentifier(playerId, 'discord'),
|
|
QBCore.Functions.GetIdentifier(playerId, 'ip'),
|
|
origin,
|
|
2147483647,
|
|
'Anti Cheat'
|
|
})
|
|
DropPlayer(playerId, Lang:t('info.exploit_banned', { discord = QBCore.Config.Server.Discord }))
|
|
TriggerEvent('qb-log:server:CreateLog', 'anticheat', 'Anti-Cheat', 'red', name .. ' has been banned for exploiting ' .. origin, true)
|
|
end
|
|
|
|
exports('ExploitBan', ExploitBan)
|