From dc97e2f7b0a565a47978a217b858109069d33ad5 Mon Sep 17 00:00:00 2001 From: MaximusR9 <49029210+MaximusR9@users.noreply.github.com> Date: Mon, 25 Apr 2022 08:44:31 +0500 Subject: [PATCH 01/14] Add Remove and Update export functions Added remove and update functions to dynamically remove or update jobs/items/gangs without having to restart the server. --- server/exports.lua | 122 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/server/exports.lua b/server/exports.lua index 2cfed5a..0a1e8aa 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -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" @@ -70,6 +111,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" @@ -96,16 +138,56 @@ 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 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) + -- 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" @@ -118,6 +200,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" @@ -132,6 +215,7 @@ local function AddGangs(gangs) errorItem = gangs[key] break end + QBCore.Shared.Gangs[key] = value end @@ -143,6 +227,44 @@ end QBCore.Functions.AddGangs = AddGangs exports('AddGangs', AddGangs) +-- Single Remove Gang +local function RemoveGang(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] = 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 From 1511cade64d2ff79ce081e6ccecbb9ffe8fe812d Mon Sep 17 00:00:00 2001 From: Viktor <35453587+LifeGoal@users.noreply.github.com> Date: Thu, 28 Apr 2022 15:11:14 +0100 Subject: [PATCH 02/14] Update sv.lua Added missing phrases and changed some grammar --- locale/sv.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/locale/sv.lua b/locale/sv.lua index e1bd89f..021ef29 100644 --- a/locale/sv.lua +++ b/locale/sv.lua @@ -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 full!' + duplicate_license = 'Duplicerad Rockstar Licens Funnet', + no_valid_license = 'Ingen Giltig Rockstar Licens Hittades', + not_whitelisted = 'Du är inte whitelistad på servern' }, success = {}, info = { @@ -16,6 +19,9 @@ local Translations = { gang_info = 'Gäng: %{value} | Grad: %{value2}', on_duty = 'Du är nu i 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.' } } From 46ba99291c9638c6ec50a946db882d07ae76c356 Mon Sep 17 00:00:00 2001 From: ItsANoBrainer Date: Wed, 4 May 2022 21:18:38 -0400 Subject: [PATCH 03/14] [Feature] Client Callbacks Creates support for utilization of Client Callbacks. --- client/events.lua | 24 +++++++++++++++++------- client/functions.lua | 15 +++++++++++++++ client/main.lua | 1 + server/events.lua | 15 ++++++++++++--- server/functions.lua | 9 ++++++++- server/main.lua | 1 + 6 files changed, 54 insertions(+), 11 deletions(-) diff --git a/client/events.lua b/client/events.lua index df2adec..673094a 100644 --- a/client/events.lua +++ b/client/events.lua @@ -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) @@ -170,6 +170,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](...) @@ -177,10 +191,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) diff --git a/client/functions.lua b/client/functions.lua index 75e937b..ad525a8 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -117,11 +117,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({ diff --git a/client/main.lua b/client/main.lua index efa365b..e11a124 100644 --- a/client/main.lua +++ b/client/main.lua @@ -2,6 +2,7 @@ QBCore = {} QBCore.PlayerData = {} QBCore.Config = QBConfig QBCore.Shared = QBShared +QBCore.ClientCallbacks = {} QBCore.ServerCallbacks = {} exports('GetCoreObject', function() diff --git a/server/events.lua b/server/events.lua index 65d3268..690ff06 100644 --- a/server/events.lua +++ b/server/events.lua @@ -57,13 +57,13 @@ local function onPlayerConnecting(name, setKickReason, deferrals) deferrals.update(string.format(Lang:t('info.join_server'), name)) if not license then - deferrals.done(Lang:t('error.no_valid_license')) + deferrals.done(Lang:t('error.no_valid_license')) elseif isBanned then deferrals.done(Reason) elseif isLicenseAlreadyInUse and QBCore.Config.Server.CheckDuplicateLicense then deferrals.done(Lang:t('error.duplicate_license')) elseif isWhitelist and not whitelisted then - deferrals.done(Lang:t('error.not_whitelisted')) + deferrals.done(Lang:t('error.not_whitelisted')) else deferrals.done() if QBCore.Config.Server.UseConnectQueue then @@ -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(...) diff --git a/server/functions.lua b/server/functions.lua index 95b302d..4cab087 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -196,8 +196,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 diff --git a/server/main.lua b/server/main.lua index 41c0c43..206e6dd 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,6 +1,7 @@ QBCore = {} QBCore.Config = QBConfig QBCore.Shared = QBShared +QBCore.ClientCallbacks = {} QBCore.ServerCallbacks = {} QBCore.UseableItems = {} From acb313c34d5318624edbe93f3940d8f7ae8859cc Mon Sep 17 00:00:00 2001 From: mmoftah97 Date: Sun, 15 May 2022 14:18:15 -0400 Subject: [PATCH 04/14] FEAT: Allow getting offline Player object --- server/functions.lua | 4 + server/player.lua | 251 +++++++++++++++++++++++++++++++++---------- 2 files changed, 196 insertions(+), 59 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index 1b9b16f..7dded72 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -52,6 +52,10 @@ function QBCore.Functions.GetPlayerByCitizenId(citizenid) return nil end +function QBCore.Functions.GetOfflinePlayerByCitizenId(citizenid) + return QBCore.Player.GetOfflineUser(citizenid) +end + function QBCore.Functions.GetPlayerByPhone(number) for src, _ in pairs(QBCore.Players) do if QBCore.Players[src].PlayerData.charinfo.phone == number then diff --git a/server/player.lua b/server/player.lua index d14ca34..40efffe 100644 --- a/server/player.lua +++ b/server/player.lua @@ -36,12 +36,38 @@ function QBCore.Player.Login(source, citizenid, newData) end end +function QBCore.Player.GetOfflineUser(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 @@ -132,7 +158,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 @@ -148,12 +174,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) @@ -181,9 +209,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 @@ -205,8 +237,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 @@ -236,13 +272,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 @@ -260,16 +300,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 @@ -280,8 +324,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 @@ -294,7 +342,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 @@ -308,25 +356,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 @@ -338,13 +398,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 @@ -352,15 +420,23 @@ function QBCore.Player.CreatePlayer(PlayerData) local amountToRemove = amount if slots then 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) - 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 self.PlayerData.items[_slot].amount > amountToRemove then + self.PlayerData.items[_slot].amount = self.PlayerData.items[_slot].amount - amountToRemove + + 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 + + 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 @@ -371,14 +447,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) @@ -423,19 +505,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) @@ -464,6 +555,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 @@ -571,6 +683,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) From 7c57f6a817cefb8510a0e32b82500a18a2f4e688 Mon Sep 17 00:00:00 2001 From: mmoftah97 Date: Mon, 6 Jun 2022 12:42:00 -0400 Subject: [PATCH 05/14] Address PR Comments. --- server/functions.lua | 2 +- server/player.lua | 68 ++++++++++++++++++++++---------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index 7dded72..3574136 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -53,7 +53,7 @@ function QBCore.Functions.GetPlayerByCitizenId(citizenid) end function QBCore.Functions.GetOfflinePlayerByCitizenId(citizenid) - return QBCore.Player.GetOfflineUser(citizenid) + return QBCore.Player.GetOfflinePlayer(citizenid) end function QBCore.Functions.GetPlayerByPhone(number) diff --git a/server/player.lua b/server/player.lua index 40efffe..57fbd6b 100644 --- a/server/player.lua +++ b/server/player.lua @@ -36,35 +36,35 @@ function QBCore.Player.Login(source, citizenid, newData) end end -function QBCore.Player.GetOfflineUser(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 +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) + return QBCore.Player.CheckPlayerData(nil, PlayerData) + end end - end - return nil + return nil end function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData = PlayerData or {} 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 + 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() @@ -420,22 +420,22 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline) local amountToRemove = amount if slots then 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 + if self.PlayerData.items[_slot].amount > amountToRemove then + self.PlayerData.items[_slot].amount = self.PlayerData.items[_slot].amount - amountToRemove - 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 + 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 + return true + elseif self.PlayerData.items[_slot].amount == amountToRemove then + self.PlayerData.items[_slot] = nil - 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 + 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 From ee30ce7e69368676fc4718ecc1037e9936b89023 Mon Sep 17 00:00:00 2001 From: Viktor <35453587+LifeGoal@users.noreply.github.com> Date: Thu, 16 Jun 2022 12:52:52 +0100 Subject: [PATCH 06/14] Fixed problems --- locale/sv.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/sv.lua b/locale/sv.lua index 021ef29..d43e289 100644 --- a/locale/sv.lua +++ b/locale/sv.lua @@ -7,7 +7,7 @@ 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 = 'Ditt 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' @@ -18,7 +18,7 @@ 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.' From b726a0cb0c120934fcc94b686c85b293342678e9 Mon Sep 17 00:00:00 2001 From: MaximusR9 <49029210+MaximusR9@users.noreply.github.com> Date: Thu, 16 Jun 2022 18:43:07 +0500 Subject: [PATCH 07/14] Update exports.lua --- server/exports.lua | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/server/exports.lua b/server/exports.lua index 17af383..521ebcf 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -173,25 +173,6 @@ end QBCore.Functions.RemoveItem = RemoveItem exports('RemoveItem', RemoveItem) --- 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) - -- Single Add Gang local function AddGang(gangName, gang) if type(gangName) ~= "string" then @@ -244,7 +225,7 @@ QBCore.Functions.AddGangs = AddGangs exports('AddGangs', AddGangs) -- Single Remove Gang -local function RemoveGang(gangName, gang) +local function RemoveGang(gangName) if type(gangName) ~= "string" then return false, "invalid_gang_name" end From 3f04db2df0dce1359497f4453bf89088d231dba7 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Thu, 16 Jun 2022 11:45:32 -0500 Subject: [PATCH 08/14] Update events.lua --- server/events.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/server/events.lua b/server/events.lua index 1c17415..d2d4fc8 100644 --- a/server/events.lua +++ b/server/events.lua @@ -213,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' From 483f14d66a6d66beac6780e301a0c86c207f386e Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 17 Jun 2022 01:09:50 +0200 Subject: [PATCH 09/14] feat(client/functions): client side hasitem check --- client/functions.lua | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/client/functions.lua b/client/functions.lua index 1744593..60df9f2 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -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 From cc0cf6a942fc3568d79779f02afc139fe990c782 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 17 Jun 2022 01:10:16 +0200 Subject: [PATCH 10/14] feat(server/functions): server side hasitem check --- server/functions.lua | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/server/functions.lua b/server/functions.lua index aaf0c45..a81004d 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -366,3 +366,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 From bb555091cab64265bba87251460dc7767aae8686 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Fri, 17 Jun 2022 00:19:17 -0500 Subject: [PATCH 11/14] Update payment when changed in shared --- server/functions.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/functions.lua b/server/functions.lua index aaf0c45..bbb5953 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -173,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) From f9161afe1a1ae38f23dbe490199642755c410b26 Mon Sep 17 00:00:00 2001 From: Jonas Suter Date: Sat, 18 Jun 2022 09:51:36 +0200 Subject: [PATCH 12/14] fixed wrong type --- client/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/functions.lua b/client/functions.lua index 1744593..b3673c1 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -662,7 +662,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 From bb03c704580c376e8a9830b8eecabb74891d1324 Mon Sep 17 00:00:00 2001 From: AnthoHansen <62178203+Antho7Twitch@users.noreply.github.com> Date: Sat, 18 Jun 2022 14:01:12 +0200 Subject: [PATCH 13/14] fix(es locale) --- locale/es.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/es.lua b/locale/es.lua index 183cacf..042a7ac 100644 --- a/locale/es.lua +++ b/locale/es.lua @@ -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.' } } From cd20d2b791580747333d18ce26fb4f94b007d4dd Mon Sep 17 00:00:00 2001 From: TheHorizon-Fivem <99117463+TheHorizon-Fivem@users.noreply.github.com> Date: Mon, 20 Jun 2022 19:48:18 +0200 Subject: [PATCH 14/14] phone issue a fix for the phone issue https://github.com/qbcore-framework/qb-phone/issues/306 fixed by https://github.com/peppinoita but he didnt make a pull request for it --- server/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/functions.lua b/server/functions.lua index 59b3e16..cb2943c 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -58,7 +58,7 @@ 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