From 96f89d60ffd443c7f25338df2cbfc93596b1026b Mon Sep 17 00:00:00 2001 From: Andyyy7666 <86536434+Andyyy7666@users.noreply.github.com> Date: Sat, 16 Jul 2022 04:46:27 +0200 Subject: [PATCH] Updated 2.1.0 Updated everything to new format, N1K0 is about to work on some more stuff. --- ND_ATMs/fxmanifest.lua | 6 +- ND_ATMs/source/client.lua | 19 +- ND_ATMs/source/server.lua | 19 +- ND_Banks/fxmanifest.lua | 6 +- ND_Banks/source/client.lua | 11 +- ND_Banks/source/server.lua | 9 +- ND_CharacterSelection/config.lua | 56 +++ ND_CharacterSelection/fxmanifest.lua | 22 + ND_CharacterSelection/source/client.lua | 192 +++++++++ ND_CharacterSelection/source/server.lua | 67 +++ .../source/ui/index.html | 0 .../source/ui/script.js | 10 +- .../source/ui/style.css | 0 ND_Core/client/main.lua | 85 ++++ ND_Core/config_client.lua | 71 +-- ND_Core/config_server.lua | 6 +- ND_Core/fxmanifest.lua | 48 +-- ND_Core/query.sql | 2 +- ND_Core/server/events.lua | 49 +++ ND_Core/server/functions.lua | 309 ++++++++++++++ ND_Core/server/main.lua | 10 + ND_Core/source/client.lua | 266 ------------ ND_Core/source/server.lua | 404 ------------------ ND_Doorlocks/config.lua | 6 +- ND_Doorlocks/fxmanifest.lua | 2 +- ND_Doorlocks/source/client.lua | 37 +- ND_Doorlocks/source/server.lua | 6 +- ND_Jailing/config_client.lua | 10 +- ND_Jailing/config_server.lua | 2 +- ND_Jailing/fxmanifest.lua | 6 +- ND_Jailing/source/client.lua | 5 +- ND_Jailing/source/server.lua | 3 + ND_ShotSpotter/config_client.lua | 18 +- ND_ShotSpotter/config_server.lua | 4 +- ND_ShotSpotter/fxmanifest.lua | 4 +- ND_ShotSpotter/source/client.lua | 5 +- ND_ShotSpotter/source/server.lua | 3 + 37 files changed, 924 insertions(+), 854 deletions(-) create mode 100644 ND_CharacterSelection/config.lua create mode 100644 ND_CharacterSelection/fxmanifest.lua create mode 100644 ND_CharacterSelection/source/client.lua create mode 100644 ND_CharacterSelection/source/server.lua rename {ND_Core => ND_CharacterSelection}/source/ui/index.html (100%) rename {ND_Core => ND_CharacterSelection}/source/ui/script.js (96%) rename {ND_Core => ND_CharacterSelection}/source/ui/style.css (100%) create mode 100644 ND_Core/client/main.lua create mode 100644 ND_Core/server/events.lua create mode 100644 ND_Core/server/functions.lua create mode 100644 ND_Core/server/main.lua delete mode 100644 ND_Core/source/client.lua delete mode 100644 ND_Core/source/server.lua diff --git a/ND_ATMs/fxmanifest.lua b/ND_ATMs/fxmanifest.lua index f1af2dd..18ff346 100644 --- a/ND_ATMs/fxmanifest.lua +++ b/ND_ATMs/fxmanifest.lua @@ -2,7 +2,7 @@ author "Andyyy#7666" description "ND Framework ATMs" -version "2.0.0" +version "2.1.0" fx_version "cerulean" game "gta5" @@ -17,4 +17,6 @@ files { } server_script "source/server.lua" -client_script "source/client.lua" \ No newline at end of file +client_script "source/client.lua" + +dependency "ND_Core" \ No newline at end of file diff --git a/ND_ATMs/source/client.lua b/ND_ATMs/source/client.lua index a415072..d02edf2 100644 --- a/ND_ATMs/source/client.lua +++ b/ND_ATMs/source/client.lua @@ -1,5 +1,6 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 +NDCore = exports["ND_Core"]:GetCoreObject() local display = false local nearModel = false @@ -35,13 +36,13 @@ end -- Hide/Show ui function SetDisplay(bool) - local playerInfo = exports["ND_Core"]:getCharacterInfo() + local selectedCharacter = NDCore.functions:getSelectedCharacter() display = bool SetNuiFocus(bool, bool) SendNUIMessage({ status = bool, - playerName = playerInfo.firstName .. " " .. playerInfo.lastName, - balance = "Account Balance: $" .. playerInfo.bank .. ".00", + playerName = selectedCharacter.firstName .. " " .. selectedCharacter.lastName, + balance = "Account Balance: $" .. selectedCharacter.bank .. ".00", date = days[GetClockDayOfWeek() + 1], time = getTime() }) @@ -116,7 +117,7 @@ RegisterNUICallback("useATM", function(data) }) return end - TriggerServerEvent("ND_ATM:withdraw", data.amount) + TriggerServerEvent("ND_ATMs:withdraw", data.amount) elseif action == "DEPOSIT" then if data.amount == "" then Citizen.Wait(1000) @@ -125,17 +126,17 @@ RegisterNUICallback("useATM", function(data) }) return end - TriggerServerEvent("ND_ATM:deposit", data.amount) + TriggerServerEvent("ND_ATMs:deposit", data.amount) end end) -- update the balance on the ui and confirm if the deposit/withdraw was successful. -RegisterNetEvent("ND_ATM:update") -AddEventHandler("ND_ATM:update", function(status) +RegisterNetEvent("ND_ATMs:update") +AddEventHandler("ND_ATMs:update", function(status) Citizen.Wait(1000) - local playerInfo = exports["ND_Core"]:getCharacterInfo() + local selectedCharacter = NDCore.functions:getSelectedCharacter() SendNUIMessage({ - balance = "Account Balance: $" .. playerInfo.bank .. ".00", + balance = "Account Balance: $" .. selectedCharacter.bank .. ".00", success = status }) end) \ No newline at end of file diff --git a/ND_ATMs/source/server.lua b/ND_ATMs/source/server.lua index d950829..35748c8 100644 --- a/ND_ATMs/source/server.lua +++ b/ND_ATMs/source/server.lua @@ -1,13 +1,16 @@ -RegisterNetEvent("ND_ATM:withdraw") -AddEventHandler("ND_ATM:withdraw", function(amount) +NDCore = exports["ND_Core"]:GetCoreObject() +NDCore.functions:versionChecker("ND_ATMs", GetCurrentResourceName(), "https://github.com/Andyyy7666/ND_Framework", "https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_ATMs/fxmanifest.lua") + +RegisterNetEvent("ND_ATMs:withdraw") +AddEventHandler("ND_ATMs:withdraw", function(amount) local player = source - local update = exports["ND_Core"]:withdrawMoney(amount, player) - TriggerClientEvent("ND_ATM:update", player, update) + local update = NDCore.functions:withdrawMoney(amount, player) + TriggerClientEvent("ND_ATMs:update", player, update) end) -RegisterNetEvent("ND_ATM:deposit") -AddEventHandler("ND_ATM:deposit", function(amount) +RegisterNetEvent("ND_ATMs:deposit") +AddEventHandler("ND_ATMs:deposit", function(amount) local player = source - local update = exports["ND_Core"]:depositMoney(amount, player) - TriggerClientEvent("ND_ATM:update", player, update) + local update = NDCore.functions:depositMoney(amount, player) + TriggerClientEvent("ND_ATMs:update", player, update) end) \ No newline at end of file diff --git a/ND_Banks/fxmanifest.lua b/ND_Banks/fxmanifest.lua index ee1cdd1..af39d83 100644 --- a/ND_Banks/fxmanifest.lua +++ b/ND_Banks/fxmanifest.lua @@ -2,7 +2,7 @@ author "Andyyy#7666" description "ND Framework Banks" -version "2.0.0" +version "2.1.0" fx_version "cerulean" game "gta5" @@ -17,4 +17,6 @@ files { } server_script "source/server.lua" -client_script "source/client.lua" \ No newline at end of file +client_script "source/client.lua" + +dependency "ND_Core" \ No newline at end of file diff --git a/ND_Banks/source/client.lua b/ND_Banks/source/client.lua index c6141c9..5c9ca2e 100644 --- a/ND_Banks/source/client.lua +++ b/ND_Banks/source/client.lua @@ -1,5 +1,6 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 +NDCore = exports["ND_Core"]:GetCoreObject() local display = false local nearModel = false @@ -38,13 +39,13 @@ end -- Hide/Show ui function SetDisplay(bool) - local playerInfo = exports["ND_Core"]:getCharacterInfo() + local selectedCharacter = NDCore.functions:getSelectedCharacter() display = bool SetNuiFocus(bool, bool) SendNUIMessage({ status = bool, - playerName = playerInfo.firstName .. " " .. playerInfo.lastName, - balance = "Account Balance: $" .. playerInfo.bank .. ".00", + playerName = selectedCharacter.firstName .. " " .. selectedCharacter.lastName, + balance = "Account Balance: $" .. selectedCharacter.bank .. ".00", date = days[GetClockDayOfWeek() + 1], time = getTime() }) @@ -145,9 +146,9 @@ end) RegisterNetEvent("ND_Banks:update") AddEventHandler("ND_Banks:update", function(status) Citizen.Wait(1000) - local playerInfo = exports["ND_Core"]:getCharacterInfo() + local selectedCharacter = NDCore.functions:getSelectedCharacter() SendNUIMessage({ - balance = "Account Balance: $" .. playerInfo.bank .. ".00", + balance = "Account Balance: $" .. selectedCharacter.bank .. ".00", success = status }) end) \ No newline at end of file diff --git a/ND_Banks/source/server.lua b/ND_Banks/source/server.lua index e1c0eaf..f436442 100644 --- a/ND_Banks/source/server.lua +++ b/ND_Banks/source/server.lua @@ -1,20 +1,23 @@ +NDCore = exports["ND_Core"]:GetCoreObject() +NDCore.functions:versionChecker("ND_Banks", GetCurrentResourceName(), "https://github.com/Andyyy7666/ND_Framework", "https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_Banks/fxmanifest.lua") + RegisterNetEvent("ND_Banks:withdraw") AddEventHandler("ND_Banks:withdraw", function(amount) local player = source - local update = exports["ND_Core"]:withdrawMoney(amount, player) + local update = NDCore.functions:withdrawMoney(amount, player) TriggerClientEvent("ND_Banks:update", player, update) end) RegisterNetEvent("ND_Banks:deposit") AddEventHandler("ND_Banks:deposit", function(amount) local player = source - local update = exports["ND_Core"]:depositMoney(amount, player) + local update = NDCore.functions:depositMoney(amount, player) TriggerClientEvent("ND_Banks:update", player, update) end) RegisterNetEvent("ND_Banks:transfer") AddEventHandler("ND_Banks:transfer", function(amount, target) local player = source - local update = exports["ND_Core"]:transferBank(amount, player, target) + local update = NDCore.functions:transferBank(amount, player, target) TriggerClientEvent("ND_Banks:update", player, update) end) \ No newline at end of file diff --git a/ND_CharacterSelection/config.lua b/ND_CharacterSelection/config.lua new file mode 100644 index 0000000..87978ca --- /dev/null +++ b/ND_CharacterSelection/config.lua @@ -0,0 +1,56 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +config = { + changeCharacterCommand = "changecharacter", -- this is the command to open the ui again and change your character. + + characterSelectionAopDisplay = false, + aop = function () + return "AOP: " .. exports["SimpleHUD"]:getAOP() -- exports["ModernHUD"]:getAOP() + end, + + -- set your backgrounds, if you have more than 1 then it will randomly change everytime you open the ui. + backgrounds = { + "https://i.imgur.com/E51ckFx.png", -- Credits: Fuzzman270#0270 + "https://i.imgur.com/SeZD7TP.png", -- Credits: Fuzzman270#0270 + "https://i.imgur.com/ZWKfYD9.png" -- Credits: 2XRondo#6374 + }, + + departments = { + ["CIV"] = {"0"}, + ["SAHP"] = {"0"}, + ["LSPD"] = {"0"}, + ["BCSO"] = {"872921520719142932"}, + ["LSFD"] = {"872921520719142932"} + }, + + -- set up the spawn buttons for each department. + spawns = { + ["CIV"] = { + {x = -102.78, y = 6336.28, z = 31.49, name = "Dream View Motel (Paleto Bay)"}, + {x = 343.53, y = 2636.94, z = 43.94, name = "Eastern Motel (Sandy Shores)"}, + {x = 196.96, y = -934.54, z = 29.69, name = "Legion Square"}, + {x = -1616.69, y = -1073.81, z = 12.15, name = "Del Perro Pier"}, + {x = -1039.65, y = -2741.02, z = 12.89, name = "LSIA"} + }, + ["SAHP"] = { + {x = -447.2, y = 6009.4, z = 30.72, name = "Paleto Bay Sheriff"}, + {x = 1849.4, y = 3688.6, z = 33.27, name = "Sandy Shores Sheriff"}, + {x = 437.6, y = -986.6, z = 29.69, name = "Mission Row PD"} + }, + ["LSPD"] = { + {x = -447.2, y = 6009.4, z = 30.72, name = "Paleto Bay Sheriff"}, + {x = 1849.4, y = 3688.6, z = 33.27, name = "Sandy Shores Sheriff"}, + {x = 437.6, y = -986.6, z = 29.69, name = "Mission Row PD"} + }, + ["BCSO"] = { + {x = -447.2, y = 6009.4, z = 30.72, name = "Paleto Bay Sheriff"}, + {x = 1849.4, y = 3688.6, z = 33.27, name = "Sandy Shores Sheriff"}, + {x = 437.6, y = -986.6, z = 29.69, name = "Mission Row Police "} + }, + ["LSFD"] = { + {x = -384.07, y = 6117.9, z = 30.48, name = "Fire Station No1 (Paleto Bay)"}, + {x = 1691.5, y = 3597.95, z = 34.56, name = "Fire Station No2 (Sandy Shores)"}, + {x = 1194.71, y = -1474.14, z = 33.86, name = "Fire Station No7 (Los Santos)"} + }, + } +} \ No newline at end of file diff --git a/ND_CharacterSelection/fxmanifest.lua b/ND_CharacterSelection/fxmanifest.lua new file mode 100644 index 0000000..b177da9 --- /dev/null +++ b/ND_CharacterSelection/fxmanifest.lua @@ -0,0 +1,22 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +author "Andyyy#7666" +description "ND Character Selection (DOJ Based)" +version "2.1.0" + +fx_version "cerulean" +game "gta5" +lua54 "yes" + +files { + "source/ui/index.html", + "source/ui/script.js", + "source/ui/style.css" +} +ui_page "source/ui/index.html" + +shared_script "config.lua" +server_script "source/server.lua" +client_script "source/client.lua" + +dependency "ND_Core" \ No newline at end of file diff --git a/ND_CharacterSelection/source/client.lua b/ND_CharacterSelection/source/client.lua new file mode 100644 index 0000000..f6eaa93 --- /dev/null +++ b/ND_CharacterSelection/source/client.lua @@ -0,0 +1,192 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +NDCore = exports["ND_Core"]:GetCoreObject() + +function tablelength(table) + local count = 0 + for _ in pairs(table) do + count = count + 1 + end + return count +end + +function SetDisplay(bool, typeName, bg) + if not bg then + background = config.backgrounds[math.random(1, #config.backgrounds)] + end + SetNuiFocus(bool, bool) + SendNUIMessage({ + type = typeName, + background = background, + status = bool, + serverName = NDCore.config.serverName, + characterAmount = tablelength(NDCore.characters) .. "/" .. NDCore.config.characterLimit + }) + if config.characterSelectionAopDisplay then + SendNUIMessage({ + type = "aop", + aop = config.aop() + }) + end +end + +function start(switch) + TriggerServerEvent("ND_CharacterSelection:checkPerms") + TriggerServerEvent("ND:getCharacters") + if switch then + local ped = PlayerPedId() + SwitchOutPlayer(ped, 0, 1) + FreezeEntityPosition(ped, true) + SetEntityVisible(ped, false, 0) + end + SendNUIMessage({ + type = "onStart", + maxStartingBank = NDCore.config.startingBank, + maxStartingCash = NDCore.config.startingCash + }) + if config.characterSelectionAopDisplay then + SendNUIMessage({ + type = "aop", + aop = config.aop() + }) + end +end + +AddEventHandler("onResourceStart", function(resourceName) + if (GetCurrentResourceName() ~= resourceName) then + return + end + Citizen.Wait(2000) + start(false) +end) + +AddEventHandler("playerSpawned", function() + start(true) +end) + +-- This is used to add department drop down on the ui. +RegisterNetEvent("ND_CharacterSelection:permsChecked") +AddEventHandler("ND_CharacterSelection:permsChecked", function(allowedRoles) + for _, dept in pairs(allowedRoles) do + SendNUIMessage({ + type = "givePerms", + deptRole = dept + }) + end +end) + +-- Gets all the characters and displays them on the ui. +RegisterNetEvent("ND:returnCharacters") +AddEventHandler("ND:returnCharacters", function(characters) + SendNUIMessage({ + type = "refresh" + }) + for _, character in pairs(characters) do + SendNUIMessage({ + type = "character", + id = character.id, + firstName = character.firstName, + lastName = character.lastName, + dateOfBirth = character.dob, + gender = character.gender, + twtName = character.twt, + department = character.job, + startingCash = character.cash, + startingBank = character.bank + }) + end + SetDisplay(true, "ui", background) +end) + +-- Selecting a player from the iu. +RegisterNUICallback("setMainCharacter", function(data) + NDCore.functions:getCharacters(function(characters) + NDCore.selectedCharacter = characters[data.id] + end) + for _, spawn in pairs(config.spawns[NDCore.selectedCharacter.job]) do + SendNUIMessage({ + type = "setSpawns", + x = spawn.x, + y = spawn.y, + z = spawn.z, + name = spawn.name + }) + end + TriggerServerEvent("ND:setCharacterOnline", NDCore.selectedCharacter.id) +end) + +-- Creating a character from the ui. +RegisterNUICallback("newCharacter", function(data) + if tablelength(NDCore.characters) < NDCore.config.characterLimit then + TriggerServerEvent("ND_CharacterSelection:newCharacter", { + firstName = data.firstName, + lastName = data.lastName, + dob = data.dateOfBirth, + gender = data.gender, + twt = data.twtName, + job = data.department, + cash = data.startingCash, + bank = data.startingBank + }) + end +end) + +-- editing a character from the ui. +RegisterNUICallback("editCharacter", function(data) + TriggerServerEvent("ND_CharacterSelection:editCharacter", { + id = data.id, + firstName = data.firstName, + lastName = data.lastName, + dob = data.dateOfBirth, + gender = data.gender, + twt = data.twtName, + job = data.department + }) +end) + +-- deleting a character from the ui. +RegisterNUICallback("delCharacter", function(data) + TriggerServerEvent("ND:deleteCharacter", data.character) +end) + +-- Quit button from ui. +RegisterNUICallback("exitGame", function() + TriggerServerEvent("ND:exitGame") +end) + +-- Teleporting using ui. +RegisterNUICallback("tpToLocation", function(data) + local ped = PlayerPedId() + FreezeEntityPosition(ped, false) + SetEntityCoords(ped, tonumber(data.x), tonumber(data.y), tonumber(data.z), false, false, false, false) + FreezeEntityPosition(ped, true) + SwitchInPlayer(ped) + Citizen.Wait(500) + SetDisplay(false, "ui") + Citizen.Wait(500) + FreezeEntityPosition(ped, false) + SetEntityVisible(ped, true, 0) +end) + +-- Choosing the do not tp button. +RegisterNUICallback("tpDoNot", function() + local ped = PlayerPedId() + SwitchInPlayer(ped) + Citizen.Wait(500) + SetDisplay(false, "ui") + Citizen.Wait(500) + SetEntityVisible(ped, true, 0) + FreezeEntityPosition(ped, false) +end) + +-- Change character command +RegisterCommand(config.changeCharacterCommand, function() + SwitchOutPlayer(PlayerPedId(), 0, 1) + Citizen.Wait(2000) + FreezeEntityPosition(ped, true) + SetEntityVisible(ped, false, 0) + SetDisplay(true, "ui") +end, false) + +-- chat suggestions +TriggerEvent("chat:addSuggestion", "/" .. config.changeCharacterCommand, "Switch your framework character.") \ No newline at end of file diff --git a/ND_CharacterSelection/source/server.lua b/ND_CharacterSelection/source/server.lua new file mode 100644 index 0000000..6f24f5a --- /dev/null +++ b/ND_CharacterSelection/source/server.lua @@ -0,0 +1,67 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +NDCore = exports["ND_Core"]:GetCoreObject() + +function validateDepartment(player, department) + local departmentExists = config.departments[department] + if departmentExists then + local discordUserId = string.gsub(NDCore.functions:GetPlayerIdentifierFromType("discord", player), "discord:", "") + local roles = NDCore.functions:getUserDiscordInfo(discordUserId).roles + + -- validate that the player actually has the role that they selected on the client. + for _, roleId in pairs(departmentExists) do + if roles[roleId] or roleId == 0 or roleId == "0" then + return true + end + end + end + return false +end + +-- Creating a new character. +RegisterNetEvent("ND_CharacterSelection:newCharacter") +AddEventHandler("ND_CharacterSelection:newCharacter", function(newCharacter) + local player = source + + -- validate that the person has permission to use the department. + local departmentCheck = validateDepartment(player, newCharacter.job) + if not departmentCheck then return end + + -- Create the character if the player has permission to the department. + NDCore.functions:createCharacter(player, newCharacter.firstName, newCharacter.lastName, newCharacter.dob, newCharacter.gender, newCharacter.twt, newCharacter.job, newCharacter.cash, newCharacter.bank) +end) + +-- Update the character info when edited. +RegisterNetEvent("ND_CharacterSelection:editCharacter") +AddEventHandler("ND_CharacterSelection:editCharacter", function(newCharacter) + local player = source + + -- validate that the person has permission to use the department. + local departmentCheck = validateDepartment(player, newCharacter.job) + if not departmentCheck then return end + + -- Updating the character information in the database. + NDCore.functions:updateCharacterData(newCharacter.id, newCharacter.firstName, newCharacter.lastName, newCharacter.dob, newCharacter.gender, newCharacter.twt, newCharacter.job) + + -- Updating characters on the client. + TriggerClientEvent("ND:returnCharacters", player, NDCore.functions:getPlayerCharacters(player)) +end) + +RegisterNetEvent("ND_CharacterSelection:checkPerms") +AddEventHandler("ND_CharacterSelection:checkPerms", function() + local player = source + local discordUserId = string.gsub(NDCore.functions:GetPlayerIdentifierFromType("discord", player), "discord:", "") + local allowedRoles = {} + local roles = NDCore.functions:getUserDiscordInfo(discordUserId).roles + + -- Check if the players discord roles will grant them permission to the department. + for dept, roleTable in pairs(config.departments) do + for _, roleId in pairs(roleTable) do + if roles[roleId] or roleId == 0 or roleId == "0" then + table.insert(allowedRoles, dept) + end + end + end + + TriggerClientEvent("ND_CharacterSelection:permsChecked", player, allowedRoles) +end) \ No newline at end of file diff --git a/ND_Core/source/ui/index.html b/ND_CharacterSelection/source/ui/index.html similarity index 100% rename from ND_Core/source/ui/index.html rename to ND_CharacterSelection/source/ui/index.html diff --git a/ND_Core/source/ui/script.js b/ND_CharacterSelection/source/ui/script.js similarity index 96% rename from ND_Core/source/ui/script.js rename to ND_CharacterSelection/source/ui/script.js index 036c3c2..f6ac49e 100644 --- a/ND_Core/source/ui/script.js +++ b/ND_CharacterSelection/source/ui/script.js @@ -148,15 +148,7 @@ $(function() { $(`#characterButton${id}`).click(function() { spawnMenu(true) $.post(`https://${GetParentResourceName()}/setMainCharacter`, JSON.stringify({ - firstName: firstName, - lastName: lastName, - dateOfBirth: dateOfBirth, - gender: gender, - twtName: twtName, - department: department, - startingCash: startingCash, - startingBank: startingBank, - character: id + id: id })); return; }); diff --git a/ND_Core/source/ui/style.css b/ND_CharacterSelection/source/ui/style.css similarity index 100% rename from ND_Core/source/ui/style.css rename to ND_CharacterSelection/source/ui/style.css diff --git a/ND_Core/client/main.lua b/ND_Core/client/main.lua new file mode 100644 index 0000000..17f38d3 --- /dev/null +++ b/ND_Core/client/main.lua @@ -0,0 +1,85 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +NDCore = {} +NDCore.selectedCharacter = nil +NDCore.characters = {} +NDCore.functions = {} +NDCore.config = config + +function GetCoreObject() + return NDCore +end + +function NDCore.functions:getSelectedCharacter(cb) + if not cb then return NDCore.selectedCharacter end + cb(NDCore.selectedCharacter) +end + +function NDCore.functions:getCharacters(cb) + if not cb then return NDCore.selectedCharacter end + cb(NDCore.characters) +end + +-- discord rich precense will show on a users profile. +if config.enableRichPrecence then + Citizen.CreateThread(function() + SetDiscordAppId(config.appId) + while true do + if NDCore.selectedCharacter then + SetRichPresence(" Playing : " .. config.serverName .. " as " .. NDCore.selectedCharacter.firstName .. " " .. NDCore.selectedCharacter.lastName) + SetDiscordRichPresenceAsset(config.largeLogo) + SetDiscordRichPresenceAssetText("Playing: " .. config.serverName) + SetDiscordRichPresenceAssetSmall(config.smallLogo) + SetDiscordRichPresenceAssetSmallText("Playing as: " .. NDCore.selectedCharacter.firstName .. " " .. NDCore.selectedCharacter.lastName) + SetDiscordRichPresenceAction(0, config.firstButtonName, config.firstButtonLink) + SetDiscordRichPresenceAction(1, config.secondButtonName, config.secondButtonLink) + end + Citizen.Wait(config.updateIntervall * 1000) + end + end) +end + +-- show server name, first name, last name, and the amount of money the character has in the pause menu. +if config.customPauseMenu then + Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + if NDCore.selectedCharacter then + if IsPauseMenuActive() then + BeginScaleformMovieMethodOnFrontendHeader("SET_HEADING_DETAILS") + AddTextEntry("FE_THDR_GTAO", config.serverName) + ScaleformMovieMethodAddParamPlayerNameString(NDCore.selectedCharacter.firstName .. " " .. NDCore.selectedCharacter.lastName) + PushScaleformMovieFunctionParameterString("Cash: $" .. tostring(NDCore.selectedCharacter.cash)) + PushScaleformMovieFunctionParameterString("Bank: $" .. tostring(NDCore.selectedCharacter.bank)) + EndScaleformMovieMethod() + end + end + end + end) +end + +RegisterNetEvent("ND:returnCharacters") +AddEventHandler("ND:returnCharacters", function(characters) + NDCore.characters = characters +end) + +-- updates the money on the client. +RegisterNetEvent("ND:updateMoney") +AddEventHandler("ND:updateMoney", function(cash, bank) + NDCore.selectedCharacter.cash = cash + NDCore.selectedCharacter.bank = bank +end) + +RegisterNetEvent("ND:setCharacter") +AddEventHandler("ND:setCharacter", function(character) + NDCore.selectedCharacter = character +end) + +-- Enables pvp if it's selected in the config. +AddEventHandler("playerSpawned", function() + if config.enablePVP then + SetCanAttackFriendly(PlayerPedId(), true, false) + NetworkSetFriendlyFireOption(true) + end + print("^0This framework is created by ^5Andyyy#7666 ^0for support you can join the ^5discord: ^0https://discord.gg/Z9Mxu72zZ6") +end) \ No newline at end of file diff --git a/ND_Core/config_client.lua b/ND_Core/config_client.lua index 63066e6..cedbe8b 100644 --- a/ND_Core/config_client.lua +++ b/ND_Core/config_client.lua @@ -2,63 +2,20 @@ config = { serverName = "Andy's Development", - characterLimit = 15, - changeCharacterCommand = "changecharacter", -- this is the command to open the ui again and change your character. - customPauseMenu = true, -- this will create a custom pause menu. It will display your money, characters name and the server name in the pause menu. - - -- set your backgrounds, if you have more than 1 then it will randomly change everytime you open the ui. - backgrounds = { - "https://i.imgur.com/E51ckFx.png", -- Credits: Fuzzman270#0270 - "https://i.imgur.com/SeZD7TP.png", -- Credits: Fuzzman270#0270 - "https://i.imgur.com/ZWKfYD9.png" -- Credits: 2XRondo#6374 - }, - - departments = { - ["CIV"] = {"872921520719142932"}, - ["SAHP"] = {"872921520719142932"}, - ["LSPD"] = {"872921520719142932"}, - ["BCSO"] = {"872921520719142932"}, - ["LSFD"] = {"872921520719142932"} - }, - - -- set up the spawn buttons for each department. - spawns = { - ["CIV"] = { - {x = -102.78, y = 6336.28, z = 31.49, name = "Dream View Motel (Paleto Bay)"}, - {x = 343.53, y = 2636.94, z = 43.94, name = "Eastern Motel (Sandy Shores)"}, - {x = 196.96, y = -934.54, z = 29.69, name = "Legion Square"}, - {x = -1616.69, y = -1073.81, z = 12.15, name = "Del Perro Pier"}, - {x = -1039.65, y = -2741.02, z = 12.89, name = "LSIA"} - }, - ["SAHP"] = { - {x = -447.2, y = 6009.4, z = 30.72, name = "Paleto Bay Sheriff"}, - {x = 1849.4, y = 3688.6, z = 33.27, name = "Sandy Shores Sheriff"}, - {x = 437.6, y = -986.6, z = 29.69, name = "Mission Row PD"} - }, - ["LSPD"] = { - {x = -447.2, y = 6009.4, z = 30.72, name = "Paleto Bay Sheriff"}, - {x = 1849.4, y = 3688.6, z = 33.27, name = "Sandy Shores Sheriff"}, - {x = 437.6, y = -986.6, z = 29.69, name = "Mission Row PD"} - }, - ["BCSO"] = { - {x = -447.2, y = 6009.4, z = 30.72, name = "Paleto Bay Sheriff"}, - {x = 1849.4, y = 3688.6, z = 33.27, name = "Sandy Shores Sheriff"}, - {x = 437.6, y = -986.6, z = 29.69, name = "Mission Row Police "} - }, - ["LSFD"] = { - {x = -384.07, y = 6117.9, z = 30.48, name = "Fire Station No1 (Paleto Bay)"}, - {x = 1691.5, y = 3597.95, z = 34.56, name = "Fire Station No2 (Sandy Shores)"}, - {x = 1194.71, y = -1474.14, z = 33.86, name = "Fire Station No7 (Los Santos)"} - }, - }, - - -- Money related - enableMoneySystem = true, - maxStartingCash = 2500, - maxStartingBank = 8000, - payCommand = "pay", -- Command to transfer money from your bank to another persons. - giveCommand = "give", -- Command to give someone near you cash. + characterLimit = 15, -- How many characters can a player create. + customPauseMenu = true, -- A custom pause menu will display your money, characters name and the server name in the pause menu. + enablePVP = true, -- pvp allows doing damage to other players. + -- Money related + startingCash = 2500, -- default cash the character will start with if the character creator doesn't specify it. + startingBank = 8000,-- default money in the bank account the character will start with if the character creator doesn't specify it. + + -- If you'd like to whitelist certain roles on discord then set this to true and add role ids. + enableDiscordWhitelist = false, + whitelistRoles = { + "0" + }, + -- Discord Rich presence enableRichPresence = true, updateIntervall = 60, -- how many seconds of delay until it updates status. @@ -69,4 +26,4 @@ config = { firstButtonLink = "https://discord.gg/Z9Mxu72zZ6", secondButtonName = "TEBEX", secondButtonLink = "https://andyyy.tebex.io/category/fivem-scripts" -} +} \ No newline at end of file diff --git a/ND_Core/config_server.lua b/ND_Core/config_server.lua index 65cc7c4..66cbdfb 100644 --- a/ND_Core/config_server.lua +++ b/ND_Core/config_server.lua @@ -1,6 +1,6 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 server_config = { - discordServerToken = "", -- discord bot token for permissions - guildId = "", -- discord guild id -} + discordServerToken = "OTAwODg1MDMxMDQ2Nzc0ODQ1.GU1TSC.Ed8D2_wcU-UQ1vZhe1khahgV8J3hLahOp4N1D8", -- discord bot token for permissions + guildId = "872496972454592523", -- discord guild id +} \ No newline at end of file diff --git a/ND_Core/fxmanifest.lua b/ND_Core/fxmanifest.lua index c0d34c1..ba103f8 100644 --- a/ND_Core/fxmanifest.lua +++ b/ND_Core/fxmanifest.lua @@ -1,57 +1,29 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 author "Andyyy#7666" -description "ND-Core" -version "2.0.0" +description "ND Framework Core" +version "3.0.0" fx_version "cerulean" game "gta5" lua54 "yes" -files { - "source/ui/index.html", - "source/ui/script.js", - "source/ui/style.css" -} -ui_page "source/ui/index.html" - shared_script "config_client.lua" -client_script "source/client.lua" +client_script "client/main.lua" server_scripts { + "@oxmysql/lib/MySQL.lua", "config_server.lua", - "source/server.lua" + "server/main.lua", + "server/functions.lua", + "server/events.lua" } exports { - "getCharacterInfo", + "GetCoreObject" } server_exports { - "transferBank", -- exports["ND_Core"]:transferBank(amount, player, target) - "giveCashToClosestTarget", -- exports["ND_Core"]:giveCashToClosestTarget(amount, player) - "withdrawMoney", -- exports["ND_Core"]:withdrawMoney(amount, player) - "depositMoney", -- exports["ND_Core"]:depositMoney(amount, player) - "deductMoney", -- exports["ND_Core"]:deductMoney(amount, player, from) - "addMoney", -- exports["ND_Core"]:addMoney(amount, player, to) - "getCharacterTable" -- exports["ND_Core"]:getCharacterTable() this will return a table with all the online players and their info. View below on how to use this. + "GetCoreObject" } -dependency "oxmysql" - ---[[ - Keys in the getCharacterTable: - - characterId - firstName - lastName - dob - gender - twt - dept - cash - bank - - Usage: - players = exports["ND_Core"]:getCharacterTable() - print(players[3].bank) this will print the bank account of the player with id 3. -]] \ No newline at end of file +dependency "oxmysql" \ No newline at end of file diff --git a/ND_Core/query.sql b/ND_Core/query.sql index 99656ad..606586a 100644 --- a/ND_Core/query.sql +++ b/ND_Core/query.sql @@ -6,7 +6,7 @@ CREATE TABLE `characters` ( `dob` VARCHAR(50) NULL DEFAULT NULL, `gender` VARCHAR(50) NULL DEFAULT NULL, `twt` VARCHAR(50) NULL DEFAULT NULL, - `department` VARCHAR(50) NULL DEFAULT NULL, + `job` VARCHAR(50) NULL DEFAULT NULL, `cash` INT(10) NULL DEFAULT '0', `bank` INT(10) NULL DEFAULT '0', PRIMARY KEY (`character_id`) USING BTREE diff --git a/ND_Core/server/events.lua b/ND_Core/server/events.lua new file mode 100644 index 0000000..1081bf0 --- /dev/null +++ b/ND_Core/server/events.lua @@ -0,0 +1,49 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +-- Getting all the characters the player has and returning them to the client. +RegisterNetEvent("ND:getCharacters") +AddEventHandler("ND:getCharacters", function() + local player = source + TriggerClientEvent("ND:returnCharacters", player, NDCore.functions:getPlayerCharacters(player)) +end) + +-- Creating a new character. +RegisterNetEvent("ND:newCharacter") +AddEventHandler("ND:newCharacter", function(newCharacter) + local player = source + NDCore.functions:createCharacter(player, newCharacter.firstName, newCharacter.lastName, newCharacter.dob, newCharacter.gender, newCharacter.twt, newCharacter.job, newCharacter.cash, newCharacter.bank) +end) + +-- Update the character info when edited. +RegisterNetEvent("ND:editCharacter") +AddEventHandler("ND:editCharacter", function(newCharacter) + local player = source + NDCore.functions:updateCharacterData(newCharacter.id, newCharacter.firstName, newCharacter.lastName, newCharacter.dob, newCharacter.gender, newCharacter.twt, newCharacter.job) +end) + +-- Delete character from database. +RegisterNetEvent("ND:deleteCharacter") +AddEventHandler("ND:deleteCharacter", function(characterId) + local player = source + NDCore.functions:deleteCharacter(characterId) +end) + +-- add a player to the table. +RegisterNetEvent("ND:setCharacterOnline") +AddEventHandler("ND:setCharacterOnline", function(id) + local player = source + NDCore.functions:setActiveCharacter(player, id) +end) + +-- Disconnecting a player +RegisterNetEvent("ND:exitGame") +AddEventHandler("ND:exitGame", function() + local player = source + DropPlayer(player, "Disconnected.") +end) + +-- Remove player from NDCore.players table when they leave. +AddEventHandler("playerDropped", function() + local player = source + NDCore.players[player] = nil +end) \ No newline at end of file diff --git a/ND_Core/server/functions.lua b/ND_Core/server/functions.lua new file mode 100644 index 0000000..a18af07 --- /dev/null +++ b/ND_Core/server/functions.lua @@ -0,0 +1,309 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +-- Callback to update each selected character on the server. +function NDCore.functions:getPlayers(players) + if not cb then return NDCore.players end + cb(NDCore.players) +end + +-- Used to retrive the players discord server nickname, discord name and tag, and the roles. +function NDCore.functions:getUserDiscordInfo(discordUserId) + local data + PerformHttpRequest("https://discordapp.com/api/guilds/" .. server_config.guildId .. "/members/" .. discordUserId, function(errorCode, resultData, resultHeaders) + if errorCode ~= 200 then + print("Error: " .. errorCode .. ", discord token might be missing.") + return + end + local result = json.decode(resultData) + local roles = {} + for _, roleId in pairs(result.roles) do + roles[roleId] = roleId + end + data = { + nickname = result.nick, + discordTag = tostring(result.user.username) .. "#" .. tostring(result.user.discriminator), + roles = roles + } + end, "GET", "", {["Content-Type"] = "application/json", ["Authorization"] = "Bot " .. server_config.discordServerToken}) + while not data do + Citizen.Wait(0) + end + return data +end + +-- Get player any identifier, available types: steam, license, xbl, ip, discord, live. +function NDCore.functions:GetPlayerIdentifierFromType(type, player) + local identifierCount = GetNumPlayerIdentifiers(player) + for count = 0, identifierCount do + local identifier = GetPlayerIdentifier(player, count) + if identifier and string.find(identifier, type) then + return identifier + end + end + return nil +end + +-- This will return the server id and ND player data of a nearby player. +function NDCore.functions:getNearbyPedToPlayer(player) + local pedCoords = GetEntityCoords(GetPlayerPed(player)) + for targetId, targetInfo in pairs(NDCore.players) do + local targetCoords = GetEntityCoords(GetPlayerPed(targetId)) + if #(pedCoords - targetCoords) < 2.0 and targetId ~= player then + return targetId, targetInfo + end + end +end + +-- update the players money on the client kinda like a refresh. +function NDCore.functions:updateMoney(player) + local player = tonumber(player) + MySQL.query("SELECT cash, bank FROM characters WHERE character_id = ?", {NDCore.players[player].id}, function(result) + if result then + local cash = result[1].cash + local bank = result[1].bank + NDCore.players[player].cash = cash + NDCore.players[player].bank = bank + TriggerClientEvent("ND:updateMoney", player, cash, bank) + end + end) +end + +-- Transfer money from one players bank account to another. +function NDCore.functions:transferBank(amount, player, target) + local amount = tonumber(amount) + local player = tonumber(player) + local target = tonumber(target) + if player == target then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "You can't send money to yourself."} + }) + return false + elseif GetPlayerPing(target) == 0 then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "That player does not exist."} + }) + return false + elseif amount <= 0 then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "You can't send that amount."} + }) + return false + elseif NDCore.players[player].bank < amount then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "You don't have enough money."} + }) + return false + else + MySQL.query.await("UPDATE characters SET bank = bank - ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + NDCore.functions:updateMoney(player) + MySQL.query.await("UPDATE characters SET bank = bank + ? WHERE character_id = ?", {amount, NDCore.players[target].id}) + NDCore.functions:updateMoney(target) + TriggerClientEvent("chat:addMessage", player, { + color = {0, 255, 0}, + args = {"Success", "You paid " .. NDCore.players[target].firstName .. " " .. NDCore.players[target].lastName .. " $" .. amount .. "."} + }) + return true + end +end + +-- Give cash from one players wallet to another. +function NDCore.functions:giveCash(amount, player, target) + local amount = tonumber(amount) + local player = tonumber(player) + local target = tonumber(target) + if player == target then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "You can't give money to yourself."} + }) + return false + elseif GetPlayerPing(target) == 0 then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "That player does not exist."} + }) + return false + elseif amount <= 0 then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "You can't give that amount."} + }) + return false + elseif NDCore.players[player].cash < amount then + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "You don't have enough money."} + }) + return false + else + MySQL.query.await("UPDATE characters SET cash = cash - ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + NDCore.functions:updateMoney(player) + MySQL.query.await("UPDATE characters SET cash = cash + ? WHERE character_id = ?", {amount, NDCore.players[target].id}) + NDCore.functions:updateMoney(target) + TriggerClientEvent("chat:addMessage", player, { + color = {0, 255, 0}, + args = {"Success", "You gave " .. NDCore.players[target].firstName .. " " .. NDCore.players[target].lastName .. " $" .. amount .. "."} + }) + return true + end +end + +-- Give money from a players wallet to a nearby player. +function NDCore.functions:giveCashToNearbyPlayer(player, amount) + local targetId = NDCore.functions:getNearbyPedToPlayer(player) + if targetId then + NDCore.functions:giveCash(amount, player, targetId) + return true + end + TriggerClientEvent("chat:addMessage", player, { + color = {255, 0, 0}, + args = {"Error", "No players nearby."} + }) + return false +end + +-- withdraws money from a players bank account to their wallet/cash. +function NDCore.functions:withdrawMoney(amount, player) + local amount = tonumber(amount) + local player = tonumber(player) + if amount <= 0 then return false end + if NDCore.players[player].bank < amount then return false end + MySQL.query.await("UPDATE characters SET bank = bank - ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + MySQL.query.await("UPDATE characters SET cash = cash + ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + NDCore.functions:updateMoney(player) + return true +end + +-- deposits money from a players wallet/cash to their bank account. +function NDCore.functions:depositMoney(amount, player) + local amount = tonumber(amount) + local player = tonumber(player) + if amount <= 0 then return false end + if NDCore.players[player].cash < amount then return false end + MySQL.query.await("UPDATE characters SET cash = cash - ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + MySQL.query.await("UPDATE characters SET bank = bank + ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + NDCore.functions:updateMoney(player) + return true +end + +-- Deducts money from the player, "bank" or "cash" needs to be specified. +function NDCore.functions:deductMoney(amount, player, from) + local amount = tonumber(amount) + local player = tonumber(player) + if from == "bank" then + MySQL.query.await("UPDATE characters SET bank = bank - ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + elseif from == "cash" then + MySQL.query.await("UPDATE characters SET cash = cash - ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + end + NDCore.functions:updateMoney(player) +end + +-- Adds money from the player, "bank" or "cash" needs to be specified. +function NDCore.functions:addMoney(amount, player, to) + local amount = tonumber(amount) + local player = tonumber(player) + if to == "bank" then + MySQL.query.await("UPDATE characters SET bank = bank + ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + elseif to == "cash" then + MySQL.query.await("UPDATE characters SET cash = cash + ? WHERE character_id = ?", {amount, NDCore.players[player].id}) + end + NDCore.functions:updateMoney(player) +end + +-- Adds the players character to the NDCore.players table, this table consists of every players selected character. +function NDCore.functions:setActiveCharacter(player, characterId) + local result = MySQL.query.await("SELECT * FROM characters WHERE character_id = ?", {characterId}) + if result then + local i = result[1] + NDCore.players[player] = { + id = characterId, + firstName = i.first_name, + lastName = i.last_name, + dob = i.dob, + gender = i.gender, + twt = i.twt, + job = i.job, + cash = i.cash, + bank = i.bank + } + end + TriggerClientEvent("ND:setCharacter", player, NDCore.players[player]) +end + +-- This returns all the characters the player has. +function NDCore.functions:getPlayerCharacters(player) + local characters = {} + local result = MySQL.query.await("SELECT * FROM characters WHERE license = ?", {NDCore.functions:GetPlayerIdentifierFromType("license", player)}) + for i = 1, #result do + local 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, job = temp.job, cash = temp.cash, bank = temp.bank} + end + return characters +end + +-- Creates a new character for the player and returns all their characters to the client. +function NDCore.functions:createCharacter(player, firstName, lastName, dob, gender, twt, job, cash, bank) + local license = NDCore.functions:GetPlayerIdentifierFromType("license", player) + if not cash or not bank or tonumber(cash) > config.startingCash or tonumber(bank) > config.startingBank then + cash = config.startingCash + bank = config.startingBank + end + local result = MySQL.query.await("SELECT character_id FROM characters WHERE license = ?", {license}) + if result and config.characterLimit > #result then + MySQL.query.await("INSERT INTO characters (license, first_name, last_name, dob, gender, twt, job, cash, bank) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", {license, firstName, lastName, dob, gender, twt, job, cash, bank}) + TriggerClientEvent("ND:returnCharacters", player, NDCore.functions:getPlayerCharacters(player)) + end +end + +-- Update/edit a character by character id. +function NDCore.functions:updateCharacterData(characterId, firstName, lastName, dob, gender, twt, job) + MySQL.query("UPDATE characters SET first_name = ?, last_name = ?, dob = ?, gender = ?, twt = ?, job = ? WHERE character_id = ?", {firstName, lastName, dob, gender, twt, job, characterId}) +end + +-- Delete a character by character id. +function NDCore.functions:deleteCharacter(characterId) + MySQL.query("DELETE FROM characters WHERE character_id = ?", {characterId}) +end + +function NDCore.functions:versionChecker(expectedResourceName, resourceName, downloadLink, rawGithubLink) + if expectedResourceName ~= resourceName then + print("^1[^4" .. expectedResourceName .. "^1] WARNING^0") + print("Change the resource name to ^4" .. expectedResourceName .. " ^0or else it won't work properly!") + StopResource(resourceName) + return + end + PerformHttpRequest(rawGithubLink, function(errorCode, resultData, resultHeaders) + local i, j = string.find(tostring(resultData), "version") + local resultData = string.sub(tostring(resultData), i, j + 12) + local resultData = string.gsub(resultData, "version \"", "") + local i, j = string.find(resultData, "\"") + local resultData = string.sub(resultData, 1, i - 1) + local githubVersion = string.gsub(resultData, "%.", "") + local fileVersion = string.gsub(GetResourceMetadata(expectedResourceName, "version", 0), "%.", "") + local githubVersion = tonumber(githubVersion) + local fileVersion = tonumber(fileVersion) + + if not githubVersion and not fileVersion then + print("^1[^4" .. expectedResourceName .. "^1] WARNING^0") + print("You may not have the latest version of ^4" .. expectedResourceName .. "^0. A newer, improved version may be present at ^5" .. downloadLink .. "^0") + elseif githubVersion > fileVersion then + local oldVersion = string.sub(fileVersion, 1, 1) .. "." .. string.sub(fileVersion, 2, 2) .. "." .. string.sub(fileVersion, 3, 3) + local newVersion = string.sub(githubVersion, 1, 1) .. "." .. string.sub(githubVersion, 2, 2) .. "." .. string.sub(githubVersion, 3, 3) + print("^1[^4" .. expectedResourceName .. "^1] WARNING^0") + print("^4" .. expectedResourceName .. " ^0is outdated. Please update it from ^5" .. downloadLink .. " ^0| Current Version: ^1" .. oldVersion .. " ^0| New Version: ^2" .. newVersion .. " ^0|") + elseif githubVersion < fileVersion then + local oldVersion = string.sub(fileVersion, 1, 1) .. "." .. string.sub(fileVersion, 2, 2) .. "." .. string.sub(fileVersion, 3, 3) + local newVersion = string.sub(githubVersion, 1, 1) .. "." .. string.sub(githubVersion, 2, 2) .. "." .. string.sub(githubVersion, 3, 3) + print("^1[^4" .. expectedResourceName .. "^1] WARNING^0") + print("^4" .. expectedResourceName .. " ^0version number is higher than expected | Current Version: ^3" .. oldVersion .. " ^0| Expected Version: ^2" .. newVersion .. " ^0|") + else + local newVersion = string.sub(githubVersion, 1, 1) .. "." .. string.sub(githubVersion, 2, 2) .. "." .. string.sub(githubVersion, 3, 3) + print("^4" .. expectedResourceName .. " ^0is up to date | Current Version: ^2" .. newVersion .. " ^0|") + end + end) +end +NDCore.functions:versionChecker("ND_Core", GetCurrentResourceName(), "https://github.com/Andyyy7666/ND_Framework", "https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_Core/fxmanifest.lua") \ No newline at end of file diff --git a/ND_Core/server/main.lua b/ND_Core/server/main.lua new file mode 100644 index 0000000..4e50494 --- /dev/null +++ b/ND_Core/server/main.lua @@ -0,0 +1,10 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +NDCore = {} +NDCore.players = {} +NDCore.functions = {} +NDCore.config = config + +function GetCoreObject() + return NDCore +end \ No newline at end of file diff --git a/ND_Core/source/client.lua b/ND_Core/source/client.lua deleted file mode 100644 index 6599ace..0000000 --- a/ND_Core/source/client.lua +++ /dev/null @@ -1,266 +0,0 @@ --- For support join my discord: https://discord.gg/Z9Mxu72zZ6 - -local selectedCharacter -local characterAmount = 0 - -function SetDisplay(bool, typeName, bg) - if not bg then - background = config.backgrounds[math.random(1, #config.backgrounds)] - end - SetNuiFocus(bool, bool) - SendNUIMessage({ - type = typeName, - background = background, - status = bool, - serverName = config.serverName, - characterAmount = characterAmount .. "/" .. config.characterLimit - }) -end - -function getCharacterInfo() - return selectedCharacter -end - -function start(switch) - TriggerServerEvent("checkPerms") - TriggerServerEvent("getCharacters") - TriggerServerEvent("getAop") - Citizen.Wait(100) - if switch then - local ped = PlayerPedId() - SwitchOutPlayer(ped, 0, 1) - FreezeEntityPosition(ped, true) - SetEntityVisible(ped, false, 0) - end - SendNUIMessage({ - type = "onStart", - enableMoneySystem = config.enableMoneySystem, - maxStartingBank = config.maxStartingBank, - maxStartingCash = config.maxStartingCash - }) -end - -AddEventHandler("onResourceStart", function(resourceName) - if (GetCurrentResourceName() ~= resourceName) then - return - end - Citizen.Wait(1000) - start(false) -end) - -AddEventHandler("playerSpawned", function() - print("^0This framework is created by ^5Andyyy#7666 ^0for support you can join the ^5discord: ^0https://discord.gg/Z9Mxu72zZ6") - start(true) -end) - --- This is used to add department drop down on the ui. -RegisterNetEvent("permsChecked") -AddEventHandler("permsChecked", function(allowedRoles) - for _, dept in pairs(allowedRoles) do - SendNUIMessage({ - type = "givePerms", - deptRole = dept - }) - end -end) - --- Notification when you recieve money. -RegisterNetEvent("receiveBank") -AddEventHandler("receiveBank", function(amount, playerSending, playerId) - BeginTextCommandThefeedPost("STRING") - AddTextComponentSubstringPlayerName("Received $" .. amount .. " from " .. playerSending .. " [".. playerId .."]") - EndTextCommandThefeedPostMessagetext("CHAR_BANK_FLEECA", "CHAR_BANK_FLEECA", true, 9,"FleecaBank", "") -end) - --- Notification when you receive cash. -RegisterNetEvent("receiveCash") -AddEventHandler("receiveCash", function(amount, playerSending, playerId) - BeginTextCommandThefeedPost("STRING") - AddTextComponentSubstringPlayerName(playerSending .. " gave you $" .. amount .. ".") - EndTextCommandThefeedPostMessagetext("CHAR_DEFAULT", "CHAR_DEFAULT", true, 9, playerSending .. " [".. playerId .."]", "") -end) - -RegisterNetEvent("updateMoney") -AddEventHandler("updateMoney", function(cash, bank) - selectedCharacter.cash = cash - selectedCharacter.bank = bank -end) - --- Gets all the characters and displays them on the ui. -RegisterNetEvent("returnCharacters") -AddEventHandler("returnCharacters", function(characters) - characterAmount = 0 - SendNUIMessage({ - type = "refresh" - }) - for _, character in pairs(characters) do - SendNUIMessage({ - type = "character", - id = character.id, - firstName = character.firstName, - lastName = character.lastName, - dateOfBirth = character.dob, - gender = character.gender, - twtName = character.twt, - department = character.department, - startingCash = character.cash, - startingBank = character.bank - }) - characterAmount = characterAmount + 1 - end - SetDisplay(true, "ui", background) -end) - --- Selecting a player from the iu. -RegisterNUICallback("setMainCharacter", function(data) - selectedCharacter = { - firstName = data.firstName, - lastName = data.lastName, - dob = data.dateOfBirth, - gender = data.gender, - twt = data.twtName, - department = data.department, - cash = data.startingCash, - bank = data.startingBank, - id = data.character - } - - for _, spawn in pairs(config.spawns[selectedCharacter.department]) do - SendNUIMessage({ - type = "setSpawns", - x = spawn.x, - y = spawn.y, - z = spawn.z, - name = spawn.name - }) - end - - TriggerServerEvent("characterOnline", selectedCharacter.id) - TriggerEvent("characterChanged", selectedCharacter) -end) - --- Creating a character from the ui. -RegisterNUICallback("newCharacter", function(data) - if characterAmount < config.characterLimit then - TriggerServerEvent("newCharacter", { - firstName = data.firstName, - lastName = data.lastName, - dateOfBirth = data.dateOfBirth, - gender = data.gender, - twtName = data.twtName, - department = data.department, - startingCash = data.startingCash, - startingBank = data.startingBank - }) - end -end) - --- editing a character from the ui. -RegisterNUICallback("editCharacter", function(data) - TriggerServerEvent("editCharacter", { - firstName = data.firstName, - lastName = data.lastName, - dateOfBirth = data.dateOfBirth, - gender = data.gender, - twtName = data.twtName, - department = data.department, - id = data.id - }) -end) - --- deleting a character from the ui. -RegisterNUICallback("delCharacter", function(data) - TriggerServerEvent("delCharacter", data.character) - characterAmount = characterAmount -1 - SendNUIMessage({ - characterAmount = characterAmount .. "/" .. config.characterLimit - }) -end) - --- Quit button from ui. -RegisterNUICallback("exitGame", function(data) - TriggerServerEvent("exitGame") -end) - --- Teleporting using ui. -RegisterNUICallback("tpToLocation", function(data) - local ped = PlayerPedId() - FreezeEntityPosition(ped, false) - SetEntityCoords(ped, tonumber(data.x), tonumber(data.y), tonumber(data.z), false, false, false, false) - FreezeEntityPosition(ped, true) - SwitchInPlayer(ped) - Citizen.Wait(500) - SetDisplay(false, "ui") - Citizen.Wait(500) - FreezeEntityPosition(ped, false) - SetEntityVisible(ped, true, 0) - TriggerServerEvent("getMoney", selectedCharacter.id) -end) - --- Choosing the do not tp button. -RegisterNUICallback("tpDoNot", function() - local ped = PlayerPedId() - SwitchInPlayer(ped) - Citizen.Wait(500) - SetDisplay(false, "ui") - Citizen.Wait(500) - SetEntityVisible(ped, true, 0) - FreezeEntityPosition(ped, false) - TriggerServerEvent("getMoney", selectedCharacter.id) -end) - --- discord rich presence will show on a users profile. -if config.enableRichPresence then - Citizen.CreateThread(function() - while true do - SetDiscordAppId(config.appId) - if selectedCharacter then - SetRichPresence(" Playing : " .. config.serverName .. " as " .. selectedCharacter.firstName .. " " .. selectedCharacter.lastName) - SetDiscordRichPresenceAsset(config.largeLogo) - SetDiscordRichPresenceAssetText("Playing: " .. config.serverName) - SetDiscordRichPresenceAssetSmall(config.smallLogo) - SetDiscordRichPresenceAssetSmallText("Playing as: " .. selectedCharacter.firstName .. " " .. selectedCharacter.lastName) - SetDiscordRichPresenceAction(0, config.firstButtonName, config.firstButtonLink) - SetDiscordRichPresenceAction(1, config.secondButtonName, config.secondButtonLink) - end - Citizen.Wait(config.updateIntervall * 1000) - end - end) -end - --- show server name, first name, last name, and the amount of money the character has in the pause menu. -if config.customPauseMenu then - Citizen.CreateThread(function() - while true do - Citizen.Wait(0) - if selectedCharacter then - if IsPauseMenuActive() then - BeginScaleformMovieMethodOnFrontendHeader("SET_HEADING_DETAILS") - AddTextEntry("FE_THDR_GTAO", config.serverName) - ScaleformMovieMethodAddParamPlayerNameString(selectedCharacter.firstName .. " " .. selectedCharacter.lastName) - if config.enableMoneySystem then - PushScaleformMovieFunctionParameterString("Cash: $" .. tostring(selectedCharacter.cash)) - PushScaleformMovieFunctionParameterString("Bank: $" .. tostring(selectedCharacter.bank)) - end - EndScaleformMovieMethod() - end - end - end - end) -end - --- Change character command -RegisterCommand(config.changeCharacterCommand, function() - SwitchOutPlayer(PlayerPedId(), 0, 1) - Citizen.Wait(2000) - FreezeEntityPosition(ped, true) - SetEntityVisible(ped, false, 0) - SetDisplay(true, "ui") -end, false) - --- chat suggestions -TriggerEvent("chat:addSuggestion", "/" .. config.changeCharacterCommand, "Switch your framework character.") -if config.enableMoneySystem then - TriggerEvent("chat:addSuggestion", "/" .. config.payCommand, "Transfer money to player", {{name="id", help="Player server id" }, {name="amount", help="amount to pay"}}) - TriggerEvent("chat:addSuggestion", "/" .. config.giveCommand, "Give money to closeby player", {{name="amount", help="amount to give"}}) -end diff --git a/ND_Core/source/server.lua b/ND_Core/source/server.lua deleted file mode 100644 index 2f73216..0000000 --- a/ND_Core/source/server.lua +++ /dev/null @@ -1,404 +0,0 @@ --- For support join my discord: https://discord.gg/Z9Mxu72zZ6 - -expectedName = "ND_Core" -- This is the resource and is not suggested to be changed. -resource = GetCurrentResourceName() - --- check if resource is renamed -if resource ~= expectedName then - print("^1[^4" .. expectedName .. "^1] WARNING^0") - print("Change the resource name to ^4" .. expectedName .. " ^0or else it won't work!") -end - --- add dots to version. -function fixVersion(version) - return string.sub(version, 1, 1) .. "." .. string.sub(version, 2, 2) .. "." .. string.sub(version, 3, 3) -end - --- check if resource version is up to date -PerformHttpRequest("https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_Core/fxmanifest.lua", function(errorCode, resultData, resultHeaders) - i, j = string.find(tostring(resultData), "version") - resultData = string.sub(tostring(resultData), i, j + 12) - resultData = string.gsub(resultData, "version \"", "") - i, j = string.find(resultData, "\"") - resultData = string.sub(resultData, 1, i - 1) - local githubVersion = string.gsub(resultData, "%.", "") - local fileVersion = string.gsub(GetResourceMetadata(expectedName, "version", 0), "%.", "") - githubVersion = tonumber(githubVersion) - fileVersion = tonumber(fileVersion) - - if githubVersion and fileVersion then - if githubVersion > fileVersion then - print("^1[^4" .. expectedName .. "^1] WARNING^0") - print("^4" .. expectedName .. " ^0is outdated. Please update it from ^5https://github.com/Andyyy7666/ND_Framework ^0| Current Version: ^1" .. fixVersion(fileVersion) .. " ^0| New Version: ^2" .. fixVersion(githubVersion) .. " ^0|") - elseif githubVersion < fileVersion then - print("^1[^4" .. expectedName .. "^1] WARNING^0") - print("^4" .. expectedName .. " ^0version number is higher than expected | Current Version: ^3" .. fixVersion(fileVersion) .. " ^0| Expected Version: ^2" .. fixVersion(githubVersion) .. " ^0|") - else - print("^4" .. expectedName .. " ^0is up to date | Current Version: ^2" .. fixVersion(fileVersion) .. " ^0|") - end - else - print("^1[^4" .. expectedName .. "^1] WARNING^0") - print("You may not have the latest version of ^4" .. expectedName .. "^0. A newer, improved version may be present at ^5https://github.com/Andyyy7666/ND_Framework^0") - end -end) - --- Used to retrive the players discord server nickname, discord name and tag, and the roles. -function getUserDiscordInfo(discordUserId) - local data - PerformHttpRequest("https://discordapp.com/api/guilds/" .. server_config.guildId .. "/members/" .. discordUserId, function(errorCode, resultData, resultHeaders) - if errorCode ~= 200 then - return - end - local result = json.decode(resultData) - local roles = {} - for _, roleId in pairs(result.roles) do - roles[roleId] = roleId - end - data = { - nickname = result.nick, - discordTag = tostring(result.user.username) .. "#" .. tostring(result.user.discriminator), - roles = roles - } - end, "GET", "", {["Content-Type"] = "application/json", ["Authorization"] = "Bot " .. server_config.discordServerToken}) - while not data do - Citizen.Wait(0) - end - return data -end - --- Get player any identifier, available types: steam, license, xbl, ip, discord, live. -function GetPlayerIdentifierFromType(type, source) - local identifierCount = GetNumPlayerIdentifiers(source) - for count = 0, identifierCount do - local identifier = GetPlayerIdentifier(source, count) - if identifier and string.find(identifier, type) then - return identifier - end - end - 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 departmentExists = config.departments[department] - if departmentExists then - local discordUserId = string.gsub(GetPlayerIdentifierFromType("discord", player), "discord:", "") - local roles = getUserDiscordInfo(discordUserId).roles - - for _, roleId in pairs(departmentExists) do - if roles[roleId] or roleId == 0 or roleId == "0" then - return true - end - end - end - return false -end - -RegisterNetEvent("checkPerms") -AddEventHandler("checkPerms", function() - local player = source - local discordUserId = string.gsub(GetPlayerIdentifierFromType("discord", player), "discord:", "") - local allowedRoles = {} - local roles = getUserDiscordInfo(discordUserId).roles - - for dept, roleTable in pairs(config.departments) do - for _, roleId in pairs(roleTable) do - if roles[roleId] or roleId == 0 or roleId == "0" then - table.insert(allowedRoles, dept) - end - end - end - - TriggerClientEvent("permsChecked", player, allowedRoles) -end) - --- Inserting the players characters into characters table -RegisterNetEvent("getCharacters") -AddEventHandler("getCharacters", function() - local player = source - local characters = {} - 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) - --- Creating a new character and increasing the character id. -RegisterNetEvent("newCharacter") -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 - - if config.enableMoneySystem then - -- Don't trust the client, validate maximum amounts. - local moneyCheck = validateMoney(startingCash, startingBank) - - -- 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 - 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, first_name, last_name, dob, gender, twt, department, cash, bank) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", {license, 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 - end) -end) - --- Delete character from database. -RegisterNetEvent("delCharacter") -AddEventHandler("delCharacter", function(character_id) - local player = source - local license = GetPlayerIdentifierFromType("license", player) - 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 - - -- 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) - --- onlinePlayers table, this is used to store all the players current character info on the server. -onlinePlayers = {} - --- add a player to the table. -RegisterNetEvent("characterOnline") -AddEventHandler("characterOnline", function(id) - local player = source - local license = GetPlayerIdentifierFromType("license", player) - 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) - --- Remove player from onlinePlayers table when they leave. -AddEventHandler("playerDropped", function(reason) - local player = source - onlinePlayers[player] = nil -end) - --- Disconnecting a player -RegisterNetEvent("exitGame") -AddEventHandler("exitGame", function() - local player = source - DropPlayer(player, "Disconnected using framework.") -end) - --- this is for the exports -function getCharacterTable() - return onlinePlayers -end - -function updateMoney(player) - local player = tonumber(player) - local license = GetPlayerIdentifierFromType("license", player) - exports.oxmysql:query("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {license, onlinePlayers[player].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("updateMoney", player, cash, bank) - end - end) -end - -function transferBank(amount, player, target) - local amount = tonumber(amount) - local player = tonumber(player) - local target = tonumber(target) - if player == target then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "You can't send money to yourself."} - }) - return false - elseif GetPlayerPing(target) == 0 then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "That player does not exist."} - }) - return false - elseif onlinePlayers[player].bank < amount then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "You don't have enough money."} - }) - return false - else - exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - updateMoney(player) - exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId}) - 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) - return true - end -end - -function giveCashToClosestTarget(amount, player) - local amount = tonumber(amount) - local player = tonumber(player) - local playerFound = false - local playerCoords = GetEntityCoords(GetPlayerPed(player)) - if onlinePlayers[player].cash < amount then - TriggerClientEvent("chat:addMessage", player, { - color = {255, 0, 0}, - args = {"Error", "You don't have enough money."} - }) - return false - else - for targetId, targetInfo in pairs(onlinePlayers) do - local targetCoords = GetEntityCoords(GetPlayerPed(targetId)) - if (#(playerCoords - targetCoords) < 2.0) and (targetId ~= 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}) - updateMoney(player) - exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", targetId), tonumber(targetInfo.characterId)}) - updateMoney(targetId) - playerFound = true - TriggerClientEvent("chat:addMessage", player, { - color = {0, 255, 0}, - args = {"Success", "You gave " .. onlinePlayers[targetId].firstName .. " " .. onlinePlayers[targetId].lastName .. " $" .. amount .. "."} - }) - TriggerClientEvent("receiveCash", targetId, 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."} - }) - return false - end - playerFound = false - return true - end -end - -function withdrawMoney(amount, player) - local amount = tonumber(amount) - local player = tonumber(player) - if onlinePlayers[player].bank >= amount then - 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}) - Citizen.Wait(500) - updateMoney(player) - return true - end - return false -end - -function depositMoney(amount, player) - local amount = tonumber(amount) - local player = tonumber(player) - if onlinePlayers[player].cash >= amount then - 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}) - Citizen.Wait(500) - updateMoney(player) - return true - end - return false -end - -function deductMoney(amount, player, from) - local amount = tonumber(amount) - local player = tonumber(player) - if from == "bank" then - exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - Citizen.Wait(500) - updateMoney(player) - elseif from == "cash" then - exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - Citizen.Wait(500) - updateMoney(player) - end -end - -function addMoney(amount, player, to) - local amount = tonumber(amount) - local player = tonumber(player) - if to == "bank" then - exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - Citizen.Wait(500) - updateMoney(player) - elseif to == "cash" then - exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) - Citizen.Wait(500) - updateMoney(player) - end -end - --- paying command. -RegisterCommand(config.payCommand, function(source, args, raw) - local player = source - local target = tonumber(args[1]) - local amount = math.floor(tonumber(args[2])) - transferBank(amount, player, target) -end) - --- Give money command. -RegisterCommand(config.giveCommand, function(source, args, raw) - local player = source - local amount = math.floor(tonumber(args[1])) - giveCashToClosestTarget(amount, player) -end) diff --git a/ND_Doorlocks/config.lua b/ND_Doorlocks/config.lua index c57eed2..e1897ba 100644 --- a/ND_Doorlocks/config.lua +++ b/ND_Doorlocks/config.lua @@ -1,7 +1,7 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 doorList = { - -- Sandy Shores Sheriff's Office front door. + -- Sandy Shores Sheriff office front door. { textCoords = vector3(1855.1896, 3683.4507, 34.2675), authorizedJobs = {"BCSO", "LSPD", "BCSO"}, @@ -12,7 +12,7 @@ doorList = { } }, - -- Paleto Bay Sheriff's Office front doors. + -- Paleto bay Sheriff office office front doors. { textCoords = vector3(-443.6129, 6016.0483, 31.7164), authorizedJobs = {"BCSO", "LSPD", "BCSO"}, @@ -35,4 +35,4 @@ doorList = { {hash = 320433149, coords = vector3(434.8228, -982.7103, 30.6896), heading = 272.0} } }, -} +} \ No newline at end of file diff --git a/ND_Doorlocks/fxmanifest.lua b/ND_Doorlocks/fxmanifest.lua index 689b7a4..3e7bc31 100644 --- a/ND_Doorlocks/fxmanifest.lua +++ b/ND_Doorlocks/fxmanifest.lua @@ -2,7 +2,7 @@ author "Andyyy#7666" description "ND Framework Doorlocks for buildings" -version "2.0.0" +version "2.1.0" fx_version "cerulean" game "gta5" diff --git a/ND_Doorlocks/source/client.lua b/ND_Doorlocks/source/client.lua index 03c7567..00723d0 100644 --- a/ND_Doorlocks/source/client.lua +++ b/ND_Doorlocks/source/client.lua @@ -1,4 +1,7 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +NDCore = exports["ND_Core"]:GetCoreObject() +local job = NDCore.functions:getSelectedCharacter().job local hasAccess = false function drawText3D(coords, text) @@ -17,9 +20,17 @@ end function getDoorText(locked) if locked then - return "Locked [E]" + if hasAccess then + return "Locked [E]" + else + return "Locked" + end + end + if hasAccess then + return "Unlocked [E]" + else + return "" end - return "Unlocked [E]" end function isAuthorized(door) @@ -31,21 +42,15 @@ function isAuthorized(door) return false end +RegisterNetEvent("ND:setCharacter") +AddEventHandler("ND:setCharacter", function(character) + job = character.job +end) + AddEventHandler("playerSpawned", function() TriggerServerEvent("ND_Doorlocks:getDoors") end) -AddEventHandler("onResourceStart", function(resourceName) - if (GetCurrentResourceName() ~= resourceName) then - return - end - job = exports["ND_Core"]:getCharacterInfo().department -end) - -AddEventHandler("characterChanged", function(selectedCharacter) - job = selectedCharacter.department -end) - Citizen.CreateThread(function() while true do pedCoords = GetEntityCoords(PlayerPedId()) @@ -58,9 +63,7 @@ Citizen.CreateThread(function() for doorID, door in pairs(doorList) do if #(pedCoords - door.textCoords) < door.accessDistance then hasAccess = isAuthorized(door) - if hasAccess then - drawText3D(door.textCoords, getDoorText(door.locked)) - end + drawText3D(door.textCoords, getDoorText(door.locked)) for _, doors in pairs(door.doors) do local entity = GetClosestObjectOfType(doors.coords.x, doors.coords.y, doors.coords.z, 1.0, doors.hash, false, false, false) FreezeEntityPosition(entity, door.locked) @@ -97,4 +100,4 @@ AddEventHandler("ND_Doorlocks:returnDoors", function(updatedDoors) FreezeEntityPosition(entity, state) end end -end) +end) \ No newline at end of file diff --git a/ND_Doorlocks/source/server.lua b/ND_Doorlocks/source/server.lua index 42d9015..ce23eb4 100644 --- a/ND_Doorlocks/source/server.lua +++ b/ND_Doorlocks/source/server.lua @@ -1,4 +1,8 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +NDCore = exports["ND_Core"]:GetCoreObject() +NDCore.functions:versionChecker("ND_Doorlocks", GetCurrentResourceName(), "https://github.com/Andyyy7666/ND_Framework", "https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_Doorlocks/fxmanifest.lua") + local updatedDoors = {} RegisterNetEvent("ND_Doorlocks:syncDoor") @@ -11,4 +15,4 @@ RegisterNetEvent("ND_Doorlocks:getDoors") AddEventHandler("ND_Doorlocks:getDoors", function() local player = source TriggerClientEvent("ND_Doorlocks:returnDoors", player, updatedDoors) -end) +end) \ No newline at end of file diff --git a/ND_Jailing/config_client.lua b/ND_Jailing/config_client.lua index 22d9ec4..28478ff 100644 --- a/ND_Jailing/config_client.lua +++ b/ND_Jailing/config_client.lua @@ -1,24 +1,24 @@ config = { - maxJailTime = 300, -- Max time in seconds that someone can jail another player for. + maxJailTime = 300, -- Max time in seconds that someone can jail another player. jailDistance = 90.0, -- How far can the player go from the Jail coordinates. If the player is further than the set amount they will be teleported back. jailCoords = {x = 1680.21, y = 2513.25, z = 44.56, h = 6.53}, releaseCoords = {x = 1840.22, y = 2608.42, z = 45.58, h = 270.09}, - -- Where can players access the UI from. + -- Where can players access it from. accessLocation = { {x = -450.17, y = 6012.62, z = 31.71}, -- Paleto Bay Sheriff's Office {x = 1853.57, y = 3690.74, z = 34.26}, -- Sandy Shores Sheriff's Office {x = 460.53, y = -988.84, z = 24.91} -- Mission Row PD }, - -- Departments that can access the jail UI. + -- Departments that can access the jail tablet. accessDepartments = { "SAHP", "LSPD", "BCSO" }, - -- How close the player must be to access the jail UI + -- How close does the player have to be to the coordiantes to be able to open the tablet. accessDistance = 1.2, -} +} \ No newline at end of file diff --git a/ND_Jailing/config_server.lua b/ND_Jailing/config_server.lua index 0ff9b88..f5d8c19 100644 --- a/ND_Jailing/config_server.lua +++ b/ND_Jailing/config_server.lua @@ -1,3 +1,3 @@ server_config = { - discordWebhook = "", + discordWebhook = "https://discord.com/api/webhooks/873744008122335252/zk53XWv0ZfD-BD2Su6VYGPzUgNW0NjLrj7hVBQFVgp_ByO0f0rpMwx7fsNNNjyVp4GUT", } \ No newline at end of file diff --git a/ND_Jailing/fxmanifest.lua b/ND_Jailing/fxmanifest.lua index 8882799..eac87aa 100644 --- a/ND_Jailing/fxmanifest.lua +++ b/ND_Jailing/fxmanifest.lua @@ -2,7 +2,7 @@ author "Andyyy#7666" description "ND Framework Jailing" -version "2.0.0" +version "2.1.0" fx_version "cerulean" game "gta5" @@ -20,4 +20,6 @@ client_script "source/client.lua" server_scripts { "config_server.lua", "source/server.lua" -} \ No newline at end of file +} + +dependency "ND_Core" \ No newline at end of file diff --git a/ND_Jailing/source/client.lua b/ND_Jailing/source/client.lua index fc29cf4..20005bf 100644 --- a/ND_Jailing/source/client.lua +++ b/ND_Jailing/source/client.lua @@ -2,6 +2,7 @@ local display = false local nearJailingUi = false local jailTime = 0 local ped +NDCore = exports["ND_Core"]:GetCoreObject() function SetDisplay(bool) display = bool @@ -40,9 +41,9 @@ function drawText3D(coords, text) end function hasAccess() - local selectedDepartment = exports["ND_Core"]:getCharacterInfo().department + local job = NDCore.functions:getSelectedCharacter().job for _, department in pairs(config.accessDepartments) do - if department == selectedDepartment then + if department == job then return true end end diff --git a/ND_Jailing/source/server.lua b/ND_Jailing/source/server.lua index d21a3f8..fa6daa6 100644 --- a/ND_Jailing/source/server.lua +++ b/ND_Jailing/source/server.lua @@ -1,3 +1,6 @@ +NDCore = exports["ND_Core"]:GetCoreObject() +NDCore.functions:versionChecker("ND_Jailing", GetCurrentResourceName(), "https://github.com/Andyyy7666/ND_Framework", "https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_Jailing/fxmanifest.lua") + local jailedPlayers = {} -- Get player any identifier, available types: steam, license, xbl, ip, discord, live. diff --git a/ND_ShotSpotter/config_client.lua b/ND_ShotSpotter/config_client.lua index cf2b797..37a0cf0 100644 --- a/ND_ShotSpotter/config_client.lua +++ b/ND_ShotSpotter/config_client.lua @@ -1,21 +1,21 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 config = { - shotSpotterDelay = 10, -- How long until the police are notified about the shooting (in seconds). + shotSpotterDelay = 10, -- delay (in seconds) when cops will receive a notification after there has been a shooting. shotSpotterTimer = 120, -- How long should the shot spotter stay on the map. - shotSpotterCooldown = 30, -- How long until the shot spotter can be activated again. + shotSpotterCooldown = 30, -- Cooldown for the next time a player can trigger it again. - shotSpotterUsePostal = true, -- If you're using a postal script turn this to true. - postalResourceName = "nearest-postal", -- the resource name of the postal script, this is used for the export. + shotSpotterUsePostal = true, -- if you're using the nearest postal script turn this to true. + postalResourceName = "nearest-postal", -- the resource name of the nearest postal script, this is used for the export. - -- What departments should recieve the alerts. + -- This is the departments that will receive the shot spotter alerts. receiveAlerts = { "SAHP", "LSPD", "BCSO" }, - -- What weapons will not trigger the shot spotter. + -- Weapon that won't be triggered by the shot spotter. weaponBlackList = { "weapon_flaregun", "weapon_stungun_mp", @@ -35,7 +35,7 @@ config = { "weapon_fertilizercan" }, - useRealisticShotSpotter = false, -- Enable this if you want the shot spotters to only be in the locations below. (default is in and around Los Santos) + useRealisticShotSpotter = false, -- this is if you want to enable the shot spotter only when the player is inside one of the zones below. The zones are in the city and a little around it. realisticShotSpotterLocations = { {x = 653.4214, y = -648.7440, z = 57.1897}, {x = 1015.9837, y = -255.2573, z = 85.5857}, @@ -51,11 +51,11 @@ config = { {x = 716.6274, y = -1958.7434, z = 44.7564} }, - testing = false -- If you're adding zones and want to test them easier, set this to true. Otherwise keep it false. + testing = false -- if you're adding zones above and want to enable the blips on the map to see where the zone is then turn this on, otherwise turn it off. } function notify(message) BeginTextCommandThefeedPost("STRING") AddTextComponentSubstringPlayerName(message) EndTextCommandThefeedPostTicker(0,1) -end +end \ No newline at end of file diff --git a/ND_ShotSpotter/config_server.lua b/ND_ShotSpotter/config_server.lua index 9e83a01..fd0cae7 100644 --- a/ND_ShotSpotter/config_server.lua +++ b/ND_ShotSpotter/config_server.lua @@ -1,4 +1,4 @@ server_config = { - useDiscordLogging = false, - discordWebhook = "", + useDiscordLogging = true, + discordWebhook = "https://discord.com/api/webhooks/873744008122335252/zk53XWv0ZfD-BD2Su6VYGPzUgNW0NjLrj7hVBQFVgp_ByO0f0rpMwx7fsNNNjyVp4GUT", } \ No newline at end of file diff --git a/ND_ShotSpotter/fxmanifest.lua b/ND_ShotSpotter/fxmanifest.lua index 942d674..26fe7fd 100644 --- a/ND_ShotSpotter/fxmanifest.lua +++ b/ND_ShotSpotter/fxmanifest.lua @@ -2,7 +2,7 @@ author "Andyyy#7666" description "Shot Spotter Script (ND Framework)" -version "2.0.0" +version "2.1.0" fx_version "cerulean" game "gta5" @@ -17,4 +17,4 @@ client_scripts { "source/client.lua" } -dependency "ND_Core" +dependency "ND_Core" \ No newline at end of file diff --git a/ND_ShotSpotter/source/client.lua b/ND_ShotSpotter/source/client.lua index a84cc0f..ad279c2 100644 --- a/ND_ShotSpotter/source/client.lua +++ b/ND_ShotSpotter/source/client.lua @@ -1,5 +1,6 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 +NDCore = exports["ND_Core"]:GetCoreObject() local alreadyShot = false local setRoute = false local route = false @@ -25,9 +26,9 @@ end -- check if the players department can receive shot spotter alerts. function isCop() - local selectedDepartment = exports["ND_Core"]:getCharacterInfo().department + local job = NDCore.functions:getSelectedCharacter().job for _, department in pairs(config.receiveAlerts) do - if department == selectedDepartment then + if department == job then return true end end diff --git a/ND_ShotSpotter/source/server.lua b/ND_ShotSpotter/source/server.lua index a4a2186..5666879 100644 --- a/ND_ShotSpotter/source/server.lua +++ b/ND_ShotSpotter/source/server.lua @@ -1,5 +1,8 @@ -- For support join my discord: https://discord.gg/Z9Mxu72zZ6 +NDCore = exports["ND_Core"]:GetCoreObject() +NDCore.functions:versionChecker("ND_ShotSpotter", GetCurrentResourceName(), "https://github.com/Andyyy7666/ND_Framework", "https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_ShotSpotter/fxmanifest.lua") + RegisterNetEvent("ND_ShotSpotter:Trigger") AddEventHandler("ND_ShotSpotter:Trigger", function(street, pedCoords, postal, zoneName) if server_config.useDiscordLogging then