commit ae32fd0e86c690f393db01da4fba7911fa8dbb68
Author: Andyyy7666 <86536434+Andyyy7666@users.noreply.github.com>
Date: Thu Dec 23 22:40:54 2021 +0100
Add files via upload
diff --git a/ND_Core/config.lua b/ND_Core/config.lua
new file mode 100644
index 0000000..e9f88d7
--- /dev/null
+++ b/ND_Core/config.lua
@@ -0,0 +1,114 @@
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-- --
+-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 --
+-- --
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+
+config = {
+ -- Server name to display on the ui.
+ serverName = "Andy's Development",
+ characterLimit = 100,
+ changeCharacterCommand = "changecharacter", -- this is the command to open the ui again and change your character.
+
+ -- 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
+ "https://i.imgur.com/7jM5nZT.png" -- Credits: 2XRondo#6374
+ },
+
+ -- discord bot token for permissions
+ DiscordToken = "0", -- token
+ GuildId = "0", -- discord guild id
+
+ -- set up your departments here, then set up the permissions for them below.
+ departments = {
+ "CIV",
+ "SAHP",
+ "LSPD",
+ "BCSO",
+ "LSFD"
+ },
+
+ -- role id for each role of the department in your discord. 0 Gives the role to everyone.
+ roles = {
+ ["ADMIN"] = "0", -- You can remove this if you don't want it but this should only be here for permisisons not as a department and it won't display as a department. This can be used for /setaop and other permissions.
+ ["CIV"] = "0",
+ ["SAHP"] = "0",
+ ["LSPD"] = "0",
+ ["BCSO"] = "0",
+ ["LSFD"] = "0"
+ },
+
+ -- 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
+ payCommand = "pay", -- Command to transfer someone money from bank account.
+ giveCommand = "give", -- Command to give someone close money from wallet.
+
+ salaryAmount = 300, -- the daily amount that players will receive.
+ salaryInterval = 24, -- every x minutes the player will receive the salaryAmount.
+
+ -- Shot spotter related, WARNING: Shot spotter will add a 0.01 ms.
+ shotSpotterEnabled = true, -- will the shot spotter be enabled when a civilian shoots their weapon.
+ shotSpotterDelay = 5, -- delay (in seconds) when cops will receive a notification that there has been a shooting.
+ shotSpotterTimer = 25, -- How long should the shot spotter stay on the map.
+ shotSpotterCooldown = 10, -- Cooldown for the next time a player can trigger it again.
+ shotSpotterUsePostal = false, -- if you're using the nearest postal script turn this to true.
+
+ enableAopCommand = true,
+ aopCommand = "setaop",
+ checkAopCommand = "aop",
+ defaultAop = "Unknown",
+
+ -- Hide reticle or default gta money and ammo dispaly. WARNING: turning all to true will add a 0.01 ms.
+ hideReticle = true, -- hide weapon reticle.
+ hideAmmoAndMoney = true, -- hides the default gta ammo & money.
+ customPauseMenu = true, -- this will create a custom pause menu. It will display your money, characters name. And server name in the pause menu.
+
+ -- Discord Rich precence
+ enableRichPrecence = true,
+ updateIntervall = 60, -- how many seconds delay until it updates status.
+ appId = 912361433273102356,
+ largeLogo = "anyydevlogo",
+ smallLogo = "anyydevlogo",
+ firstButtonName = "DISCORD",
+ firstButtonLink = "https://discord.gg/Z9Mxu72zZ6",
+ secondButtonName = "TEBEX",
+ secondButtonLink = "https://andyyy.tebex.io/category/fivem-scripts",
+
+ -- set to true for debug mode, this will print database and some other stuff in the console.
+ debugMode = false
+}
\ No newline at end of file
diff --git a/ND_Core/fxmanifest.lua b/ND_Core/fxmanifest.lua
new file mode 100644
index 0000000..6471239
--- /dev/null
+++ b/ND_Core/fxmanifest.lua
@@ -0,0 +1,43 @@
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-- DO NOT EDIT IF YOU DON'T KNOW WHAT YOU'RE DOING --
+-- --
+-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 --
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+
+fx_version "cerulean"
+game "gta5"
+lua54 "yes"
+
+author "Andyyy#7666"
+description "ND Framework Core"
+version "1.0"
+
+files {
+ "source/ui/index.html",
+ "source/ui/js/jquery-3.6.0.min.js",
+ "source/ui/js/listener.js",
+ "source/ui/Logo.png",
+ "source/ui/style.css",
+}
+
+ui_page "source/ui/index.html"
+
+shared_script "config.lua"
+
+server_scripts {
+ "source/server/discord.lua",
+ "source/server/main.lua",
+ "source/server/commands.lua"
+}
+client_scripts {
+ "source/client/main.lua",
+ "source/client/commands.lua"
+}
+
+exports {
+ "getCharacterInfo", -- getCharacterInfo(int), 1 will return return FirstName, 2 LastName, 3 DateOfBirth, 4 Gender, 5 TwtName, 6 Department, 7 Cash, 8 Bank. 9 will return their character id.
+ "sendBank", -- sendBank(sendingCharacterId, receiveingPlayerId, amount, sendingPlayerId)
+ "sendCash" -- sendCash(sendingCharacterId, amount, sendingPlayerId)
+}
\ No newline at end of file
diff --git a/ND_Core/query.sql b/ND_Core/query.sql
new file mode 100644
index 0000000..4c8726e
--- /dev/null
+++ b/ND_Core/query.sql
@@ -0,0 +1,15 @@
+CREATE TABLE `characters` (
+ `license` VARCHAR(200) NOT NULL DEFAULT '0' COLLATE 'utf8mb4_general_ci',
+ `character_id` INT(50) NULL DEFAULT NULL,
+ `first_name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
+ `last_name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
+ `dob` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
+ `gender` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
+ `twt` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
+ `department` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
+ `cash` INT(11) NULL DEFAULT NULL,
+ `bank` INT(11) NULL DEFAULT NULL
+)
+COLLATE='utf8mb4_general_ci'
+ENGINE=InnoDB
+;
\ No newline at end of file
diff --git a/ND_Core/source/client/commands.lua b/ND_Core/source/client/commands.lua
new file mode 100644
index 0000000..4d43752
--- /dev/null
+++ b/ND_Core/source/client/commands.lua
@@ -0,0 +1,109 @@
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-- DO NOT EDIT IF YOU DON'T KNOW WHAT YOU'RE DOING --
+-- --
+-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 --
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+
+-- Aop command
+if config.enableAopCommand then
+ TriggerEvent("chat:addSuggestion", "/" .. config.aopCommand, "Change the Area of Play.", {
+ { name="Area", help="Area of Play" }
+ })
+ TriggerEvent("chat:addSuggestion", "/" .. config.checkAopCommand, "Check the current Area of Play.", {})
+ RegisterCommand(config.checkAopCommand, function(source, args, raw)
+ TriggerServerEvent("getAop")
+ end, false)
+ RegisterCommand(config.aopCommand, function(source, args, raw)
+ if admin == true then
+ TriggerServerEvent("registerAop", string.gsub(raw, config.aopCommand .. " ", ""))
+ else
+ TriggerEvent("chat:addMessage", {
+ args = {"~r~You don't have permission to set the aop."}
+ })
+ end
+ end, false)
+ RegisterNetEvent("setAop")
+ AddEventHandler("setAop", function(aop)
+ SendNUIMessage({
+ type = "aop",
+ aop = "Current AOP: " .. aop
+ })
+ TriggerEvent("chat:addMessage", {
+ args = {"~b~Aop has been changed to: " .. aop}
+ })
+ end)
+ RegisterNetEvent("returnAop")
+ AddEventHandler("returnAop", function(aop)
+ SendNUIMessage({
+ type = "aop",
+ aop = "Current AOP: " .. aop
+ })
+ TriggerEvent("chat:addMessage", {
+ args = {"~b~The current AOP is: " .. aop}
+ })
+ end)
+end
+
+-- Money commands
+RegisterCommand(config.payCommand, function(source, args, raw)
+ sendBank(mainCharaterId, args[1], args[2], GetPlayerServerId(PlayerId()))
+end)
+RegisterCommand(config.giveCommand, function(source, args, raw)
+ sendCash(mainCharaterId, args[1], GetPlayerServerId(PlayerId()))
+end)
+
+-- Twotter command
+RegisterCommand("twt", function(source, args, rawCommand)
+ TriggerServerEvent("twt", GetPlayerServerId(PlayerId()), mainTwtName, string.gsub(rawCommand, "twt", ""))
+end, false)
+RegisterNetEvent("twt")
+AddEventHandler("twt", function(id, twtName, twt)
+ TriggerEvent("chat:addMessage", {
+ template = " {0}: {1}",
+ multiline = true,
+ args = {"^4@" .. twtName .. " (#" .. id .. ")", twt}
+ })
+end)
+
+-- Me command
+RegisterCommand("me", function(source, args, rawCommand)
+ TriggerServerEvent("me", GetPlayerServerId(PlayerId()), mainFirstName .. " " .. mainLastName, string.gsub(rawCommand, "twt", ""), GetEntityCoords(PlayerPedId()))
+end, false)
+RegisterNetEvent("me")
+AddEventHandler("me", function(id, name, msg, coords)
+ if #(coords - GetEntityCoords(PlayerPedId())) < 19.999 then
+ TriggerEvent("chat:addMessage", {
+ color = {255, 0, 0},
+ args = {"^*ME | ^0" .. name .. " (#" .. id .. ")", msg}
+ })
+ end
+end)
+
+-- Change character command
+TriggerEvent("chat:addSuggestion", "/" .. config.changeCharacterCommand, "Switch your framework character.", {})
+RegisterCommand(config.changeCharacterCommand, function()
+ SwitchOutPlayer(PlayerPedId(), 0, 1)
+ Citizen.Wait(2000)
+ FreezeEntityPosition(ped, true)
+ SetEntityVisible(ped, false, 0)
+ SetDisplay(true, "ui")
+end, false)
+
+-- Help command
+RegisterCommand("help", function(source, args, rawCommand)
+ TriggerEvent("chat:addMessage", {
+ color = {252, 186, 3},
+ args = {"^*Help | ", "/twt, /ooc, /darkweb, /me, /setAop, /aop, /pay, /give, /changecharacter"}
+ })
+end, false)
+
+-- chat suggestions
+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" }})
+TriggerEvent("chat:addSuggestion", "/twt", "Send a Twotter in game. (Global Chat)", {{ name="Message", help="Twotter Message."}})
+TriggerEvent("chat:addSuggestion", "/ooc", "Out Of Character chat Message. (Global Chat)", {{ name="Message", help="Put your questions or help request."}})
+TriggerEvent("chat:addSuggestion", "/darkweb", "Send a anonymous message in game. (Global Chat)", {{ name="Message", help="Anonymous Message."}})
+TriggerEvent("chat:addSuggestion", "/me", "Send message in the third person. (Proximity Chat)", {{ name="Action", help="action."}})
+TriggerEvent("chat:addSuggestion", "/help", "", {})
\ No newline at end of file
diff --git a/ND_Core/source/client/main.lua b/ND_Core/source/client/main.lua
new file mode 100644
index 0000000..6860bf9
--- /dev/null
+++ b/ND_Core/source/client/main.lua
@@ -0,0 +1,454 @@
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-- DO NOT EDIT IF YOU DON'T KNOW WHAT YOU'RE DOING --
+-- --
+-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 --
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+
+started = true
+registered = false
+admin = false
+
+RegisterNetEvent("permsChecked")
+AddEventHandler("permsChecked", function(role, rolePermission)
+ if rolePermission == true then
+ if role == "ADMIN" then
+ admin = true
+ else
+ SendNUIMessage({
+ type = "givePerms",
+ deptRole = role
+ })
+ end
+ end
+end)
+
+Citizen.CreateThread(function()
+ while started do
+ Citizen.Wait(200)
+ local ped = PlayerPedId()
+ if IsPedOnFoot(ped) or IsPedInVehicle(ped, GetVehiclePedIsIn(ped, false), false) then
+ print("^0This framework is created by ^5Andyyy#7666 ^0for support you can join the ^5discord: ^0https://discord.gg/Z9Mxu72zZ6")
+ for i = 1, #config.departments do -- if you have an error that says attempt to index a nil value (global 'config') it's beacuse you have edited the config wrong.
+ TriggerServerEvent("checkPerms", config.departments[i])
+ end
+ Citizen.Wait(10)
+ TriggerServerEvent("checkPerms", "ADMIN")
+ Citizen.Wait(10)
+ TriggerServerEvent("getCharacters")
+ Citizen.Wait(100)
+ TriggerServerEvent("getAop")
+ Citizen.Wait(10)
+ SwitchOutPlayer(ped, 0, 1)
+ FreezeEntityPosition(ped, true)
+ SetEntityVisible(ped, false, 0)
+ started = false
+ end
+ end
+end)
+
+RegisterNUICallback("exitGame", function(data)
+ TriggerServerEvent("exitGame", GetPlayerServerId(PlayerId()))
+end)
+
+RegisterNetEvent("returnCharacters")
+AddEventHandler("returnCharacters", function(characters)
+ for i = 1, #characters do
+ index = characters[i]
+ if config.debugMode then
+ print(index.id .. " " .. index.firstName .. " " .. index.lastName .. " " .. index.dob .. " " .. index.gender .. index.twt .. " " .. index.department .. " " .. index.cash .. " " .. index.bank)
+ end
+ SendNUIMessage({
+ type = "character",
+ id = index.id,
+ firstName = index.firstName,
+ lastName = index.lastName,
+ dateOfBirth = index.dob,
+ gender = index.gender,
+ twtName = index.twt,
+ department = index.department,
+ startingCash = index.cash,
+ startingBank = index.bank
+ })
+ end
+ characterAmount = #characters
+ if config.debugMode then
+ print("Characters: " .. characterAmount .. "/" .. config.characterLimit)
+ end
+ SetDisplay(true, "ui")
+end)
+
+RegisterNUICallback("newCharacter", function(data)
+ if characterAmount < config.characterLimit then
+ 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
+ }
+ TriggerServerEvent("newCharacter", newCharacter)
+ end
+end)
+
+RegisterNetEvent("returnNewCharacter")
+AddEventHandler("returnNewCharacter", function(id, character)
+ characterAmount = characterAmount +1
+ 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 .. "/" .. config.characterLimit
+ })
+end)
+
+RegisterNUICallback("editCharacter", function(data)
+ 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,
+ id = data.id
+ }
+ TriggerServerEvent("editCharacter", newCharacter)
+end)
+
+RegisterNUICallback("delCharacter", function(data)
+ TriggerServerEvent("delCharacter", data.character)
+ characterAmount = characterAmount -1
+ SendNUIMessage({
+ characterAmount = characterAmount .. "/" .. config.characterLimit
+ })
+end)
+
+RegisterNUICallback("setMainCharacter", function(data)
+ mainFirstName = data.firstName
+ mainLastName = data.lastName
+ mainDateOfBirth = data.dateOfBirth
+ mainGender = data.gender
+ mainTwtName = data.twtName
+ mainDepartment = data.department
+ mainStartingCash = data.startingCash
+ mainStartingBank = data.startingBank
+ mainCharaterId = data.character
+
+ if config.debugMode then
+ for k, v in pairs(data) do
+ print(v)
+ end
+ end
+
+ for i = 1, #config.departments do
+ validDept = config.departments[i]
+ if mainDepartment == validDept then
+ for i = 1, #config.spawns[validDept] do
+ SendNUIMessage({
+ type = "setSpawns",
+ x = config.spawns[validDept][i].x,
+ y = config.spawns[validDept][i].y,
+ z = config.spawns[validDept][i].z,
+ name = config.spawns[validDept][i].name
+ })
+ end
+ end
+ end
+
+ registered = true
+end)
+
+RegisterNetEvent("returnMoney")
+AddEventHandler("returnMoney", function(cash, bank)
+ while not registered do
+ Citizen.Wait(100)
+ end
+ cash = cash
+ bank = bank
+ SendNUIMessage({
+ type = "Money",
+ cash = "Cash: $" .. cash,
+ bank = "Bank: $" .. bank
+ })
+end)
+
+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", mainCharaterId)
+end)
+
+RegisterNUICallback("tpDoNot", function(data)
+ local ped = PlayerPedId()
+ SwitchInPlayer(ped)
+ Citizen.Wait(500)
+ SetDisplay(false, "ui")
+ Citizen.Wait(500)
+ SetEntityVisible(ped, true, 0)
+ FreezeEntityPosition(ped, false)
+ TriggerServerEvent("getMoney", mainCharaterId)
+end)
+
+function SetDisplay(bool, typeName)
+ SetNuiFocus(bool, bool)
+ SendNUIMessage({
+ type = typeName,
+ background = config.backgrounds[math.random(1, #config.backgrounds)],
+ status = bool,
+ serverName = config.serverName,
+ characterAmount = characterAmount .. "/" .. config.characterLimit
+ })
+end
+
+if config.enableRichPrecence == true then
+ Citizen.CreateThread(function()
+ while true do
+ Citizen.Wait(config.updateIntervall * 1000)
+ SetDiscordAppId(config.appId)
+ if registered == true then
+ SetRichPresence(" Playing : " .. config.serverName .. " as " .. mainFirstName .. " " .. mainLastName)
+ SetDiscordRichPresenceAsset(config.largeLogo)
+ SetDiscordRichPresenceAssetText("Playing: " .. config.serverName)
+ SetDiscordRichPresenceAssetSmall(config.smallLogo)
+ SetDiscordRichPresenceAssetSmallText("Playing as: " .. mainFirstName .. " " .. mainLastName)
+ SetDiscordRichPresenceAction(0, config.firstButtonName, config.firstButtonLink)
+ SetDiscordRichPresenceAction(1, config.secondButtonName, config.secondButtonLink)
+ end
+ end
+ end)
+end
+
+-- Shot spotter
+if config.shotSpotterEnabled then
+ local activateShotSpotter = false
+ local alreadyShot = false
+ RegisterNetEvent("shotSpotterReport")
+ AddEventHandler("shotSpotterReport", function(x, y, z, postal)
+ if registered then
+ if mainDepartment == "SAHP" or mainDepartment == "LSPD" or mainDepartment == "BCSO" then
+ activateShotSpotter = true
+ while activateShotSpotter do
+ Citizen.Wait(0)
+ blip = AddBlipForCoord(x, y, z)
+ SetBlipSprite(blip, 161)
+ SetBlipAsShortRange(blip, true)
+ BeginTextCommandSetBlipName("STRING")
+ AddTextComponentString("Shot Spotter")
+ EndTextCommandSetBlipName(blip)
+ if not postal then
+ msg = "~r~Dispatch: ~w~Shotspotter detected in " .. GetStreetNameFromHashKey(GetStreetNameAtCoord(x, y, z)) .. "."
+ else
+ msg = "~r~Dispatch: ~w~Shotspotter detected in " .. GetStreetNameFromHashKey(GetStreetNameAtCoord(x, y, z)) .. ", postal: " .. postal .. "."
+ end
+ TriggerEvent('chat:addMessage', {
+ args = {msg}
+ })
+ Citizen.Wait(config.shotSpotterTimer * 1000)
+ activateShotSpotter = false
+ break
+ end
+ RemoveBlip(blip)
+ end
+ end
+ end)
+ Citizen.CreateThread(function()
+ while true do
+ Citizen.Wait(0)
+ local ped = PlayerPedId()
+ if registered then
+ if mainDepartment == "CIV" then
+ if IsPedShooting(ped) then
+ if not alreadyShot then
+ Citizen.Wait(config.shotSpotterDelay * 1000)
+ pedCoords = GetEntityCoords(ped)
+ if config.shotSpotterUsePostal then
+ postal = exports["nearest_postal123"]:getPostal()
+ else
+ postal = false
+ end
+ TriggerServerEvent("shotSpotterActive", pedCoords.x, pedCoords.y, pedCoords.z, postal)
+ if config.debugMode then
+ print(pedCoords.x, pedCoords.y, pedCoords.z)
+ end
+ end
+ alreadyShot = true
+ Citizen.Wait(config.shotSpotterCooldown * 1000)
+ alreadyShot = false
+ end
+ end
+ end
+ end
+ end)
+end
+
+-- hide gta default cash, ammo and reticle hud.
+if config.hideAmmoAndMoney == true or config.hideReticle == true then
+ Citizen.CreateThread(function()
+ while true do
+ Citizen.Wait(0)
+ if config.hideAmmoAndMoney == true then
+ HideHudComponentThisFrame(3) -- CASH
+ HideHudComponentThisFrame(4) -- MP_CASH
+ HideHudComponentThisFrame(13) -- CASH_CHANGE
+ HideHudComponentThisFrame(2) -- WEAPON_ICON
+ end
+ if config.hideReticle == true then
+ --if IsPlayerFreeAiming(PlayerPedId()) then
+ HideHudComponentThisFrame(14) -- RETICLE
+ --end
+ end
+ if config.customPauseMenu then
+ if registered then
+ if IsPauseMenuActive() then
+ BeginScaleformMovieMethodOnFrontendHeader("SET_HEADING_DETAILS")
+ AddTextEntry("FE_THDR_GTAO", config.serverName)
+ ScaleformMovieMethodAddParamPlayerNameString(mainFirstName .. " " .. mainLastName)
+ --PushScaleformMovieFunctionParameterString("Cash: $" .. cash)
+ --PushScaleformMovieFunctionParameterString("Bank: $" .. bank)
+ EndScaleformMovieMethod()
+ end
+ end
+ end
+ end
+ end)
+end
+
+RegisterNetEvent("receiveBank")
+AddEventHandler("receiveBank", function(amount, playerSending, name)
+ if config.debugMode then
+ print("Recived $" .. amount .. " from " .. name .. " [".. playerSending .."]")
+ end
+ SetNotificationTextEntry("STRING")
+ AddTextComponentString("Recived $" .. amount .. " from " .. name .. " [".. playerSending .."]")
+ SetNotificationMessage("CHAR_BANK_FLEECA", "CHAR_BANK_FLEECA", true, 9,"FleecaBank", "")
+ TriggerServerEvent("addBank", amount, mainCharaterId)
+end)
+
+RegisterNetEvent("receiveCash")
+AddEventHandler("receiveCash", function(amount, playerSending, name)
+ if config.debugMode then
+ print("Recived $" .. amount .. " from " .. name .. " [".. playerSending .."]")
+ end
+ SetNotificationTextEntry("STRING")
+ AddTextComponentString(name .. " gave you $" .. amount .. ".")
+ SetNotificationMessage("CHAR_DEFAULT", "CHAR_DEFAULT", true, 9, name .. " [".. playerSending .."]", "")
+ TriggerServerEvent("addCash", amount, mainCharaterId)
+end)
+
+RegisterNetEvent("updateMoney")
+AddEventHandler("updateMoney", function()
+ TriggerServerEvent("getMoney", mainCharaterId)
+end)
+
+Citizen.CreateThread(function()
+ while true do
+ Citizen.Wait(config.salaryInterval * 60000)
+ if registered then
+ TriggerServerEvent("addBank", config.salaryAmount, mainCharaterId)
+ SetNotificationTextEntry("STRING")
+ AddTextComponentString("Daily Salary + $" .. config.salaryAmount)
+ SetNotificationMessage("CHAR_BANK_FLEECA", "CHAR_BANK_FLEECA", true, 9,"FleecaBank", "")
+ end
+ end
+end)
+
+function sendBank(sendingCharacterId, receiveingPlayerId, amount, sendingPlayerId)
+ if registered then
+ TriggerServerEvent("bankPay", sendingCharacterId, receiveingPlayerId, amount, sendingPlayerId, mainFirstName .. " " .. mainLastName)
+ end
+end
+
+function sendCash(sendingCharacterId, amount, sendingPlayerId)
+ if registered then
+ target, distance = GetClosestPlayer()
+ if (distance ~= -1 and distance < 3) then
+ TriggerServerEvent("cashPay", sendingCharacterId, GetPlayerServerId(target), amount, sendingPlayerId, mainFirstName .. " " .. mainLastName)
+ else
+ notify("No players nearby")
+ end
+ end
+end
+
+function notify(message)
+ SetNotificationTextEntry("STRING")
+ AddTextComponentString(message)
+ DrawNotification(0,1)
+end
+
+function GetClosestPlayer()
+ local players = GetPlayers()
+ local closestDistance = -1
+ local closestPlayer = -1
+ local ply = GetPlayerPed(-1)
+ local plyCoords = GetEntityCoords(ply, 0)
+
+ for index,value in ipairs(players) do
+ local target = GetPlayerPed(value)
+ if(target ~= ply) then
+ local targetCoords = GetEntityCoords(GetPlayerPed(value), 0)
+ local distance = GetDistanceBetweenCoords(targetCoords["x"], targetCoords["y"], targetCoords["z"], plyCoords["x"], plyCoords["y"], plyCoords["z"], true)
+ if(closestDistance == -1 or closestDistance > distance) then
+ closestPlayer = value
+ closestDistance = distance
+ end
+ end
+ end
+ return closestPlayer, closestDistance
+end
+
+function GetPlayers()
+ local players = {}
+
+ for i = 0, 255 do
+ if NetworkIsPlayerActive(i) then
+ table.insert(players, i)
+ end
+ end
+
+ return players
+end
+
+function getCharacterInfo(int)
+ if registered then
+ if int == 1 then
+ return mainFirstName
+ elseif int == 2 then
+ return mainLastName
+ elseif int == 3 then
+ return mainDateOfBirth
+ elseif int == 4 then
+ return mainGender
+ elseif int == 5 then
+ return mainTwtName
+ elseif int == 6 then
+ return mainDepartment
+ elseif int == 7 then
+ return mainStartingCash
+ elseif int == 8 then
+ return mainStartingBank
+ elseif int == 9 then
+ return mainCharaterId
+ end
+ end
+end
\ No newline at end of file
diff --git a/ND_Core/source/server/commands.lua b/ND_Core/source/server/commands.lua
new file mode 100644
index 0000000..13386ac
--- /dev/null
+++ b/ND_Core/source/server/commands.lua
@@ -0,0 +1,52 @@
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-- DO NOT EDIT IF YOU DON'T KNOW WHAT YOU'RE DOING --
+-- --
+-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 --
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+
+-- Aop command
+if config.enableAopCommand then
+ RegisterNetEvent("registerAop")
+ AddEventHandler("registerAop", function(aopRegistered)
+ aop = aopRegistered
+ TriggerClientEvent("setAop", -1, aop)
+ end)
+ RegisterNetEvent("getAop")
+ AddEventHandler("getAop", function()
+ local player = source
+ if aop == nil then
+ aop = config.defaultAop
+ end
+ TriggerClientEvent("returnAop", player, aop)
+ end)
+end
+
+-- Twotter command
+RegisterNetEvent("twt")
+AddEventHandler("twt", function(id, twtName, twt)
+ TriggerClientEvent("twt", -1, id, twtName, twt)
+end)
+
+-- Me command
+RegisterNetEvent("me")
+AddEventHandler("me", function(id, name, msg, coords)
+ TriggerClientEvent("me", -1, id, name, msg, coords)
+end)
+
+-- OOC command
+RegisterCommand("ooc", function(source, args, rawCommand)
+ TriggerClientEvent("chat:addMessage", -1, {
+ color = {150, 150, 150},
+ args = {"^*OOC | ^0" .. GetPlayerName(source) .. " (#" .. source .. ")", string.gsub(rawCommand, "ooc", "")}
+ })
+end, false)
+
+-- Darkweb command
+RegisterCommand("darkweb", function(source, args, rawCommand)
+ TriggerClientEvent("chat:addMessage", -1, {
+ color = {0, 0, 0},
+ args = {"^*Dark web | ^0Anonymous (#" .. source .. ")", string.gsub(rawCommand, "darkweb", "")}
+ })
+end, false)
\ No newline at end of file
diff --git a/ND_Core/source/server/discord.lua b/ND_Core/source/server/discord.lua
new file mode 100644
index 0000000..fd93569
--- /dev/null
+++ b/ND_Core/source/server/discord.lua
@@ -0,0 +1,100 @@
+-- original discord roles author: https://forum.cfx.re/t/discord-roles-for-permissions-im-creative-i-know/233805?u=andyyy7666
+local FormattedToken = "Bot "..config.DiscordToken
+
+function DiscordRequest(method, endpoint, jsondata)
+ local data = nil
+ PerformHttpRequest("https://discordapp.com/api/"..endpoint, function(errorCode, resultData, resultHeaders)
+ data = {data=resultData, code=errorCode, headers=resultHeaders}
+ end, method, #jsondata > 0 and json.encode(jsondata) or "", {["Content-Type"] = "application/json", ["Authorization"] = FormattedToken})
+
+ while data == nil do
+ Citizen.Wait(0)
+ end
+
+ return data
+end
+
+ --[[ we don't use this in this resource.
+function GetRoles(user)
+ local discordId = nil
+ for _, id in ipairs(GetPlayerIdentifiers(user)) do
+ if string.match(id, "discord:") then
+ discordId = string.gsub(id, "discord:", "")
+ print("Found discord id: "..discordId)
+ break
+ end
+ end
+
+ if discordId then
+ local endpoint = ("guilds/%s/members/%s"):format(config.GuildId, discordId)
+ local member = DiscordRequest("GET", endpoint, {})
+ if member.code == 200 then
+ local data = json.decode(member.data)
+ local roles = data.roles
+ local found = true
+ return roles
+ else
+ print("Error occurred, maybe they are not in discord?")
+ return false
+ end
+ else
+ print("missing identifier")
+ return false
+ end
+end
+]]
+
+function IsRolePresent(user, role)
+ local discordId = nil
+ for _, id in ipairs(GetPlayerIdentifiers(user)) do
+ if string.match(id, "discord:") then
+ discordId = string.gsub(id, "discord:", "")
+ print("Found discord id: "..discordId)
+ break
+ end
+ end
+
+ local theRole = nil
+ if type(role) == "number" then
+ theRole = tostring(role)
+ else
+ theRole = config.roles[role]
+ end
+
+ if theRole == "0" then
+ print("Role Given (0 in config)")
+ return true
+ elseif discordId then
+ local endpoint = ("guilds/%s/members/%s"):format(config.GuildId, discordId)
+ local member = DiscordRequest("GET", endpoint, {})
+ if member.code == 200 then
+ local data = json.decode(member.data)
+ local roles = data.roles
+ local found = true
+ for i=1, #roles do
+ if roles[i] == theRole then
+ print("Found role")
+ return true
+ end
+ end
+ print("Not found!")
+ return false
+ else
+ print("Error occurred, maybe they are not in discord?")
+ return false
+ end
+ else
+ print("missing identifier")
+ return false
+ end
+end
+
+Citizen.CreateThread(function()
+ local guild = DiscordRequest("GET", "guilds/"..config.GuildId, {})
+ if guild.code == 200 then
+ local data = json.decode(guild.data)
+ print("Permission system guild set to: "..data.name.." ("..data.id..")")
+ else
+ print("An error occured, please check your config and ensure everything is correct. Error: "..(guild.data or guild.code))
+ end
+end)
\ No newline at end of file
diff --git a/ND_Core/source/server/main.lua b/ND_Core/source/server/main.lua
new file mode 100644
index 0000000..58fb4e7
--- /dev/null
+++ b/ND_Core/source/server/main.lua
@@ -0,0 +1,154 @@
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-- DO NOT EDIT IF YOU DON'T KNOW WHAT YOU'RE DOING --
+-- --
+-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 --
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+
+RegisterNetEvent("checkPerms")
+AddEventHandler("checkPerms", function(role)
+ local player = source
+ local role = role
+ local rolePermission = IsRolePresent(player, role)
+ TriggerClientEvent("permsChecked", player, role, rolePermission)
+end)
+
+RegisterNetEvent("exitGame")
+AddEventHandler("exitGame", function(Player)
+ DropPlayer(Player, "Disconnected using framework.")
+end)
+
+RegisterNetEvent("getCharacters")
+AddEventHandler("getCharacters", function()
+ local player = source
+ local license = GetPlayerIdentifier(player, 1)
+ exports.oxmysql:execute("SELECT * FROM characters WHERE license = ?", {license}, function(result)
+ if result then
+ characters = {}
+ for i = 1, #result do
+ temp = result[i]
+ table.insert(characters, {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)
+
+RegisterNetEvent("newCharacter")
+AddEventHandler("newCharacter", function(newCharacter)
+ local player = source
+ local license = GetPlayerIdentifier(player, 1)
+ exports.oxmysql:execute("SELECT MAX(character_id) AS nextID FROM characters WHERE license LIKE ?", {license}, function(result)
+ if result then
+ character_id = result[1].nextID
+ if character_id == nil then
+ character_id = 1
+ else
+ character_id = character_id + 1
+ end
+ exports.oxmysql:execute("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, newCharacter.startingCash, newCharacter.startingBank}, function(id)
+ if id then
+ TriggerClientEvent("returnNewCharacter", player, id, newCharacter)
+ end
+ end)
+ end
+ end)
+end)
+
+RegisterNetEvent("delCharacter")
+AddEventHandler("delCharacter", function(character_id)
+ local player = source
+ local license = GetPlayerIdentifier(player, 1)
+ exports.oxmysql:execute("DELETE FROM characters WHERE license LIKE ? AND character_id LIKE ?", {license, character_id}, function(id)
+ if id then
+ print(id)
+ end
+ end)
+end)
+
+RegisterNetEvent("editCharacter")
+AddEventHandler("editCharacter", function(newCharacter)
+ local player = source
+ local license = GetPlayerIdentifier(player, 1)
+ exports.oxmysql:execute("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, license, newCharacter.id}, function(id)
+ if id then
+ print(id)
+ end
+ end)
+end)
+
+if config.shotSpotterEnabled then
+ RegisterNetEvent("shotSpotterActive")
+ AddEventHandler("shotSpotterActive", function(x, y, z, postal)
+ TriggerClientEvent("shotSpotterReport", -1, x, y, z, postal)
+ end)
+end
+
+RegisterNetEvent("bankPay")
+AddEventHandler("bankPay", function(characterid, playerid, amount, playerSending, name)
+ local player = source
+ local license = GetPlayerIdentifier(player, 1)
+ exports.oxmysql:execute("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, license, characterid}, function(bank)
+ if bank then
+ print(bank)
+ end
+ end)
+ TriggerClientEvent("receiveBank", playerid, amount, playerSending, name)
+ TriggerClientEvent("updateMoney", player)
+end)
+
+RegisterNetEvent("addBank")
+AddEventHandler("addBank", function(amount, characterid)
+ local player = source
+ license = GetPlayerIdentifier(player, 1)
+ exports.oxmysql:execute("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, license, characterid}, function(bank)
+ if bank then
+ print(bank)
+ end
+ end)
+ TriggerClientEvent("updateMoney", player)
+end)
+
+RegisterNetEvent("cashPay")
+AddEventHandler("cashPay", function(characterid, playerid, amount, playerSending, name)
+ local player = source
+ local license = GetPlayerIdentifier(player, 1)
+ exports.oxmysql:execute("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, license, characterid}, function(cash)
+ if cash then
+ print(cash)
+ end
+ end)
+ TriggerClientEvent("receiveCash", playerid, amount, playerSending, name)
+ TriggerClientEvent("updateMoney", player)
+end)
+
+RegisterNetEvent("addCash")
+AddEventHandler("addCash", function(amount, characterid)
+ local player = source
+ local license = GetPlayerIdentifier(player, 1)
+ exports.oxmysql:execute("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, license, characterid}, function(cash)
+ if cash then
+ print(cash)
+ end
+ end)
+ TriggerClientEvent("updateMoney", player)
+end)
+
+RegisterNetEvent("getMoney")
+AddEventHandler("getMoney", function(characterid)
+ local player = source
+ local license = GetPlayerIdentifier(player, 1)
+ exports.oxmysql:execute("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {license, characterid}, function(result)
+ if result then
+ for i = 1, #result do
+ cash = result[i].cash
+ bank = result[i].bank
+ print(cash)
+ print(bank)
+ end
+ end
+ end)
+ Citizen.Wait(300)
+ TriggerClientEvent("returnMoney", player, cash, bank)
+end)
\ No newline at end of file
diff --git a/ND_Core/source/ui/Logo.png b/ND_Core/source/ui/Logo.png
new file mode 100644
index 0000000..9111d35
Binary files /dev/null and b/ND_Core/source/ui/Logo.png differ
diff --git a/ND_Core/source/ui/index.html b/ND_Core/source/ui/index.html
new file mode 100644
index 0000000..cb455db
--- /dev/null
+++ b/ND_Core/source/ui/index.html
@@ -0,0 +1,180 @@
+
+
+
+ Select or create a character:
+Are you sure you'd like to quit the game?
+Are you sure you'd like to delete this character?
+