From 938d947825a0741603acea0df5059acdbcdc2f2c Mon Sep 17 00:00:00 2001 From: Andyyy7666 <86536434+Andyyy7666@users.noreply.github.com> Date: Fri, 8 Apr 2022 19:26:40 +0200 Subject: [PATCH] Update main.lua removed SonoranCAD API and kvp. Improved security and server validation. --- ND_Core/source/server/main.lua | 739 +++++++-------------------------- 1 file changed, 157 insertions(+), 582 deletions(-) diff --git a/ND_Core/source/server/main.lua b/ND_Core/source/server/main.lua index 03488c5..7e27e96 100644 --- a/ND_Core/source/server/main.lua +++ b/ND_Core/source/server/main.lua @@ -1,35 +1,5 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 -if server_config.SonoranCAD_Enabled then - local function OnPlayerConnecting(name, setKickReason, deferrals) - local player = source - local steamIdentifier - local identifiers = GetPlayerIdentifiers(player) - deferrals.defer() - - Citizen.Wait(0) - - deferrals.update(string.format("Hello %s. Your Steam ID is being checked.", name)) - - for _, v in pairs(identifiers) do - if string.find(v, "steam") then - steamIdentifier = v - break - end - end - - Citizen.Wait(0) - - if not steamIdentifier then - deferrals.done("You are not connected to Steam.") - else - deferrals.done() - end - end - - AddEventHandler("playerConnecting", OnPlayerConnecting) -end - expectedName = "ND_Core" -- This is the resource and is not suggested to be changed. resource = GetCurrentResourceName() @@ -84,6 +54,27 @@ function GetPlayerIdentifierFromType(type, source) -- Credits: xander1998, Post: return nil end +function validateMoney(cash, bank) + if tonumber(cash) > config.maxStartingCash or tonumber(bank) > config.maxStartingBank then + return false + end + return true +end + +function validateDepartment(player, department) + local rolePermission = false + local departmentExists = config.departments[department] + if departmentExists then + for i = 1, #departmentExists do + rolePermission = IsRolePresent(player, department, departmentExists[i], "start") + if rolePermission then + return true + end + end + end + return false +end + -- Using the IsRolePresent function from discord.lua to check if the player has the roles. RegisterNetEvent("checkPerms") AddEventHandler("checkPerms", function(role) @@ -110,73 +101,15 @@ RegisterNetEvent("getCharacters") AddEventHandler("getCharacters", function() local player = source local characters = {} - local department = "CIV" - if server_config.SonoranCAD_Enabled then - local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "") - local info = { - ["id"] = server_config.SonoranCAD_CommunityID, - ["key"] = server_config.SonoranCAD_APIKey, - ["type"] = "GET_CHARACTERS", - ["data"] = { - { - ["apiId"] = steam - } - } - } - - PerformHttpRequest("https://api.sonorancad.com/civilian/get_characters", function(errorCode, resultData, resultHeaders) - if resultData then - for k, v in pairs(json.decode(resultData)) do - if v.sections[2].fields[6].value == "M" then - gender = "Male" - else - gender = "Female" - end - exports.oxmysql:query("SELECT cash, bank, twt, department FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), v.id}, function(result) - if result then - if result[1] and result[1].cash and result[1].bank then - cash = result[1].cash - bank = result[1].bank - twt = result[1].twt - dept = result[1].department - else - cash = config.maxStartingCash - bank = config.maxStartingBank - twt = v.sections[2].fields[1].value .. " " .. v.sections[2].fields[2].value - exports.oxmysql:query("INSERT INTO characters (license, character_id, cash, bank, twt, department) VALUES (?, ?, ?, ?, ?, ?)", {GetPlayerIdentifierFromType("license", player), v.id, cash, bank, twt, department}) - end - characters[v.id] = {id = v.id, firstName = v.sections[2].fields[1].value, lastName = v.sections[2].fields[2].value, dob = v.sections[2].fields[4].value, gender = gender, twt = twt, department = department, cash = cash, bank = bank} - TriggerClientEvent("returnCharacters", player, characters) - end - end) - end - end - end, "POST", json.encode(info)) - elseif server_config.useKVP then - -- SetResourceKvp("ND_Core:Characters", "") -- this will clear all the characters from everyone. - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - if kvp ~= nil and kvp ~= "" then - local kvpCharacters = kvp[GetPlayerIdentifierFromType("license", player)] - if kvpCharacters then - for characterId, temp in pairs(kvpCharacters) do - if temp then - characters[characterId] = {id = temp.character_id, firstName = temp.first_name, lastName = temp.last_name, dob = temp.dob, gender = temp.gender, twt = temp.twt, department = temp.department, cash = temp.cash, bank = temp.bank} - end - end + exports.oxmysql:query("SELECT * FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result) + if result then + for i = 1, #result do + temp = result[i] + characters[temp.character_id] = {id = temp.character_id, firstName = temp.first_name, lastName = temp.last_name, dob = temp.dob, gender = temp.gender, twt = temp.twt, department = temp.department, cash = temp.cash, bank = temp.bank} end + TriggerClientEvent("returnCharacters", player, characters) end - TriggerClientEvent("returnCharacters", player, characters) - else - exports.oxmysql:query("SELECT * FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result) - if result then - for i = 1, #result do - temp = result[i] - characters[temp.character_id] = {id = temp.character_id, firstName = temp.first_name, lastName = temp.last_name, dob = temp.dob, gender = temp.gender, twt = temp.twt, department = temp.department, cash = temp.cash, bank = temp.bank} - end - TriggerClientEvent("returnCharacters", player, characters) - end - end) - end + end) end) -- Creating a new character and increasing the character id. @@ -185,114 +118,40 @@ AddEventHandler("newCharacter", function(newCharacter) local player = source local license = GetPlayerIdentifierFromType("license", player) + -- validate that the person has permission to use the department. + local departmentCheck = validateDepartment(player, newCharacter.department) + if not departmentCheck then return end + local startingCash = newCharacter.startingCash local startingBank = newCharacter.startingBank - -- Don't trust the client, validate maximum amounts + -- Don't trust the client, validate maximum amounts. local moneyCheck = validateMoney(startingCash, startingBank) - - -- Set money to maximum amount in the config + + -- Set money to maximum amount in the config . -- Only triggers if the client is sending an amount that exceeds the maximum. if not moneyCheck then startingCash = config.maxStartingCash startingBank = config.maxStartingBank end - if server_config.SonoranCAD_Enabled then - local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "") - if newCharacter.gender == "Male" then - newGender = "M" - else - newGender = "F" - end - - local info = { - ["id"] = server_config.SonoranCAD_CommunityID, - ["key"] = server_config.SonoranCAD_APIKey, - ["type"] = "NEW_CHARACTER", - ["data"] = { - { - ["user"] = steam, - ["useDictionary"] = true, - ["recordTypeId"] = 7, - ["replaceValues"] = { - ["first"] = newCharacter.firstName, - ["last"] = newCharacter.lastName, - ["dob"] = newCharacter.dateOfBirth, - ["sex"] = newGender - } - } - } - } - - PerformHttpRequest("https://api.sonorancad.com/civilian/new_character", function(errorCode, resultData, resultHeaders) - print("Returned error code: " .. tostring(errorCode)) - print("Returned data: " .. tostring(resultData)) - print("Returned result Headers: " .. tostring(resultHeaders)) - end, "POST", json.encode(info)) - - TriggerClientEvent("refreshCharacters", player) - elseif server_config.useKVP then - local character_id = nil - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - if kvp == nil and kvp == "" then - kvp = {} - kvp[license] = {} - character_id = 0 - end - if not kvp[license] then - kvp[license] = {} - character_id = 0 - end - if kvp ~= nil and kvp ~= "" then - character_id = #kvp[license] - end - if tonumber(character_id) then - character_id = character_id + 1 - end - - kvp[license][character_id] = { - ["character_id"] = character_id, - ["first_name"] = newCharacter.firstName, - ["last_name"] = newCharacter.lastName, - ["dob"] = newCharacter.dateOfBirth, - ["gender"] = newCharacter.gender, - ["twt"] = newCharacter.twtName, - ["department"] = newCharacter.department, - ["cash"] = startingCash, - ["bank"] = startingBank - } - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - TriggerClientEvent("refreshCharacters", player) - else - exports.oxmysql:query("SELECT character_id FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result) - if (result) and (config.characterLimit > #result) then - exports.oxmysql:query("SELECT MAX(character_id) AS nextID FROM characters WHERE license = ?", {license}, function(result) - if result then - character_id = result[1].nextID - if not character_id then - character_id = 1 - else - character_id = character_id + 1 - end - exports.oxmysql:query("INSERT INTO characters (license, character_id, first_name, last_name, dob, gender, twt, department, cash, bank) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", {license, character_id, newCharacter.firstName, newCharacter.lastName, newCharacter.dateOfBirth, newCharacter.gender, newCharacter.twtName, newCharacter.department, startingCash, startingBank}, function(id) - if id then - exports.oxmysql:query("SELECT * FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result) - if result then - characters = {} - for i = 1, #result do - temp = result[i] - characters[temp.character_id] = {id = temp.character_id, firstName = temp.first_name, lastName = temp.last_name, dob = temp.dob, gender = temp.gender, twt = temp.twt, department = temp.department, cash = temp.cash, bank = temp.bank} - end - TriggerClientEvent("returnCharacters", player, characters) - end - end) + exports.oxmysql:query("SELECT character_id FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result) + if (result) and (config.characterLimit > #result) then + exports.oxmysql:query("INSERT INTO characters (license, character_id, first_name, last_name, dob, gender, twt, department, cash, bank) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", {license, character_id, newCharacter.firstName, newCharacter.lastName, newCharacter.dateOfBirth, newCharacter.gender, newCharacter.twtName, newCharacter.department, startingCash, startingBank}, function(id) + if id then + exports.oxmysql:query("SELECT * FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result) + if result then + characters = {} + for i = 1, #result do + temp = result[i] + characters[temp.character_id] = {id = temp.character_id, firstName = temp.first_name, lastName = temp.last_name, dob = temp.dob, gender = temp.gender, twt = temp.twt, department = temp.department, cash = temp.cash, bank = temp.bank} end - end) - end - end) - end - end) - end + TriggerClientEvent("returnCharacters", player, characters) + end + end) + end + end) + end + end) end) -- Delete character from database. @@ -300,87 +159,19 @@ RegisterNetEvent("delCharacter") AddEventHandler("delCharacter", function(character_id) local player = source local license = GetPlayerIdentifierFromType("license", player) - if server_config.SonoranCAD_Enabled then - local info = { - ["id"] = server_config.SonoranCAD_CommunityID, - ["key"] = server_config.SonoranCAD_APIKey, - ["type"] = "REMOVE_CHARACTER", - ["data"] = { - { - ["id"] = character_id, - }, - } - } - PerformHttpRequest("https://api.sonorancad.com/civilian/remove_character", function(errorCode, resultData, resultHeaders) - print("Returned error code: " .. tostring(errorCode)) - print("Returned data: " .. tostring(resultData)) - print("Returned result Headers: " .. tostring(resultHeaders)) - end, "POST", json.encode(info)) - exports.oxmysql:query("DELETE FROM characters WHERE license = ? AND character_id = ?", {license, character_id}) - elseif server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - kvp[license][character_id] = nil - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - else - exports.oxmysql:query("DELETE FROM characters WHERE license = ? AND character_id = ?", {license, character_id}) - end + exports.oxmysql:query("DELETE FROM characters WHERE license = ? AND character_id = ?", {license, character_id}) end) -- Update the character info when edited. RegisterNetEvent("editCharacter") AddEventHandler("editCharacter", function(newCharacter) local player = source - if server_config.SonoranCAD_Enabled then - local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "") - if newCharacter.gender == "Male" then - newGender = "M" - else - newGender = "F" - end - local info = { - ["id"] = server_config.SonoranCAD_CommunityID, - ["key"] = server_config.SonoranCAD_APIKey, - ["type"] = "EDIT_CHARACTER", - ["data"] = { - { - ["user"] = steam, - ["useDictionary"] = true, - ["recordId"] = newCharacter.id, - ["replaceValues"] = { - ["first"] = newCharacter.firstName, - ["last"] = newCharacter.lastName, - ["dob"] = newCharacter.dateOfBirth, - ["sex"] = newGender - } - } - } - } - PerformHttpRequest("https://api.sonorancad.com/civilian/edit_character", function(errorCode, resultData, resultHeaders) - print("Returned error code: " .. tostring(errorCode)) - print("Returned data: " .. tostring(resultData)) - print("Returned result Headers: " .. tostring(resultHeaders)) - end, "POST", json.encode(info)) - elseif server_config.useKVP then - local license = GetPlayerIdentifierFromType("license", player) - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local cash = kvp[license][newCharacter.id].cash - local bank = kvp[license][newCharacter.id].bank - kvp[license][newCharacter.id] = { - ["character_id"] = newCharacter.id, - ["first_name"] = newCharacter.firstName, - ["last_name"] = newCharacter.lastName, - ["dob"] = newCharacter.dateOfBirth, - ["gender"] = newCharacter.gender, - ["twt"] = newCharacter.twtName, - ["department"] = newCharacter.department, - ["cash"] = cash, - ["bank"] = bank - } - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - TriggerClientEvent("refreshCharacters", player) - else - exports.oxmysql:query("UPDATE characters SET first_name = ?, last_name = ?, dob = ?, gender = ?, twt = ?, department = ? WHERE license = ? AND character_id = ?", {newCharacter.firstName, newCharacter.lastName, newCharacter.dateOfBirth, newCharacter.gender, newCharacter.twtName, newCharacter.department, GetPlayerIdentifierFromType("license", player), newCharacter.id}) - end + + -- validate that the person has permission to use the department. + local departmentCheck = validateDepartment(player, newCharacter.department) + if not departmentCheck then return end + + exports.oxmysql:query("UPDATE characters SET first_name = ?, last_name = ?, dob = ?, gender = ?, twt = ?, department = ? WHERE license = ? AND character_id = ?", {newCharacter.firstName, newCharacter.lastName, newCharacter.dateOfBirth, newCharacter.gender, newCharacter.twtName, newCharacter.department, GetPlayerIdentifierFromType("license", player), newCharacter.id}) end) if config.enableMoneySystem then @@ -389,24 +180,15 @@ if config.enableMoneySystem then AddEventHandler("getMoney", function(characterid) local player = source local license = GetPlayerIdentifierFromType("license", player) - if server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local cash = kvp[license][characterid].cash - local bank = kvp[license][characterid].bank - onlinePlayers[player].cash = cash - onlinePlayers[player].bank = bank - TriggerClientEvent("returnMoney", player, cash, bank) - else - exports.oxmysql:query("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {license, characterid}, function(result) - if result then - local cash = result[1].cash - local bank = result[1].bank - onlinePlayers[player].cash = cash - onlinePlayers[player].bank = bank - TriggerClientEvent("returnMoney", player, cash, bank) - end - end) - end + exports.oxmysql:query("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {license, characterid}, function(result) + if result then + local cash = result[1].cash + local bank = result[1].bank + onlinePlayers[player].cash = cash + onlinePlayers[player].bank = bank + TriggerClientEvent("returnMoney", player, cash, bank) + end + end) end) -- paying command. @@ -429,16 +211,10 @@ if config.enableMoneySystem then Citizen.CreateThread(function() while true do Citizen.Wait(salaryInterval) - for k, v in pairs(onlinePlayers) do - local license = GetPlayerIdentifierFromType("license", k) - if server_config.useKVP then - kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - kvp[license][v.characterId].bank = kvp[license][v.characterId].bank + config.salaryAmount - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - else - exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {config.salaryAmount, license, v.characterId}) - end - TriggerClientEvent("receiveSalary", k, config.salaryAmount) + for playerid, playerinfo in pairs(onlinePlayers) do + local license = GetPlayerIdentifierFromType("license", playerid) + exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {config.salaryAmount, license, playerinfo.characterId}) + TriggerClientEvent("receiveSalary", playerid, config.salaryAmount) end end end) @@ -449,91 +225,22 @@ RegisterNetEvent("characterOnline") AddEventHandler("characterOnline", function(id) local player = source local license = GetPlayerIdentifierFromType("license", player) - - if server_config.SonoranCAD_Enabled then - local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "") - local info = { - ["id"] = server_config.SonoranCAD_CommunityID, - ["key"] = server_config.SonoranCAD_APIKey, - ["type"] = "GET_CHARACTERS", - ["data"] = { - { - ["apiId"] = steam - } + exports.oxmysql:query("SELECT * FROM characters WHERE license = ? AND character_id = ?", {license, id}, function(result) + if result then + local i = result[1] + onlinePlayers[player] = { + characterId = id, + firstName = i.first_name, + lastName = i.last_name, + dob = i.dob, + gender = i.gender, + twt = i.twt, + dept = i.department, + cash = i.cash, + bank = i.bank } - } - PerformHttpRequest("https://api.sonorancad.com/civilian/get_characters", function(errorCode, resultData, resultHeaders) - for k, v in pairs(json.decode(resultData)) do - if v.sections[2].fields[6].value == "M" then - gender = "Male" - else - gender = "Female" - end - exports.oxmysql:query("SELECT cash, bank, twt FROM characters WHERE license = ? AND character_id = ?", {license, v.id}, function(result) - if result then - if result[1] and result[1].cash and result[1].bank then - cash = result[1].cash - bank = result[1].bank - twt = result[1].twt - else - cash = config.maxStartingCash - bank = config.maxStartingBank - twt = v.sections[2].fields[1].value .. " " .. v.sections[2].fields[2].value - exports.oxmysql:query("INSERT INTO characters (license, character_id, cash, bank, twt) VALUES (?, ?, ?, ?, ?)", {license, v.id, cash, bank, twt}) - end - if v.id == id then - onlinePlayers[player] = { - characterId = id, - firstName = v.sections[2].fields[1].value, - lastName = v.sections[2].fields[2].value, - dob = v.sections[2].fields[4].value, - gender = gender, - twt = twt, - dept = "CIV", - cash = cash, - bank = bank - } - end - end - end) - end - end, "POST", json.encode(info)) - elseif server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - if kvp ~= nil and kvp ~= "" then - local kvpCharacters = kvp[license][id] - if kvpCharacters then - onlinePlayers[player] = { - characterId = id, - firstName = kvpCharacters.first_name, - lastName = kvpCharacters.last_name, - dob = kvpCharacters.dob, - gender = kvpCharacters.gender, - twt = kvpCharacters.twt, - dept = kvpCharacters.department, - cash = kvpCharacters.cash, - bank = kvpCharacters.bank - } - end end - else - exports.oxmysql:query("SELECT * FROM characters WHERE license = ? AND character_id = ?", {license, id}, function(result) - if result then - local i = result[1] - onlinePlayers[player] = { - characterId = id, - firstName = i.first_name, - lastName = i.last_name, - dob = i.dob, - gender = i.gender, - twt = i.twt, - dept = i.department, - cash = i.cash, - bank = i.bank - } - end - end) - end + end) end) -- Remove player from onlinePlayers table when they leave. @@ -547,238 +254,106 @@ function getCharacterTable() end function transferBank(amount, player, target) - if server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local license = GetPlayerIdentifierFromType("license", player) - if player == target then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "You can't send money to yourself."} - }) - elseif GetPlayerPing(target) == 0 then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "That player does not exist."} - }) - elseif tonumber(kvp[license][onlinePlayers[player].characterId].bank) < amount then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "You don't have enough money."} - }) - else - local targetLicense = GetPlayerIdentifierFromType("license", target) - kvp[license][onlinePlayers[player].characterId].bank = kvp[license][onlinePlayers[player].characterId].bank - amount - TriggerClientEvent("updateMoney", player) - kvp[targetLicense][onlinePlayers[target].characterId].bank = kvp[targetLicense][onlinePlayers[target].characterId].bank + amount - TriggerClientEvent("updateMoney", target) - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) + exports.oxmysql:query("SELECT bank FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result) + if result then + if player == target then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "You can't send money to yourself."} + }) + elseif GetPlayerPing(target) == 0 then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "That player does not exist."} + }) + elseif result[1].bank < amount then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "You don't have enough money."} + }) + else + exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + TriggerClientEvent("updateMoney", player) + exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId}) + TriggerClientEvent("updateMoney", target) - TriggerClientEvent("chat:addMessage", player, { - color = {0, 255, 0}, - args = {"Success", "You paid " .. onlinePlayers[target].firstName .. " " .. onlinePlayers[target].lastName .. " $" .. amount .. "."} - }) - TriggerClientEvent("receiveBank", target, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player) - end - else - exports.oxmysql:query("SELECT bank FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result) - if result then - if player == target then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "You can't send money to yourself."} - }) - elseif GetPlayerPing(target) == 0 then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "That player does not exist."} - }) - elseif result[1].bank < amount then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "You don't have enough money."} - }) - else - exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - TriggerClientEvent("updateMoney", player) - exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId}) - TriggerClientEvent("updateMoney", target) - - TriggerClientEvent("chat:addMessage", player, { - color = {0, 255, 0}, - args = {"Success", "You paid " .. onlinePlayers[target].firstName .. " " .. onlinePlayers[target].lastName .. " $" .. amount .. "."} - }) - TriggerClientEvent("receiveBank", target, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player) - end + TriggerClientEvent("chat:addMessage", player, { + color = {0, 255, 0}, + args = {"Success", "You paid " .. onlinePlayers[target].firstName .. " " .. onlinePlayers[target].lastName .. " $" .. amount .. "."} + }) + TriggerClientEvent("receiveBank", target, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player) end - end) - end + end + end) end function giveCashToClosestTarget(amount, player) - if server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local license = GetPlayerIdentifierFromType("license", player) - - local playerFound = false - local playerCoords = GetEntityCoords(GetPlayerPed(player)) - if tonumber(kvp[license][onlinePlayers[player].characterId].cash) < amount then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "You don't have enough money."} - }) - else - for k, v in pairs(onlinePlayers) do - local targetCoords = GetEntityCoords(GetPlayerPed(k)) - if (#(playerCoords - targetCoords) < 2.0) and (k ~= player) and not playerFound then - local targetLicense = GetPlayerIdentifierFromType("license", k) - kvp[license][onlinePlayers[player].characterId].cash = kvp[license][onlinePlayers[player].characterId].cash - amount - kvp[targetLicense][v.characterId].cash = kvp[targetLicense][v.characterId].cash + amount - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - - TriggerClientEvent("updateMoney", player) - TriggerClientEvent("updateMoney", k) - playerFound = true - TriggerClientEvent("chat:addMessage", player, { - color = {0, 255, 0}, - args = {"Success", "You gave " .. onlinePlayers[k].firstName .. " " .. onlinePlayers[k].lastName .. " $" .. amount .. "."} - }) - TriggerClientEvent("receiveCash", k, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player) - break - end - end - if not playerFound then + exports.oxmysql:query("SELECT cash FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result) + if result then + local playerFound = false + local playerCoords = GetEntityCoords(GetPlayerPed(player)) + if result[1].cash < amount then TriggerClientEvent("chat:addMessage", player, { color = {255, 0, 0}, - args = {"Error", "No players nearby."} + args = {"Error", "You don't have enough money."} }) - end - playerFound = false - end - else - exports.oxmysql:query("SELECT cash FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result) - if result then - local playerFound = false - local playerCoords = GetEntityCoords(GetPlayerPed(player)) - if result[1].cash < amount then + else + for k, v in pairs(onlinePlayers) do + local targetCoords = GetEntityCoords(GetPlayerPed(k)) + if (#(playerCoords - targetCoords) < 2.0) and (k ~= player) and not playerFound then + exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + TriggerClientEvent("updateMoney", player) + exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", k), tonumber(v.characterId)}) + TriggerClientEvent("updateMoney", k) + playerFound = true + TriggerClientEvent("chat:addMessage", player, { + color = {0, 255, 0}, + args = {"Success", "You gave " .. onlinePlayers[k].firstName .. " " .. onlinePlayers[k].lastName .. " $" .. amount .. "."} + }) + TriggerClientEvent("receiveCash", k, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player) + break + end + end + if not playerFound then TriggerClientEvent("chat:addMessage", player, { color = {255, 0, 0}, - args = {"Error", "You don't have enough money."} + args = {"Error", "No players nearby."} }) - else - for k, v in pairs(onlinePlayers) do - local targetCoords = GetEntityCoords(GetPlayerPed(k)) - if (#(playerCoords - targetCoords) < 2.0) and (k ~= player) and not playerFound then - exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - TriggerClientEvent("updateMoney", player) - exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", k), tonumber(v.characterId)}) - TriggerClientEvent("updateMoney", k) - playerFound = true - TriggerClientEvent("chat:addMessage", player, { - color = {0, 255, 0}, - args = {"Success", "You gave " .. onlinePlayers[k].firstName .. " " .. onlinePlayers[k].lastName .. " $" .. amount .. "."} - }) - TriggerClientEvent("receiveCash", k, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player) - break - end - end - if not playerFound then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "No players nearby."} - }) - end - playerFound = false end + playerFound = false end - end) - end + end + end) end function withdrawMoney(amount, player) - if server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local license = GetPlayerIdentifierFromType("license", player) - kvp[license][onlinePlayers[player].characterId].bank = kvp[license][onlinePlayers[player].characterId].bank - amount - kvp[license][onlinePlayers[player].characterId].cash = kvp[license][onlinePlayers[player].characterId].cash + amount - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - TriggerClientEvent("updateMoney", player) - else - exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - TriggerClientEvent("updateMoney", player) - end + exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + TriggerClientEvent("updateMoney", player) end function depositMoney(amount, player) - if server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local license = GetPlayerIdentifierFromType("license", player) - kvp[license][onlinePlayers[player].characterId].cash = kvp[license][onlinePlayers[player].characterId].cash - amount - kvp[license][onlinePlayers[player].characterId].bank = kvp[license][onlinePlayers[player].characterId].bank + amount - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - TriggerClientEvent("updateMoney", player) - else - exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - TriggerClientEvent("updateMoney", player) - end + exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + TriggerClientEvent("updateMoney", player) end function deductMoney(amount, player, from) if from == "bank" then - if server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local license = GetPlayerIdentifierFromType("license", player) - kvp[license][onlinePlayers[player].characterId].bank = kvp[license][onlinePlayers[player].characterId].bank - amount - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - TriggerClientEvent("updateMoney", player) - else - exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - TriggerClientEvent("updateMoney", player) - end + exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + TriggerClientEvent("updateMoney", player) elseif from == "cash" then - if server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local license = GetPlayerIdentifierFromType("license", player) - kvp[license][onlinePlayers[player].characterId].cash = kvp[license][onlinePlayers[player].characterId].cash - amount - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - TriggerClientEvent("updateMoney", player) - else - exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - TriggerClientEvent("updateMoney", player) - end + exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + TriggerClientEvent("updateMoney", player) end end function addMoney(amount, player, to) if to == "bank" then - if server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local license = GetPlayerIdentifierFromType("license", player) - kvp[license][onlinePlayers[player].characterId].bank = kvp[license][onlinePlayers[player].characterId].bank + amount - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - TriggerClientEvent("updateMoney", player) - else - exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - TriggerClientEvent("updateMoney", player) - end + exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + TriggerClientEvent("updateMoney", player) elseif to == "cash" then - if server_config.useKVP then - local kvp = json.decode(GetResourceKvpString("ND_Core:Characters")) - local license = GetPlayerIdentifierFromType("license", player) - kvp[license][onlinePlayers[player].characterId].cash = kvp[license][onlinePlayers[player].characterId].cash + amount - SetResourceKvp("ND_Core:Characters", json.encode(kvp)) - TriggerClientEvent("updateMoney", player) - else - exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - TriggerClientEvent("updateMoney", player) - end + exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) + TriggerClientEvent("updateMoney", player) end end - -function validateMoney(cash, bank) - if tonumber(cash) > config.maxStartingCash or tonumber(bank) > config.maxStartingBank then - return false - end - return true -end \ No newline at end of file