diff --git a/server/functions.lua b/server/functions.lua index a7f203a4e..25b15a5e8 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -729,6 +729,66 @@ function QBCore.Functions.PrepForSQL(source, data, pattern) return true end +---Do a money transaction between players +---@param sourcecid string +---@param sourcemoneytype string -- Only money types in QBConfig.Money.MoneyTypes +---@param targetcid string +---@param targetmoneytype string -- Only money types in QBConfig.Money.MoneyTypes +---@param amount number +---@param reason string +---@return boolean +function QBCore.Functions.TransferMoney(sourcecid, sourcemoneytype, targetcid, targetmoneytype, amount, reason) + local SourcePlayer = QBCore.Functions.GetPlayerByCitizenId(sourcecid) or QBCore.Functions.GetOfflinePlayerByCitizenId(sourcecid) + local TargetPlayer = QBCore.Functions.GetPlayerByCitizenId(targetcid) or QBCore.Functions.GetOfflinePlayerByCitizenId(targetcid) + + if not SourcePlayer or not TargetPlayer then return false end + + if not tonumber(amount) then return false end + amount = tonumber(amount) or 0 + if tonumber(amount) <= 0 then return true end + + local errorOnLast = false + + local offSource = SourcePlayer.PlayerData.source == nil + local offTarget = TargetPlayer.PlayerData.source == nil + + if not SourcePlayer.Functions.RemoveMoney(amount, sourcemoneytype, reason) then return false end + if not TargetPlayer.Functions.AddMoney(amount, targetmoneytype, reason) then errorOnLast = true end + + if errorOnLast then + SourcePlayer.Functions.AddMoney(amount, sourcemoneytype, reason) + return false + end + + if not offSource then + TriggerClientEvent('hud:client:OnMoneyChange', SourcePlayer.PlayerData.source, sourcemoneytype, true) + TriggerClientEvent('QBCore:Client:OnMoneyChange', SourcePlayer.PlayerData.source, sourcemoneytype, amount, 'transfer', reason) + TriggerEvent('QBCore:Server:OnMoneyChange', SourcePlayer.PlayerData.source, sourcemoneytype, amount, 'transfer', reason) + else + SourcePlayer.Functions.Save() + end + + if not offTarget then + TriggerClientEvent('hud:client:OnMoneyChange', TargetPlayer.PlayerData.source, targetmoneytype, true) + TriggerClientEvent('QBCore:Client:OnMoneyChange', TargetPlayer.PlayerData.source, targetmoneytype, amount, 'transfer', reason) + TriggerEvent('QBCore:Server:OnMoneyChange', TargetPlayer.PlayerData.source, targetmoneytype, amount, 'transfer', reason) + else + TargetPlayer.Functions.Save() + end + + if not offSource and not offTarget then + TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'TransferMoney', 'yellow', '**' .. sourcecid .. '** gived $' .. amount .. ' (' .. sourcemoneytype .. ') to **' .. targetcid .. '** reason: ' .. reason .. ' | (Both offline)') + elseif not offTarget and offSource then + TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'TransferMoney', 'yellow', '**' .. GetPlayerName(SourcePlayer.PlayerData.source) .. ' (citizenid: ' .. SourcePlayer.PlayerData.citizenid .. ' | id: ' .. SourcePlayer.PlayerData.source .. ')**, new balance: ' .. SourcePlayer.PlayerData.money[sourcemoneytype] .. ' gived $' .. amount .. ' (' .. sourcemoneytype .. ') to **' .. targetcid .. ' in ('..targetmoneytype..') reason: ' .. reason .. ' | (Target offline)') + elseif not offSource and offTarget then + TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'TransferMoney', 'yellow', '**' .. sourcecid .. '** gived $' .. amount .. ' (' .. sourcemoneytype .. ') to **' .. GetPlayerName(TargetPlayer.PlayerData.source) .. ' (citizenid: ' .. TargetPlayer.PlayerData.citizenid .. ' | id: ' .. TargetPlayer.PlayerData.source .. ')**, new balance: ' .. TargetPlayer.PlayerData.money[targetmoneytype] .. ' in ('..targetmoneytype..') reason: ' .. reason .. ' | (Source offline)') + elseif offSource and offTarget then + TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'TransferMoney', 'yellow', '**' .. GetPlayerName(SourcePlayer.PlayerData.source) .. ' (citizenid: ' .. SourcePlayer.PlayerData.citizenid .. ' | id: ' .. SourcePlayer.PlayerData.source .. ')**, new balance: ' .. SourcePlayer.PlayerData.money[sourcemoneytype] .. ' gived $' .. amount .. ' (' .. sourcemoneytype .. ') to **' .. GetPlayerName(TargetPlayer.PlayerData.source) .. ' (citizenid: ' .. TargetPlayer.PlayerData.citizenid .. ' | id: ' .. TargetPlayer.PlayerData.source .. ')**, new balance: ' .. TargetPlayer.PlayerData.money[targetmoneytype] .. ' in ('..targetmoneytype..') reason: ' .. reason) + end + + return true +end + for functionName, func in pairs(QBCore.Functions) do if type(func) == 'function' then exports(functionName, func) diff --git a/server/player.lua b/server/player.lua index 4f73c0d30..21b45a9c0 100644 --- a/server/player.lua +++ b/server/player.lua @@ -387,6 +387,10 @@ function QBCore.Player.CreatePlayer(PlayerData, Offline) return true end + function self.Functions.TransferMoneyTo(sourcemoneytype, targetcid, targetmoneytype, amount, reason) + return QBCore.Functions.TransferMoney(self.PlayerData.source, sourcemoneytype, targetcid, targetmoneytype, amount, reason) + end + function self.Functions.GetMoney(moneytype) if not moneytype then return false end moneytype = moneytype:lower()