This commit is contained in:
2026-07-07 21:08:52 +02:00
commit 4c20cfc716
2613 changed files with 318021 additions and 0 deletions

View File

@@ -0,0 +1,234 @@
local spawnedPeds, netIdTable = {}, {}
-- get keys utils
local function get_key(t)
local key
for k, _ in pairs(t) do
key = k
end
return key
end
-- Resource starting
AddEventHandler('onResourceStart', function(resourceName)
if (GetCurrentResourceName() ~= resourceName) then return end
if Config.EnablePeds then BANK.CreatePeds() end
local twoMonthMs = (os.time() - 5259487) * 1000
MySQL.Sync.fetchScalar('DELETE FROM banking WHERE time < ? ', {twoMonthMs})
end)
AddEventHandler('onResourceStop', function(resourceName)
if (GetCurrentResourceName() ~= resourceName) then return end
if Config.EnablePeds then BANK.DeletePeds() end
end)
if Config.EnablePeds then
AddEventHandler('esx:playerLoaded', function(playerId)
TriggerClientEvent('esx_banking:pedHandler', playerId, netIdTable)
end)
end
-- event
RegisterServerEvent('esx_banking:doingType')
AddEventHandler('esx_banking:doingType', function(typeData)
if source == nil then return end
if (typeData == nil) then return end
local source = source
local xPlayer = ESX.Player(source)
local identifier = xPlayer.getIdentifier()
local money = xPlayer.getAccount('money').money
local bankMoney = xPlayer.getAccount('bank').money
local amount
local key = get_key(typeData)
if typeData.deposit then
amount = tonumber(typeData.deposit)
elseif typeData.withdraw then
amount = tonumber(typeData.withdraw)
elseif typeData.transfer and typeData.transfer.moneyAmount then
amount = tonumber(typeData.transfer.moneyAmount)
elseif typeData.pincode then
amount = tonumber(typeData.pincode)
end
if not tonumber(amount) then return end
amount = ESX.Math.Round(amount)
if amount == nil or (not typeData.pincode and amount <= 0) then
TriggerClientEvent("esx:showNotification", source, TranslateCap('invalid_amount'), "error")
else
if typeData.deposit and amount <= money then
-- deposit
BANK.Deposit(amount, xPlayer)
elseif typeData.withdraw and bankMoney ~= nil and amount <= bankMoney then
-- withdraw
BANK.Withdraw(amount, xPlayer)
elseif typeData.pincode then
-- pincode
BANK.Pincode(amount, identifier)
elseif typeData.transfer then
-- transfer
if tonumber(typeData.transfer.playerId) <= 0 then
TriggerClientEvent("esx:showNotification", source, TranslateCap("cant_do_it"), "error")
return
end
if bankMoney < amount then
TriggerClientEvent("esx:showNotification", source, TranslateCap('not_enough_money', amount), "error")
return
end
local xTarget = ESX.Player(tonumber(typeData.transfer.playerId))
if not BANK.Transfer(xTarget, xPlayer, amount, key) then
return
end
else
TriggerClientEvent("esx:showNotification", source, TranslateCap('not_enough_money', amount), "error")
return
end
money = xPlayer.getAccount('money').money
bankMoney = xPlayer.getAccount('bank').money
if typeData.transfer then
TriggerClientEvent("esx:showNotification", source,
TranslateCap(string.format('%s_money', key), amount, typeData.transfer.playerId), "success")
else
TriggerClientEvent("esx:showNotification", source, TranslateCap(string.format('%s_money', key), typeData.pincode and (string.format("%04d", amount)) or amount), "success")
end
if not typeData.pincode then
BANK.LogTransaction(source,string.upper(key), string.upper(key), amount, bankMoney)
end
TriggerClientEvent("esx_banking:updateMoneyInUI", source, key, bankMoney, money)
end
end)
-- register callbacks
ESX.RegisterServerCallback("esx_banking:getPlayerData", function(source, cb)
local xPlayer = ESX.Player(source)
local identifier = xPlayer.getIdentifier()
local weekAgo = (os.time() - 604800) * 1000
local transactionHistory = MySQL.Sync.fetchAll(
'SELECT * FROM banking WHERE identifier = ? AND time > ? ORDER BY time DESC LIMIT 10', {identifier, weekAgo})
local playerData = {
playerName = xPlayer.getName(),
money = xPlayer.getAccount('money').money,
bankMoney = xPlayer.getAccount('bank').money,
transactionHistory = transactionHistory
}
cb(playerData)
end)
ESX.RegisterServerCallback("esx_banking:checkPincode", function(source, cb, inputPincode)
local xPlayer = ESX.Player(source)
local identifier = xPlayer.getIdentifier()
local pincode = MySQL.Sync.fetchScalar('SELECT COUNT(1) AS pincode FROM users WHERE identifier = ? AND pincode = ?',
{identifier, inputPincode})
cb(pincode > 0)
end)
function logTransaction(targetSource,label, key,amount)
if targetSource == nil then
print("ERROR: TargetSource nil!")
return
end
if key == nil then
print("ERROR: Do you need use these: WITHDRAW,DEPOSIT,TRANSFER_RECEIVE")
return
end
if type(key) ~= "string" or key == '' then
print("ERROR: Do you need use these: WITHDRAW,DEPOSIT,TRANSFER_RECEIVE and can only be string type!")
return
end
if amount == nil then
print("ERROR: Amount value is nil! Add some numeric value to the amount!")
return
end
if label == nil then
label = "UNKNOW LABEL"
end
local xPlayer = ESX.Player(tonumber(targetSource))
if xPlayer ~= nil then
local bankCurrentMoney = xPlayer.getAccount('bank').money
BANK.LogTransaction(targetSource, label, string.upper(key), amount, bankCurrentMoney)
else
print("ERROR: xPlayer is nil!")
end
end
exports("logTransaction", logTransaction)
RegisterServerEvent('esx_banking:logTransaction')
AddEventHandler('esx_banking:logTransaction', function(label,key,amount)
logTransaction(source,label,key,amount)
end)
-- bank functions
BANK = {
CreatePeds = function()
for i = 1, #Config.Peds do
local model = Config.Peds[i].Model
local coords = Config.Peds[i].Position
spawnedPeds[i] = CreatePed(0, model, coords.x, coords.y, coords.z, coords.w, true, true)
netIdTable[i] = NetworkGetNetworkIdFromEntity(spawnedPeds[i])
while not DoesEntityExist(spawnedPeds[i]) do Wait(50) end
end
Wait(100)
TriggerClientEvent('esx_banking:pedHandler', -1, netIdTable)
end,
DeletePeds = function()
for i = 1, #spawnedPeds do
DeleteEntity(spawnedPeds[i])
spawnedPeds[i] = nil
end
end,
Withdraw = function(amount, xPlayer)
xPlayer.addAccountMoney('money', amount)
xPlayer.removeAccountMoney('bank', amount)
end,
Deposit = function(amount, xPlayer)
xPlayer.removeAccountMoney('money', amount)
xPlayer.addAccountMoney('bank', amount)
end,
Transfer = function(xTarget, xPlayer, amount, key)
if xTarget == nil or xPlayer.src == xTarget.src then
TriggerClientEvent("esx:showNotification", source, TranslateCap("cant_do_it"), "error")
return false
end
xPlayer.removeAccountMoney('bank', amount)
xTarget.addAccountMoney('bank', amount)
local bankMoney = xTarget.getAccount('bank').money
BANK.LogTransaction(xTarget.src, "TRANSFER_RECEIVE", amount, bankMoney)
TriggerClientEvent("esx:showNotification", xTarget.src, TranslateCap('receive_transfer', amount, xPlayer.src),
"success")
return true
end,
Pincode = function(amount, identifier)
MySQL.update('UPDATE users SET pincode = ? WHERE identifier = ? ', {amount, identifier})
end,
LogTransaction = function(playerId, label, logType, amount, bankMoney)
if playerId == nil then
return
end
if label == nil then
label = logType
end
local xPlayer = ESX.Player(playerId)
local identifier = xPlayer.getIdentifier()
MySQL.insert('INSERT INTO banking (identifier, label, type, amount, time, balance) VALUES (?, ?, ?, ?, ?, ?)',
{identifier,label,logType,amount, os.time() * 1000, bankMoney})
end
}