mirror of
https://github.com/ND-Framework/ND_Core.git
synced 2026-08-18 14:26:03 +01:00
Update main.lua
removed SonoranCAD API and kvp. Improved security and server validation.
This commit is contained in:
@@ -1,35 +1,5 @@
|
|||||||
-- For support join my discord: https://discord.gg/Z9Mxu72zZ6
|
-- 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.
|
expectedName = "ND_Core" -- This is the resource and is not suggested to be changed.
|
||||||
resource = GetCurrentResourceName()
|
resource = GetCurrentResourceName()
|
||||||
|
|
||||||
@@ -84,6 +54,27 @@ function GetPlayerIdentifierFromType(type, source) -- Credits: xander1998, Post:
|
|||||||
return nil
|
return nil
|
||||||
end
|
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.
|
-- Using the IsRolePresent function from discord.lua to check if the player has the roles.
|
||||||
RegisterNetEvent("checkPerms")
|
RegisterNetEvent("checkPerms")
|
||||||
AddEventHandler("checkPerms", function(role)
|
AddEventHandler("checkPerms", function(role)
|
||||||
@@ -110,73 +101,15 @@ RegisterNetEvent("getCharacters")
|
|||||||
AddEventHandler("getCharacters", function()
|
AddEventHandler("getCharacters", function()
|
||||||
local player = source
|
local player = source
|
||||||
local characters = {}
|
local characters = {}
|
||||||
local department = "CIV"
|
exports.oxmysql:query("SELECT * FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result)
|
||||||
if server_config.SonoranCAD_Enabled then
|
if result then
|
||||||
local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "")
|
for i = 1, #result do
|
||||||
local info = {
|
temp = result[i]
|
||||||
["id"] = server_config.SonoranCAD_CommunityID,
|
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}
|
||||||
["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
|
|
||||||
end
|
end
|
||||||
|
TriggerClientEvent("returnCharacters", player, characters)
|
||||||
end
|
end
|
||||||
TriggerClientEvent("returnCharacters", player, characters)
|
end)
|
||||||
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.
|
-- Creating a new character and increasing the character id.
|
||||||
@@ -185,114 +118,40 @@ AddEventHandler("newCharacter", function(newCharacter)
|
|||||||
local player = source
|
local player = source
|
||||||
local license = GetPlayerIdentifierFromType("license", player)
|
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 startingCash = newCharacter.startingCash
|
||||||
local startingBank = newCharacter.startingBank
|
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)
|
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.
|
-- Only triggers if the client is sending an amount that exceeds the maximum.
|
||||||
if not moneyCheck then
|
if not moneyCheck then
|
||||||
startingCash = config.maxStartingCash
|
startingCash = config.maxStartingCash
|
||||||
startingBank = config.maxStartingBank
|
startingBank = config.maxStartingBank
|
||||||
end
|
end
|
||||||
|
|
||||||
if server_config.SonoranCAD_Enabled then
|
exports.oxmysql:query("SELECT character_id FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result)
|
||||||
local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "")
|
if (result) and (config.characterLimit > #result) then
|
||||||
if newCharacter.gender == "Male" 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)
|
||||||
newGender = "M"
|
if id then
|
||||||
else
|
exports.oxmysql:query("SELECT * FROM characters WHERE license = ?", {GetPlayerIdentifierFromType("license", player)}, function(result)
|
||||||
newGender = "F"
|
if result then
|
||||||
end
|
characters = {}
|
||||||
|
for i = 1, #result do
|
||||||
local info = {
|
temp = result[i]
|
||||||
["id"] = server_config.SonoranCAD_CommunityID,
|
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}
|
||||||
["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)
|
|
||||||
end
|
end
|
||||||
end)
|
TriggerClientEvent("returnCharacters", player, characters)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- Delete character from database.
|
-- Delete character from database.
|
||||||
@@ -300,87 +159,19 @@ RegisterNetEvent("delCharacter")
|
|||||||
AddEventHandler("delCharacter", function(character_id)
|
AddEventHandler("delCharacter", function(character_id)
|
||||||
local player = source
|
local player = source
|
||||||
local license = GetPlayerIdentifierFromType("license", player)
|
local license = GetPlayerIdentifierFromType("license", player)
|
||||||
if server_config.SonoranCAD_Enabled then
|
exports.oxmysql:query("DELETE FROM characters WHERE license = ? AND character_id = ?", {license, character_id})
|
||||||
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
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- Update the character info when edited.
|
-- Update the character info when edited.
|
||||||
RegisterNetEvent("editCharacter")
|
RegisterNetEvent("editCharacter")
|
||||||
AddEventHandler("editCharacter", function(newCharacter)
|
AddEventHandler("editCharacter", function(newCharacter)
|
||||||
local player = source
|
local player = source
|
||||||
if server_config.SonoranCAD_Enabled then
|
|
||||||
local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "")
|
-- validate that the person has permission to use the department.
|
||||||
if newCharacter.gender == "Male" then
|
local departmentCheck = validateDepartment(player, newCharacter.department)
|
||||||
newGender = "M"
|
if not departmentCheck then return end
|
||||||
else
|
|
||||||
newGender = "F"
|
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
|
|
||||||
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
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if config.enableMoneySystem then
|
if config.enableMoneySystem then
|
||||||
@@ -389,24 +180,15 @@ if config.enableMoneySystem then
|
|||||||
AddEventHandler("getMoney", function(characterid)
|
AddEventHandler("getMoney", function(characterid)
|
||||||
local player = source
|
local player = source
|
||||||
local license = GetPlayerIdentifierFromType("license", player)
|
local license = GetPlayerIdentifierFromType("license", player)
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {license, characterid}, function(result)
|
||||||
local kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
if result then
|
||||||
local cash = kvp[license][characterid].cash
|
local cash = result[1].cash
|
||||||
local bank = kvp[license][characterid].bank
|
local bank = result[1].bank
|
||||||
onlinePlayers[player].cash = cash
|
onlinePlayers[player].cash = cash
|
||||||
onlinePlayers[player].bank = bank
|
onlinePlayers[player].bank = bank
|
||||||
TriggerClientEvent("returnMoney", player, cash, bank)
|
TriggerClientEvent("returnMoney", player, cash, bank)
|
||||||
else
|
end
|
||||||
exports.oxmysql:query("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {license, characterid}, function(result)
|
end)
|
||||||
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
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- paying command.
|
-- paying command.
|
||||||
@@ -429,16 +211,10 @@ if config.enableMoneySystem then
|
|||||||
Citizen.CreateThread(function()
|
Citizen.CreateThread(function()
|
||||||
while true do
|
while true do
|
||||||
Citizen.Wait(salaryInterval)
|
Citizen.Wait(salaryInterval)
|
||||||
for k, v in pairs(onlinePlayers) do
|
for playerid, playerinfo in pairs(onlinePlayers) do
|
||||||
local license = GetPlayerIdentifierFromType("license", k)
|
local license = GetPlayerIdentifierFromType("license", playerid)
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {config.salaryAmount, license, playerinfo.characterId})
|
||||||
kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
TriggerClientEvent("receiveSalary", playerid, config.salaryAmount)
|
||||||
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)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
@@ -449,91 +225,22 @@ RegisterNetEvent("characterOnline")
|
|||||||
AddEventHandler("characterOnline", function(id)
|
AddEventHandler("characterOnline", function(id)
|
||||||
local player = source
|
local player = source
|
||||||
local license = GetPlayerIdentifierFromType("license", player)
|
local license = GetPlayerIdentifierFromType("license", player)
|
||||||
|
exports.oxmysql:query("SELECT * FROM characters WHERE license = ? AND character_id = ?", {license, id}, function(result)
|
||||||
if server_config.SonoranCAD_Enabled then
|
if result then
|
||||||
local steam = string.gsub(GetPlayerIdentifierFromType("steam", player), "steam:", "")
|
local i = result[1]
|
||||||
local info = {
|
onlinePlayers[player] = {
|
||||||
["id"] = server_config.SonoranCAD_CommunityID,
|
characterId = id,
|
||||||
["key"] = server_config.SonoranCAD_APIKey,
|
firstName = i.first_name,
|
||||||
["type"] = "GET_CHARACTERS",
|
lastName = i.last_name,
|
||||||
["data"] = {
|
dob = i.dob,
|
||||||
{
|
gender = i.gender,
|
||||||
["apiId"] = steam
|
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
|
end
|
||||||
else
|
end)
|
||||||
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.
|
-- Remove player from onlinePlayers table when they leave.
|
||||||
@@ -547,238 +254,106 @@ function getCharacterTable()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function transferBank(amount, player, target)
|
function transferBank(amount, player, target)
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("SELECT bank FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result)
|
||||||
local kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
if result then
|
||||||
local license = GetPlayerIdentifierFromType("license", player)
|
if player == target then
|
||||||
if player == target then
|
TriggerClientEvent("chat:addMessage", player, {
|
||||||
TriggerClientEvent("chat:addMessage", player, {
|
color = {255, 0, 0},
|
||||||
color = {255, 0, 0},
|
args = {"Error", "You can't send money to yourself."}
|
||||||
args = {"Error", "You can't send money to yourself."}
|
})
|
||||||
})
|
elseif GetPlayerPing(target) == 0 then
|
||||||
elseif GetPlayerPing(target) == 0 then
|
TriggerClientEvent("chat:addMessage", player, {
|
||||||
TriggerClientEvent("chat:addMessage", player, {
|
color = {255, 0, 0},
|
||||||
color = {255, 0, 0},
|
args = {"Error", "That player does not exist."}
|
||||||
args = {"Error", "That player does not exist."}
|
})
|
||||||
})
|
elseif result[1].bank < amount then
|
||||||
elseif tonumber(kvp[license][onlinePlayers[player].characterId].bank) < amount then
|
TriggerClientEvent("chat:addMessage", player, {
|
||||||
TriggerClientEvent("chat:addMessage", player, {
|
color = {255, 0, 0},
|
||||||
color = {255, 0, 0},
|
args = {"Error", "You don't have enough money."}
|
||||||
args = {"Error", "You don't have enough money."}
|
})
|
||||||
})
|
else
|
||||||
else
|
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
local targetLicense = GetPlayerIdentifierFromType("license", target)
|
TriggerClientEvent("updateMoney", player)
|
||||||
kvp[license][onlinePlayers[player].characterId].bank = kvp[license][onlinePlayers[player].characterId].bank - amount
|
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId})
|
||||||
TriggerClientEvent("updateMoney", player)
|
TriggerClientEvent("updateMoney", target)
|
||||||
kvp[targetLicense][onlinePlayers[target].characterId].bank = kvp[targetLicense][onlinePlayers[target].characterId].bank + amount
|
|
||||||
TriggerClientEvent("updateMoney", target)
|
|
||||||
SetResourceKvp("ND_Core:Characters", json.encode(kvp))
|
|
||||||
|
|
||||||
TriggerClientEvent("chat:addMessage", player, {
|
TriggerClientEvent("chat:addMessage", player, {
|
||||||
color = {0, 255, 0},
|
color = {0, 255, 0},
|
||||||
args = {"Success", "You paid " .. onlinePlayers[target].firstName .. " " .. onlinePlayers[target].lastName .. " $" .. amount .. "."}
|
args = {"Success", "You paid " .. onlinePlayers[target].firstName .. " " .. onlinePlayers[target].lastName .. " $" .. amount .. "."}
|
||||||
})
|
})
|
||||||
TriggerClientEvent("receiveBank", target, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
|
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
|
|
||||||
end
|
end
|
||||||
end)
|
end
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function giveCashToClosestTarget(amount, player)
|
function giveCashToClosestTarget(amount, player)
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("SELECT cash FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result)
|
||||||
local kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
if result then
|
||||||
local license = GetPlayerIdentifierFromType("license", player)
|
local playerFound = false
|
||||||
|
local playerCoords = GetEntityCoords(GetPlayerPed(player))
|
||||||
local playerFound = false
|
if result[1].cash < amount then
|
||||||
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
|
|
||||||
TriggerClientEvent("chat:addMessage", player, {
|
TriggerClientEvent("chat:addMessage", player, {
|
||||||
color = {255, 0, 0},
|
color = {255, 0, 0},
|
||||||
args = {"Error", "No players nearby."}
|
args = {"Error", "You don't have enough money."}
|
||||||
})
|
})
|
||||||
end
|
else
|
||||||
playerFound = false
|
for k, v in pairs(onlinePlayers) do
|
||||||
end
|
local targetCoords = GetEntityCoords(GetPlayerPed(k))
|
||||||
else
|
if (#(playerCoords - targetCoords) < 2.0) and (k ~= player) and not playerFound then
|
||||||
exports.oxmysql:query("SELECT cash FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result)
|
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
if result then
|
TriggerClientEvent("updateMoney", player)
|
||||||
local playerFound = false
|
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", k), tonumber(v.characterId)})
|
||||||
local playerCoords = GetEntityCoords(GetPlayerPed(player))
|
TriggerClientEvent("updateMoney", k)
|
||||||
if result[1].cash < amount then
|
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, {
|
TriggerClientEvent("chat:addMessage", player, {
|
||||||
color = {255, 0, 0},
|
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
|
end
|
||||||
|
playerFound = false
|
||||||
end
|
end
|
||||||
end)
|
end
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function withdrawMoney(amount, player)
|
function withdrawMoney(amount, player)
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
local kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
local license = GetPlayerIdentifierFromType("license", player)
|
TriggerClientEvent("updateMoney", 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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function depositMoney(amount, player)
|
function depositMoney(amount, player)
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
local kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
local license = GetPlayerIdentifierFromType("license", player)
|
TriggerClientEvent("updateMoney", 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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function deductMoney(amount, player, from)
|
function deductMoney(amount, player, from)
|
||||||
if from == "bank" then
|
if from == "bank" then
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
local kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
TriggerClientEvent("updateMoney", player)
|
||||||
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
|
|
||||||
elseif from == "cash" then
|
elseif from == "cash" then
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
local kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
TriggerClientEvent("updateMoney", player)
|
||||||
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
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function addMoney(amount, player, to)
|
function addMoney(amount, player, to)
|
||||||
if to == "bank" then
|
if to == "bank" then
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
local kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
TriggerClientEvent("updateMoney", player)
|
||||||
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
|
|
||||||
elseif to == "cash" then
|
elseif to == "cash" then
|
||||||
if server_config.useKVP then
|
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
|
||||||
local kvp = json.decode(GetResourceKvpString("ND_Core:Characters"))
|
TriggerClientEvent("updateMoney", player)
|
||||||
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
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function validateMoney(cash, bank)
|
|
||||||
if tonumber(cash) > config.maxStartingCash or tonumber(bank) > config.maxStartingBank then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
Reference in New Issue
Block a user