function self.Functions.AddMoney(moneytype, amount, reason)
reason = reason or 'unknown'
moneytype = moneytype:lower()
amount = tonumber(amount)
if amount < 0 then return end
if not self.PlayerData.money[moneytype] then return false end
local typ = exports['SA-Money-v2']:MoneyChecker(moneytype)
if typ then
if self.PlayerData.money[moneytype] == self.PlayerData.money[typ] then
exports['SA-Money-v2']:AddMoney(PlayerData, amount, reason, typ)
end
else
self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] + amount
end
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)
TriggerClientEvent('QBCore:Client:OnMoneyChange', self.PlayerData.source, moneytype, amount, 'add', reason)
TriggerEvent('QBCore:Server:OnMoneyChange', self.PlayerData.source, moneytype, amount, 'add', reason)
end
return true
end
function self.Functions.RemoveMoney(moneytype, amount, reason)
reason = reason or 'unknown'
moneytype = moneytype:lower()
amount = tonumber(amount)
if amount < 0 then return end
if not self.PlayerData.money[moneytype] then return false end
for _, mtype in pairs(QBCore.Config.Money.DontAllowMinus) do
if mtype == moneytype then
if (self.PlayerData.money[moneytype] - amount) < 0 then
return false
end
end
end
local typ = exports['SA-Money-v2']:MoneyChecker(moneytype)
if typ then
if self.PlayerData.money[moneytype] == self.PlayerData.money[typ] then
exports['SA-Money-v2']:RemoveMoney(PlayerData, amount, reason, typ)
end
else
self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] - amount
end
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
TriggerClientEvent('QBCore:Client:OnMoneyChange', self.PlayerData.source, moneytype, amount, 'remove', reason)
TriggerEvent('QBCore:Server:OnMoneyChange', self.PlayerData.source, moneytype, amount, 'remove', reason)
end
return true
end
function self.Functions.SetMoney(moneytype, amount, reason)
reason = reason or 'unknown'
moneytype = moneytype:lower()
amount = tonumber(amount)
if amount < 0 then return false end
if not self.PlayerData.money[moneytype] then return false end
local difference = amount - self.PlayerData.money[moneytype]
self.PlayerData.money[moneytype] = amount
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)
TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, math.abs(difference), difference < 0)
TriggerClientEvent('QBCore:Client:OnMoneyChange', self.PlayerData.source, moneytype, amount, 'set', reason)
TriggerEvent('QBCore:Server:OnMoneyChange', self.PlayerData.source, moneytype, amount, 'set', reason)
end
return true
end
function self.Functions.GetMoney(moneytype)
exports['SA-Money-v2']:GetCash(PlayerData.source, moneytype)
if not moneytype then return false end
moneytype = moneytype:lower()
return self.PlayerData.money[moneytype]
end
local function emitMoneyEvents(source, playerMoney, moneyType, amount, actionType, reason, difference)
local isSet = actionType == 'set'
local isRemove = actionType == 'remove'
TriggerClientEvent('hud:client:OnMoneyChange', source, moneyType, isSet and math.abs(difference) or amount, isSet and difference < 0 or isRemove, reason)
TriggerClientEvent('QBCore:Client:OnMoneyChange', source, moneyType, amount, actionType, reason)
TriggerEvent('QBCore:Server:OnMoneyChange', source, moneyType, amount, actionType, reason)
if moneyType == 'bank' and isRemove then
TriggerClientEvent('qb-phone:client:RemoveBankMoney', source, amount)
end
-- Comment this function VV
--[[ local oxMoneyType = moneyType == 'cash' and 'money' or moneyType
if accountsAsItems[oxMoneyType] then
exports.ox_inventory:SetItem(source, oxMoneyType, playerMoney[moneyType])
end ]]
end
function AddMoney(identifier, moneyType, amount, reason)
local player = type(identifier) == 'string' and (GetPlayerByCitizenId(identifier) or GetOfflinePlayer(identifier)) or GetPlayer(identifier)
if not player then return false end
reason = reason or 'unknown'
amount = qbx.math.round(tonumber(amount) --[[@as number]])
if amount < 0 or not player.PlayerData.money[moneyType] then return false end
if not triggerEventHooks('addMoney', {
source = player.PlayerData.source,
moneyType = moneyType,
amount = amount
}) then return false end
local typ = exports['SA-Money-v2']:MoneyChecker(moneyType)
if typ then
if player.PlayerData.money[moneyType] == player.PlayerData.money[typ] then
exports['SA-Money-v2']:AddMoney(player.PlayerData, amount, reason, typ)
end
else
player.PlayerData.money[moneyType] += amount
end
if not player.Offline then
UpdatePlayerData(identifier)
local tags = amount > 100000 and config.logging.role or nil
local resource = GetInvokingResource() or cache.resource
logger.log({
source = resource,
webhook = config.logging.webhook['playermoney'],
event = 'AddMoney',
color = 'lightgreen',
tags = tags,
message = ('**%s (citizenid: %s | id: %s)** $%s (%s) added, new %s balance: $%s reason: %s'):format(GetPlayerName(player.PlayerData.source), player.PlayerData.citizenid, player.PlayerData.source, amount, moneyType, moneyType, player.PlayerData.money[moneyType], reason),
--oxLibTags = ('script:%s,playerName:%s,citizenId:%s,playerSource:%s,amount:%s,moneyType:%s,newBalance:%s,reason:%s'):format(resource, GetPlayerName(player.PlayerData.source), player.PlayerData.citizenid, player.PlayerData.source, amount, moneyType, player.PlayerData.money[moneyType], reason)
})
emitMoneyEvents(player.PlayerData.source, player.PlayerData.money, moneyType, amount, 'add', reason)
end
return true
end
exports('AddMoney', AddMoney)
---@param identifier Source | string
---@param moneyType MoneyType
---@param amount number
---@param reason? string
---@return boolean success if money was removed
function RemoveMoney(identifier, moneyType, amount, reason)
local player = type(identifier) == 'string' and (GetPlayerByCitizenId(identifier) or GetOfflinePlayer(identifier)) or GetPlayer(identifier)
if not player then return false end
reason = reason or 'unknown'
amount = qbx.math.round(tonumber(amount) --[[@as number]])
if amount < 0 or not player.PlayerData.money[moneyType] then return false end
if not triggerEventHooks('removeMoney', {
source = player.PlayerData.source,
moneyType = moneyType,
amount = amount
}) then return false end
for _, mType in pairs(config.money.dontAllowMinus) do
if mType == moneyType then
if (player.PlayerData.money[moneyType] - amount) < 0 then
return false
end
end
end
local typ = exports['SA-Money-v2']:MoneyChecker(moneyType)
if typ then
if player.PlayerData.money[moneyType] == player.PlayerData.money[typ] then
exports['SA-Money-v2']:RemoveMoney(player.PlayerData, amount, reason, typ)
end
else
player.PlayerData.money[moneyType] -= amount
end
if not player.Offline then
UpdatePlayerData(identifier)
local tags = amount > 100000 and config.logging.role or nil
local resource = GetInvokingResource() or cache.resource
logger.log({
source = resource,
webhook = config.logging.webhook['playermoney'],
event = 'RemoveMoney',
color = 'red',
tags = tags,
message = ('** %s (citizenid: %s | id: %s)** $%s (%s) removed, new %s balance: $%s reason: %s'):format(GetPlayerName(player.PlayerData.source), player.PlayerData.citizenid, player.PlayerData.source, amount, moneyType, moneyType, player.PlayerData.money[moneyType], reason),
--oxLibTags = ('script:%s,playerName:%s,citizenId:%s,playerSource:%s,amount:%s,moneyType:%s,newBalance:%s,reason:%s'):format(resource, GetPlayerName(player.PlayerData.source), player.PlayerData.citizenid, player.PlayerData.source, amount, moneyType, player.PlayerData.money[moneyType], reason)
})
emitMoneyEvents(player.PlayerData.source, player.PlayerData.money, moneyType, amount, 'remove', reason)
end
return true
end
exports('RemoveMoney', RemoveMoney)
---@param identifier Source | string
---@param moneyType MoneyType
---@param amount number
---@param reason? string
---@return boolean success if money was set
function SetMoney(identifier, moneyType, amount, reason)
local player = type(identifier) == 'string' and (GetPlayerByCitizenId(identifier) or GetOfflinePlayer(identifier)) or GetPlayer(identifier)
if not player then return false end
reason = reason or 'unknown'
amount = qbx.math.round(tonumber(amount) --[[@as number]])
local oldAmount = player.PlayerData.money[moneyType]
if amount < 0 or not oldAmount then return false end
if not triggerEventHooks('setMoney', {
source = player.PlayerData.source,
moneyType = moneyType,
amount = amount
}) then return false end
player.PlayerData.money[moneyType] = amount
if not player.Offline then
UpdatePlayerData(identifier)
local difference = amount - oldAmount
local dirChange = difference < 0 and 'removed' or 'added'
local absDifference = math.abs(difference)
local tags = absDifference > 50000 and config.logging.role or {}
local resource = GetInvokingResource() or cache.resource
logger.log({
source = resource,
webhook = config.logging.webhook['playermoney'],
event = 'SetMoney',
color = difference < 0 and 'red' or 'green',
tags = tags,
message = ('**%s (citizenid: %s | id: %s)** $%s (%s) %s, new %s balance: $%s reason: %s'):format(GetPlayerName(player.PlayerData.source), player.PlayerData.citizenid, player.PlayerData.source, absDifference, moneyType, dirChange, moneyType, player.PlayerData.money[moneyType], reason),
})
emitMoneyEvents(player.PlayerData.source, player.PlayerData.money, moneyType, amount, 'set', reason, difference)
end
return true
end
exports('SetMoney', SetMoney)
---@param identifier Source | string
---@param moneyType MoneyType
---@return boolean | number amount or false if moneytype does not exist
function GetMoney(identifier, moneyType)
if not moneyType then return false end
local player = type(identifier) == 'string' and (GetPlayerByCitizenId(identifier) or GetOfflinePlayer(identifier)) or GetPlayer(identifier)
if not player then return false end
exports['SA-Money-v2']:GetCash(player.PlayerData.source, moneyType)
return player.PlayerData.money[moneyType]
end
oldInv = true, -- If you use new inventory system, which doesn't use functions, but exports instead set it to false.
Inventory = 'ps-inventory', -- Set it to name of your inventory resource y
Inventory = 'ox_inventory', -- Set it to name of your inventory resource you use, for example qb-inventory (PS,LJ,QB), ox_inventory, codem-inventory
Inventory = 'Here write your inventory', -- Set it to name of your inventory resource you use, for example qb-inventory (PS,LJ,QB), ox_inventory, codem-inventory