mirror of
https://github.com/qbcore-fivem/qb-core.git
synced 2026-08-29 01:08:57 +00:00
Merge branch 'main' into main
This commit is contained in:
+17
-7
@@ -126,11 +126,11 @@ RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName)
|
||||
while not HasModelLoaded(hash) do
|
||||
Wait(0)
|
||||
end
|
||||
|
||||
if IsPedInAnyVehicle(ped) then
|
||||
|
||||
if IsPedInAnyVehicle(ped) then
|
||||
DeleteVehicle(veh)
|
||||
end
|
||||
|
||||
|
||||
local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false)
|
||||
TaskWarpPedIntoVehicle(ped, vehicle, -1)
|
||||
SetVehicleFuelLevel(vehicle, 100.0)
|
||||
@@ -171,6 +171,20 @@ RegisterNetEvent('QBCore:Notify', function(text, type, length)
|
||||
QBCore.Functions.Notify(text, type, length)
|
||||
end)
|
||||
|
||||
RegisterNetEvent('QBCore:Client:UseItem', function(item)
|
||||
TriggerServerEvent('QBCore:Server:UseItem', item)
|
||||
end)
|
||||
|
||||
-- Callback Events --
|
||||
|
||||
-- Client Callback
|
||||
RegisterNetEvent('QBCore:Client:TriggerClientCallback', function(name, ...)
|
||||
QBCore.Functions.TriggerClientCallback(name, function(...)
|
||||
TriggerServerEvent('QBCore:Server:TriggerClientCallback', name, ...)
|
||||
end, ...)
|
||||
end)
|
||||
|
||||
-- Server Callback
|
||||
RegisterNetEvent('QBCore:Client:TriggerCallback', function(name, ...)
|
||||
if QBCore.ServerCallbacks[name] then
|
||||
QBCore.ServerCallbacks[name](...)
|
||||
@@ -178,10 +192,6 @@ RegisterNetEvent('QBCore:Client:TriggerCallback', function(name, ...)
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('QBCore:Client:UseItem', function(item)
|
||||
TriggerServerEvent('QBCore:Server:UseItem', item)
|
||||
end)
|
||||
|
||||
-- Me command
|
||||
|
||||
local function Draw3DText(coords, str)
|
||||
|
||||
+45
-7
@@ -11,12 +11,35 @@ function QBCore.Functions.GetCoords(entity)
|
||||
return vector4(GetEntityCoords(entity), GetEntityHeading(entity))
|
||||
end
|
||||
|
||||
function QBCore.Functions.HasItem(item)
|
||||
local p = promise.new()
|
||||
QBCore.Functions.TriggerCallback('QBCore:HasItem', function(result)
|
||||
p:resolve(result)
|
||||
end, item)
|
||||
return Citizen.Await(p)
|
||||
function QBCore.Functions.HasItem(items, amount)
|
||||
local isTable = type(items) == 'table'
|
||||
local isArray = isTable and table.type(items) == 'array' or false
|
||||
local totalItems = #items
|
||||
local count = 0
|
||||
local kvIndex = 2
|
||||
if isTable and not isArray then
|
||||
totalItems = 0
|
||||
for _ in pairs(items) do totalItems += 1 end
|
||||
kvIndex = 1
|
||||
end
|
||||
for _, itemData in pairs(QBCore.PlayerData.items) do
|
||||
if isTable then
|
||||
for k, v in pairs(items) do
|
||||
local itemKV = {k, v}
|
||||
if itemData and itemData.name == itemKV[kvIndex] and ((not amount and not isArray and itemData.amount >= v) or (isArray and amount and itemData.amount >= amount) or (not amount and isArray)) then
|
||||
count += 1
|
||||
end
|
||||
end
|
||||
if count == totalItems then
|
||||
return true
|
||||
end
|
||||
else -- Single item as string
|
||||
if itemData and itemData.name == items and (not amount or (amount and itemData.amount >= amount)) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Utility
|
||||
@@ -117,11 +140,26 @@ function QBCore.Debug(resource, obj, depth)
|
||||
TriggerServerEvent('QBCore:DebugSomething', resource, obj, depth)
|
||||
end
|
||||
|
||||
-- Callback Functions --
|
||||
|
||||
-- Client Callback
|
||||
function QBCore.Functions.CreateClientCallback(name, cb)
|
||||
QBCore.ClientCallbacks[name] = cb
|
||||
end
|
||||
|
||||
function QBCore.Functions.TriggerClientCallback(name, cb, ...)
|
||||
if not QBCore.ClientCallbacks[name] then return end
|
||||
QBCore.ClientCallbacks[name](cb, ...)
|
||||
end
|
||||
|
||||
-- Server Callback
|
||||
function QBCore.Functions.TriggerCallback(name, cb, ...)
|
||||
QBCore.ServerCallbacks[name] = cb
|
||||
TriggerServerEvent('QBCore:Server:TriggerCallback', name, ...)
|
||||
end
|
||||
|
||||
|
||||
|
||||
function QBCore.Functions.Progressbar(name, label, duration, useWhileDead, canCancel, disableControls, animation, prop, propTwo, onFinish, onCancel)
|
||||
if GetResourceState('progressbar') ~= 'started' then error('progressbar needs to be started in order for QBCore.Functions.Progressbar to work') end
|
||||
exports['progressbar']:Progress({
|
||||
@@ -647,7 +685,7 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props)
|
||||
if props.doorStatus then
|
||||
for doorIndex, breakDoor in pairs(props.doorStatus) do
|
||||
if breakDoor then
|
||||
SetVehicleDoorBroken(vehicle, doorIndex, true)
|
||||
SetVehicleDoorBroken(vehicle, tonumber(doorIndex), true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,6 +2,7 @@ QBCore = {}
|
||||
QBCore.PlayerData = {}
|
||||
QBCore.Config = QBConfig
|
||||
QBCore.Shared = QBShared
|
||||
QBCore.ClientCallbacks = {}
|
||||
QBCore.ServerCallbacks = {}
|
||||
|
||||
exports('GetCoreObject', function()
|
||||
|
||||
+4
-4
@@ -17,11 +17,11 @@ local Translations = {
|
||||
received_paycheck = 'Has recibido tu salario de $%{value}',
|
||||
job_info = 'Trabajo: %{value} | Puesto: %{value2} | Estado: %{value3}',
|
||||
gang_info = 'Pandilla: %{value} | Puesto: %{value2}',
|
||||
on_duty = '¡Estás en servicio!',
|
||||
off_duty = '¡Estás fuera de servicio!',
|
||||
checking_ban = 'Hola %s. Estámos revisando si has sido baneado.',
|
||||
on_duty = 'Estás en servicio',
|
||||
off_duty = 'Estás fuera de servicio',
|
||||
checking_ban = 'Hola %s. Estamos revisando si has sido baneado.',
|
||||
join_server = 'Bienvenido %s a {Server Name}.',
|
||||
checking_whitelisted = 'Hola %s. Estámos revisando si estás en nuestra lista blanca.'
|
||||
checking_whitelisted = 'Hola %s. Estamos revisando si estás en nuestra lista blanca.'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+8
-2
@@ -7,7 +7,10 @@ local Translations = {
|
||||
no_access = 'Du har inte tillgång till detta kommando',
|
||||
company_too_poor = 'Din arbetsgivare är pank',
|
||||
item_not_exist = 'Objektet finns inte',
|
||||
too_heavy = 'Din inventory är full!'
|
||||
too_heavy = 'Ditt inventory är fullt!',
|
||||
duplicate_license = 'Duplicerad Rockstar Licens Funnet',
|
||||
no_valid_license = 'Ingen Giltig Rockstar Licens Hittades',
|
||||
not_whitelisted = 'Du är inte whitelistad på servern'
|
||||
},
|
||||
success = {},
|
||||
info = {
|
||||
@@ -15,7 +18,10 @@ local Translations = {
|
||||
job_info = 'Jobb: %{value} | Grad: %{value2} | Tjänst: %{value3}',
|
||||
gang_info = 'Gäng: %{value} | Grad: %{value2}',
|
||||
on_duty = 'Du är nu i tjänst!',
|
||||
off_duty = 'Du har gått ur tjänst!'
|
||||
off_duty = 'Du har gått ur tjänst!',
|
||||
checking_ban = 'Hej %s. Vi kollar ifall du är bannad.',
|
||||
join_server = 'Välkommen %s till Bygden RP.',
|
||||
checking_whitelisted = 'Hej %s. Vi kollar efter giltighet i ditt medlemskap.'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-2
@@ -103,8 +103,17 @@ RegisterNetEvent('QBCore:Server:OpenServer', function()
|
||||
end
|
||||
end)
|
||||
|
||||
-- Callbacks
|
||||
-- Callback Events --
|
||||
|
||||
-- Client Callback
|
||||
RegisterNetEvent('QBCore:Server:TriggerClientCallback', function(name, ...)
|
||||
if QBCore.ClientCallbacks[name] then
|
||||
QBCore.ClientCallbacks[name](...)
|
||||
QBCore.ClientCallbacks[name] = nil
|
||||
end
|
||||
end)
|
||||
|
||||
-- Server Callback
|
||||
RegisterNetEvent('QBCore:Server:TriggerCallback', function(name, ...)
|
||||
local src = source
|
||||
QBCore.Functions.TriggerCallback(name, src, function(...)
|
||||
@@ -204,7 +213,6 @@ end)
|
||||
|
||||
QBCore.Functions.CreateCallback('QBCore:HasItem', function(source, cb, items, amount)
|
||||
local retval = false
|
||||
if items == nil then return cb(true) end
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
if not Player then return cb(false) end
|
||||
local isTable = type(items) == 'table'
|
||||
|
||||
@@ -9,6 +9,7 @@ local function AddJob(jobName, job)
|
||||
end
|
||||
|
||||
QBCore.Shared.Jobs[jobName] = job
|
||||
|
||||
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1,'Jobs', jobName, job)
|
||||
TriggerEvent('QBCore:Server:UpdateObject')
|
||||
return true, "success"
|
||||
@@ -21,6 +22,7 @@ local function AddJobs(jobs)
|
||||
local shouldContinue = true
|
||||
local message = "success"
|
||||
local errorItem = nil
|
||||
|
||||
for key, value in pairs(jobs) do
|
||||
if type(key) ~= "string" then
|
||||
message = 'invalid_job_name'
|
||||
@@ -47,6 +49,44 @@ 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
|
||||
@@ -58,6 +98,7 @@ local function AddItem(itemName, item)
|
||||
end
|
||||
|
||||
QBCore.Shared.Items[itemName] = item
|
||||
|
||||
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Items', itemName, item)
|
||||
TriggerEvent('QBCore:Server:UpdateObject')
|
||||
return true, "success"
|
||||
@@ -86,6 +127,7 @@ local function AddItems(items)
|
||||
local shouldContinue = true
|
||||
local message = "success"
|
||||
local errorItem = nil
|
||||
|
||||
for key, value in pairs(items) do
|
||||
if type(key) ~= "string" then
|
||||
message = "invalid_item_name"
|
||||
@@ -112,16 +154,37 @@ 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"
|
||||
@@ -134,6 +197,7 @@ local function AddGangs(gangs)
|
||||
local shouldContinue = true
|
||||
local message = "success"
|
||||
local errorItem = nil
|
||||
|
||||
for key, value in pairs(gangs) do
|
||||
if type(key) ~= "string" then
|
||||
message = "invalid_gang_name"
|
||||
@@ -148,6 +212,7 @@ local function AddGangs(gangs)
|
||||
errorItem = gangs[key]
|
||||
break
|
||||
end
|
||||
|
||||
QBCore.Shared.Gangs[key] = value
|
||||
end
|
||||
|
||||
@@ -159,6 +224,44 @@ 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 function GetCoreVersion(InvokingResource)
|
||||
local resourceVersion = GetResourceMetadata(GetCurrentResourceName(), 'version')
|
||||
if InvokingResource and InvokingResource ~= '' then
|
||||
|
||||
+50
-3
@@ -52,9 +52,13 @@ function QBCore.Functions.GetPlayerByCitizenId(citizenid)
|
||||
return nil
|
||||
end
|
||||
|
||||
function QBCore.Functions.GetOfflinePlayerByCitizenId(citizenid)
|
||||
return QBCore.Player.GetOfflinePlayer(citizenid)
|
||||
end
|
||||
|
||||
function QBCore.Functions.GetPlayerByPhone(number)
|
||||
for src, _ in pairs(QBCore.Players) do
|
||||
if QBCore.Players[src].PlayerData.charinfo.phone == number then
|
||||
if QBCore.Players[src].PlayerData.charinfo.phone == tonumber(number) then
|
||||
return QBCore.Players[src]
|
||||
end
|
||||
end
|
||||
@@ -169,7 +173,8 @@ function PaycheckInterval()
|
||||
if next(QBCore.Players) then
|
||||
for _, Player in pairs(QBCore.Players) do
|
||||
if Player then
|
||||
local payment = Player.PlayerData.job.payment
|
||||
local payment = QBShared.Jobs[Player.PlayerData.job.name]['grades'][tostring(Player.PlayerData.job.grade.level)].payment
|
||||
if not payment then payment = Player.PlayerData.job.payment end
|
||||
if Player.PlayerData.job and payment > 0 and (QBShared.Jobs[Player.PlayerData.job.name].offDutyPay or Player.PlayerData.job.onduty) then
|
||||
if QBCore.Config.Money.PayCheckSociety then
|
||||
local account = exports['qb-management']:GetAccount(Player.PlayerData.job.name)
|
||||
@@ -196,8 +201,15 @@ function PaycheckInterval()
|
||||
SetTimeout(QBCore.Config.Money.PayCheckTimeOut * (60 * 1000), PaycheckInterval)
|
||||
end
|
||||
|
||||
-- Callbacks
|
||||
-- Callback Functions --
|
||||
|
||||
-- Client Callback
|
||||
function QBCore.Functions.TriggerClientCallback(name, source, cb, ...)
|
||||
QBCore.ClientCallbacks[name] = cb
|
||||
TriggerClientEvent('QBCore:Client:TriggerClientCallback', source, name, ...)
|
||||
end
|
||||
|
||||
-- Server Callback
|
||||
function QBCore.Functions.CreateCallback(name, cb)
|
||||
QBCore.ServerCallbacks[name] = cb
|
||||
end
|
||||
@@ -355,3 +367,38 @@ function QBCore.Functions.IsLicenseInUse(license)
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Utility functions
|
||||
|
||||
function QBCore.Functions.HasItem(source, items, amount)
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
if not Player then return false end
|
||||
local isTable = type(items) == 'table'
|
||||
local isArray = isTable and table.type(items) == 'array' or false
|
||||
local totalItems = #items
|
||||
local count = 0
|
||||
local kvIndex = 2
|
||||
if isTable and not isArray then
|
||||
totalItems = 0
|
||||
for _ in pairs(items) do totalItems += 1 end
|
||||
kvIndex = 1
|
||||
end
|
||||
if isTable then
|
||||
for k, v in pairs(items) do
|
||||
local itemKV = {k, v}
|
||||
local item = Player.Functions.GetItemByName(itemKV[kvIndex])
|
||||
if item and ((not amount and not isArray and item.amount >= v) or (isArray and amount and item.amount >= amount) or (not amount and isArray)) then
|
||||
count += 1
|
||||
end
|
||||
end
|
||||
if count == totalItems then
|
||||
return true
|
||||
end
|
||||
else -- Single item as string
|
||||
local item = Player.Functions.GetItemByName(items)
|
||||
if item and (not amount or (amount and item.amount >= amount)) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
QBCore = {}
|
||||
QBCore.Config = QBConfig
|
||||
QBCore.Shared = QBShared
|
||||
QBCore.ClientCallbacks = {}
|
||||
QBCore.ServerCallbacks = {}
|
||||
QBCore.UseableItems = {}
|
||||
|
||||
|
||||
+187
-54
@@ -36,12 +36,38 @@ function QBCore.Player.Login(source, citizenid, newData)
|
||||
end
|
||||
end
|
||||
|
||||
function QBCore.Player.GetOfflinePlayer(citizenid)
|
||||
if citizenid then
|
||||
local PlayerData = MySQL.Sync.prepare('SELECT * FROM players where citizenid = ?', {citizenid})
|
||||
if PlayerData then
|
||||
PlayerData.money = json.decode(PlayerData.money)
|
||||
PlayerData.job = json.decode(PlayerData.job)
|
||||
PlayerData.position = json.decode(PlayerData.position)
|
||||
PlayerData.metadata = json.decode(PlayerData.metadata)
|
||||
PlayerData.charinfo = json.decode(PlayerData.charinfo)
|
||||
if PlayerData.gang then
|
||||
PlayerData.gang = json.decode(PlayerData.gang)
|
||||
else
|
||||
PlayerData.gang = {}
|
||||
end
|
||||
|
||||
return QBCore.Player.CheckPlayerData(nil, PlayerData)
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function QBCore.Player.CheckPlayerData(source, PlayerData)
|
||||
PlayerData = PlayerData or {}
|
||||
PlayerData.source = source
|
||||
local Offline = true
|
||||
if source ~= nil then
|
||||
PlayerData.source = source
|
||||
PlayerData.license = PlayerData.license or QBCore.Functions.GetIdentifier(source, 'license')
|
||||
PlayerData.name = GetPlayerName(source)
|
||||
Offline = false
|
||||
end
|
||||
|
||||
PlayerData.citizenid = PlayerData.citizenid or QBCore.Player.CreateCitizenId()
|
||||
PlayerData.license = PlayerData.license or QBCore.Functions.GetIdentifier(source, 'license')
|
||||
PlayerData.name = GetPlayerName(source)
|
||||
PlayerData.cid = PlayerData.cid or 1
|
||||
PlayerData.money = PlayerData.money or {}
|
||||
PlayerData.optin = PlayerData.optin or true
|
||||
@@ -133,7 +159,7 @@ function QBCore.Player.CheckPlayerData(source, PlayerData)
|
||||
-- Other
|
||||
PlayerData.position = PlayerData.position or QBConfig.DefaultSpawn
|
||||
PlayerData = QBCore.Player.LoadInventory(PlayerData)
|
||||
QBCore.Player.CreatePlayer(PlayerData)
|
||||
return QBCore.Player.CreatePlayer(PlayerData, Offline)
|
||||
end
|
||||
|
||||
-- On player logout
|
||||
@@ -149,12 +175,14 @@ end
|
||||
-- Don't touch any of this unless you know what you are doing
|
||||
-- Will cause major issues!
|
||||
|
||||
function QBCore.Player.CreatePlayer(PlayerData)
|
||||
function QBCore.Player.CreatePlayer(PlayerData, Offline)
|
||||
local self = {}
|
||||
self.Functions = {}
|
||||
self.PlayerData = PlayerData
|
||||
self.Offline = Offline
|
||||
|
||||
function self.Functions.UpdatePlayerData(dontUpdateChat)
|
||||
if self.Offline then return end -- Unsupported for Offline Players
|
||||
TriggerClientEvent('QBCore:Player:SetPlayerData', self.PlayerData.source, self.PlayerData)
|
||||
if not dontUpdateChat then
|
||||
QBCore.Commands.Refresh(self.PlayerData.source)
|
||||
@@ -183,9 +211,13 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
self.PlayerData.job.payment = 30
|
||||
self.PlayerData.job.isboss = false
|
||||
end
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job)
|
||||
TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job)
|
||||
TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job)
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
@@ -207,8 +239,12 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
self.PlayerData.gang.grade.level = 0
|
||||
self.PlayerData.gang.isboss = false
|
||||
end
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerClientEvent('QBCore:Client:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerClientEvent('QBCore:Client:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang)
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
@@ -238,13 +274,17 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
if amount < 0 then return end
|
||||
if not self.PlayerData.money[moneytype] then return false end
|
||||
self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] + amount
|
||||
self.Functions.UpdatePlayerData()
|
||||
if amount > 100000 then
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true)
|
||||
else
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
if amount > 100000 then
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true)
|
||||
else
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
|
||||
end
|
||||
TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, false)
|
||||
end
|
||||
TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, false)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
@@ -262,16 +302,20 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
end
|
||||
end
|
||||
self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] - amount
|
||||
self.Functions.UpdatePlayerData()
|
||||
if amount > 100000 then
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true)
|
||||
else
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
|
||||
end
|
||||
TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, true)
|
||||
if moneytype == 'bank' then
|
||||
TriggerClientEvent('qb-phone:client:RemoveBankMoney', self.PlayerData.source, amount)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
if amount > 100000 then
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true)
|
||||
else
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
|
||||
end
|
||||
TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, true)
|
||||
if moneytype == 'bank' then
|
||||
TriggerClientEvent('qb-phone:client:RemoveBankMoney', self.PlayerData.source, amount)
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
@@ -282,8 +326,12 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
if amount < 0 then return false end
|
||||
if not self.PlayerData.money[moneytype] then return false end
|
||||
self.PlayerData.money[moneytype] = amount
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'SetMoney', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') set, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'SetMoney', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') set, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
@@ -296,7 +344,7 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
function self.Functions.AddItem(item, amount, slot, info)
|
||||
local totalWeight = QBCore.Player.GetTotalWeight(self.PlayerData.items)
|
||||
local itemInfo = QBCore.Shared.Items[item:lower()]
|
||||
if not itemInfo then
|
||||
if not itemInfo and not self.Offline then
|
||||
TriggerClientEvent('QBCore:Notify', self.PlayerData.source, Lang:t('error.item_not_exist'), 'error')
|
||||
return
|
||||
end
|
||||
@@ -310,25 +358,37 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
if (totalWeight + (itemInfo['weight'] * amount)) <= QBCore.Config.Player.MaxWeight then
|
||||
if (slot and self.PlayerData.items[slot]) and (self.PlayerData.items[slot].name:lower() == item:lower()) and (itemInfo['type'] == 'item' and not itemInfo['unique']) then
|
||||
self.PlayerData.items[slot].amount = self.PlayerData.items[slot].amount + amount
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** got item: [slot:' .. slot .. '], itemname: ' .. self.PlayerData.items[slot].name .. ', added amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[slot].amount)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** got item: [slot:' .. slot .. '], itemname: ' .. self.PlayerData.items[slot].name .. ', added amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[slot].amount)
|
||||
end
|
||||
|
||||
return true
|
||||
elseif not itemInfo['unique'] and slot or slot and self.PlayerData.items[slot] == nil then
|
||||
self.PlayerData.items[slot] = { name = itemInfo['name'], amount = amount, info = info or '', label = itemInfo['label'], description = itemInfo['description'] or '', weight = itemInfo['weight'], type = itemInfo['type'], unique = itemInfo['unique'], useable = itemInfo['useable'], image = itemInfo['image'], shouldClose = itemInfo['shouldClose'], slot = slot, combinable = itemInfo['combinable'] }
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** got item: [slot:' .. slot .. '], itemname: ' .. self.PlayerData.items[slot].name .. ', added amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[slot].amount)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** got item: [slot:' .. slot .. '], itemname: ' .. self.PlayerData.items[slot].name .. ', added amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[slot].amount)
|
||||
end
|
||||
|
||||
return true
|
||||
elseif itemInfo['unique'] or (not slot or slot == nil) or itemInfo['type'] == 'weapon' then
|
||||
for i = 1, QBConfig.Player.MaxInvSlots, 1 do
|
||||
if self.PlayerData.items[i] == nil then
|
||||
self.PlayerData.items[i] = { name = itemInfo['name'], amount = amount, info = info or '', label = itemInfo['label'], description = itemInfo['description'] or '', weight = itemInfo['weight'], type = itemInfo['type'], unique = itemInfo['unique'], useable = itemInfo['useable'], image = itemInfo['image'], shouldClose = itemInfo['shouldClose'], slot = i, combinable = itemInfo['combinable'] }
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** got item: [slot:' .. i .. '], itemname: ' .. self.PlayerData.items[i].name .. ', added amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[i].amount)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** got item: [slot:' .. i .. '], itemname: ' .. self.PlayerData.items[i].name .. ', added amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[i].amount)
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
elseif not self.Offline then
|
||||
TriggerClientEvent('QBCore:Notify', self.PlayerData.source, Lang:t('error.too_heavy'), 'error')
|
||||
end
|
||||
return false
|
||||
@@ -340,13 +400,21 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
if slot then
|
||||
if self.PlayerData.items[slot].amount > amount then
|
||||
self.PlayerData.items[slot].amount = self.PlayerData.items[slot].amount - amount
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. slot .. '], itemname: ' .. self.PlayerData.items[slot].name .. ', removed amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[slot].amount)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. slot .. '], itemname: ' .. self.PlayerData.items[slot].name .. ', removed amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[slot].amount)
|
||||
end
|
||||
|
||||
return true
|
||||
elseif self.PlayerData.items[slot].amount == amount then
|
||||
self.PlayerData.items[slot] = nil
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. slot .. '], itemname: ' .. item .. ', removed amount: ' .. amount .. ', item removed')
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. slot .. '], itemname: ' .. item .. ', removed amount: ' .. amount .. ', item removed')
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
else
|
||||
@@ -356,13 +424,21 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
for _, _slot in pairs(slots) do
|
||||
if self.PlayerData.items[_slot].amount > amountToRemove then
|
||||
self.PlayerData.items[_slot].amount = self.PlayerData.items[_slot].amount - amountToRemove
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. _slot .. '], itemname: ' .. self.PlayerData.items[_slot].name .. ', removed amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[_slot].amount)
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. _slot .. '], itemname: ' .. self.PlayerData.items[_slot].name .. ', removed amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[_slot].amount)
|
||||
end
|
||||
|
||||
return true
|
||||
elseif self.PlayerData.items[_slot].amount == amountToRemove then
|
||||
self.PlayerData.items[_slot] = nil
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. _slot .. '], itemname: ' .. item .. ', removed amount: ' .. amount .. ', item removed')
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. _slot .. '], itemname: ' .. item .. ', removed amount: ' .. amount .. ', item removed')
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
end
|
||||
@@ -373,14 +449,20 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
|
||||
function self.Functions.SetInventory(items, dontUpdateChat)
|
||||
self.PlayerData.items = items
|
||||
self.Functions.UpdatePlayerData(dontUpdateChat)
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'SetInventory', 'blue', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** items set: ' .. json.encode(items))
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData(dontUpdateChat)
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'SetInventory', 'blue', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** items set: ' .. json.encode(items))
|
||||
end
|
||||
end
|
||||
|
||||
function self.Functions.ClearInventory()
|
||||
self.PlayerData.items = {}
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'ClearInventory', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** inventory cleared')
|
||||
|
||||
if not self.Offline then
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'ClearInventory', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** inventory cleared')
|
||||
end
|
||||
end
|
||||
|
||||
function self.Functions.GetItemByName(item)
|
||||
@@ -425,19 +507,28 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
end
|
||||
|
||||
function self.Functions.Save()
|
||||
QBCore.Player.Save(self.PlayerData.source)
|
||||
if self.Offline then
|
||||
QBCore.Player.SaveOffline(self.PlayerData)
|
||||
else
|
||||
QBCore.Player.Save(self.PlayerData.source)
|
||||
end
|
||||
end
|
||||
|
||||
function self.Functions.Logout()
|
||||
if self.Offline then return end -- Unsupported for Offline Players
|
||||
QBCore.Player.Logout(self.PlayerData.source)
|
||||
end
|
||||
|
||||
QBCore.Players[self.PlayerData.source] = self
|
||||
QBCore.Player.Save(self.PlayerData.source)
|
||||
|
||||
-- At this point we are safe to emit new instance to third party resource for load handling
|
||||
TriggerEvent('QBCore:Server:PlayerLoaded', self)
|
||||
self.Functions.UpdatePlayerData()
|
||||
if self.Offline then
|
||||
return self
|
||||
else
|
||||
QBCore.Players[self.PlayerData.source] = self
|
||||
QBCore.Player.Save(self.PlayerData.source)
|
||||
|
||||
-- At this point we are safe to emit new instance to third party resource for load handling
|
||||
TriggerEvent('QBCore:Server:PlayerLoaded', self)
|
||||
self.Functions.UpdatePlayerData()
|
||||
end
|
||||
end
|
||||
|
||||
-- Save player info to database (make sure citizenid is the primary key in your database)
|
||||
@@ -466,6 +557,27 @@ function QBCore.Player.Save(source)
|
||||
end
|
||||
end
|
||||
|
||||
function QBCore.Player.SaveOffline(PlayerData)
|
||||
if PlayerData then
|
||||
MySQL.Async.insert('INSERT INTO players (citizenid, cid, license, name, money, charinfo, job, gang, position, metadata) VALUES (:citizenid, :cid, :license, :name, :money, :charinfo, :job, :gang, :position, :metadata) ON DUPLICATE KEY UPDATE cid = :cid, name = :name, money = :money, charinfo = :charinfo, job = :job, gang = :gang, position = :position, metadata = :metadata', {
|
||||
citizenid = PlayerData.citizenid,
|
||||
cid = tonumber(PlayerData.cid),
|
||||
license = PlayerData.license,
|
||||
name = PlayerData.name,
|
||||
money = json.encode(PlayerData.money),
|
||||
charinfo = json.encode(PlayerData.charinfo),
|
||||
job = json.encode(PlayerData.job),
|
||||
gang = json.encode(PlayerData.gang),
|
||||
position = json.encode(PlayerData.position),
|
||||
metadata = json.encode(PlayerData.metadata)
|
||||
})
|
||||
QBCore.Player.SaveOfflineInventory(PlayerData)
|
||||
QBCore.ShowSuccess(GetCurrentResourceName(), PlayerData.name .. ' OFFLINE PLAYER SAVED!')
|
||||
else
|
||||
QBCore.ShowError(GetCurrentResourceName(), 'ERROR QBCORE.PLAYER.SAVEOFFLINE - PLAYERDATA IS EMPTY!')
|
||||
end
|
||||
end
|
||||
|
||||
-- Delete character
|
||||
|
||||
local playertables = { -- Add tables as needed
|
||||
@@ -573,6 +685,27 @@ function QBCore.Player.SaveInventory(source)
|
||||
end
|
||||
end
|
||||
|
||||
function QBCore.Player.SaveOfflineInventory(PlayerData)
|
||||
local items = PlayerData.items
|
||||
local ItemsJson = {}
|
||||
if items and next(items) then
|
||||
for slot, item in pairs(items) do
|
||||
if items[slot] then
|
||||
ItemsJson[#ItemsJson+1] = {
|
||||
name = item.name,
|
||||
amount = item.amount,
|
||||
info = item.info,
|
||||
type = item.type,
|
||||
slot = slot,
|
||||
}
|
||||
end
|
||||
end
|
||||
MySQL.Async.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { json.encode(ItemsJson), PlayerData.citizenid })
|
||||
else
|
||||
MySQL.Async.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { '[]', PlayerData.citizenid })
|
||||
end
|
||||
end
|
||||
|
||||
-- Util Functions
|
||||
|
||||
function QBCore.Player.GetTotalWeight(items)
|
||||
|
||||
Reference in New Issue
Block a user