Add files via upload

This commit is contained in:
Andyyy7666
2021-12-23 22:40:54 +01:00
committed by GitHub
commit ae32fd0e86
13 changed files with 1778 additions and 0 deletions

114
ND_Core/config.lua Normal file
View File

@@ -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
}

43
ND_Core/fxmanifest.lua Normal file
View File

@@ -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)
}

15
ND_Core/query.sql Normal file
View File

@@ -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
;

View File

@@ -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 = "<img src='data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxz%0D%0AdmcKICB2aWV3Ym94PSIwIDAgMjAwMCAxNjI1LjM2IgogIHdpZHRoPSIyMDAwIgogIGhlaWdodD0i%0D%0AMTYyNS4zNiIKICB2ZXJzaW9uPSIxLjEiCiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAv%0D%0Ac3ZnIj4KICA8cGF0aAogICAgZD0ibSAxOTk5Ljk5OTksMTkyLjQgYyAtNzMuNTgsMzIuNjQgLTE1%0D%0AMi42Nyw1NC42OSAtMjM1LjY2LDY0LjYxIDg0LjcsLTUwLjc4IDE0OS43NywtMTMxLjE5IDE4MC40%0D%0AMSwtMjI3LjAxIC03OS4yOSw0Ny4wMyAtMTY3LjEsODEuMTcgLTI2MC41Nyw5OS41NyBDIDE2MDku%0D%0AMzM5OSw0OS44MiAxNTAyLjY5OTksMCAxMzg0LjY3OTksMCBjIC0yMjYuNiwwIC00MTAuMzI4LDE4%0D%0AMy43MSAtNDEwLjMyOCw0MTAuMzEgMCwzMi4xNiAzLjYyOCw2My40OCAxMC42MjUsOTMuNTEgLTM0%0D%0AMS4wMTYsLTE3LjExIC02NDMuMzY4LC0xODAuNDcgLTg0NS43MzksLTQyOC43MiAtMzUuMzI0LDYw%0D%0ALjYgLTU1LjU1ODMsMTMxLjA5IC01NS41NTgzLDIwNi4yOSAwLDE0Mi4zNiA3Mi40MzczLDI2Ny45%0D%0ANSAxODIuNTQzMywzNDEuNTMgLTY3LjI2MiwtMi4xMyAtMTMwLjUzNSwtMjAuNTkgLTE4NS44NTE5%0D%0ALC01MS4zMiAtMC4wMzksMS43MSAtMC4wMzksMy40MiAtMC4wMzksNS4xNiAwLDE5OC44MDMgMTQx%0D%0ALjQ0MSwzNjQuNjM1IDMyOS4xNDUsNDAyLjM0MiAtMzQuNDI2LDkuMzc1IC03MC42NzYsMTQuMzk1%0D%0AIC0xMDguMDk4LDE0LjM5NSAtMjYuNDQxLDAgLTUyLjE0NSwtMi41NzggLTc3LjIwMywtNy4zNjQg%0D%0ANTIuMjE1LDE2My4wMDggMjAzLjc1LDI4MS42NDkgMzgzLjMwNCwyODQuOTQ2IC0xNDAuNDI5LDEx%0D%0AMC4wNjIgLTMxNy4zNTEsMTc1LjY2IC01MDkuNTk3MiwxNzUuNjYgLTMzLjEyMTEsMCAtNjUuNzg1%0D%0AMSwtMS45NDkgLTk3Ljg4MjgsLTUuNzM4IDE4MS41ODYsMTE2LjQxNzYgMzk3LjI3LDE4NC4zNTkg%0D%0ANjI4Ljk4OCwxODQuMzU5IDc1NC43MzIsMCAxMTY3LjQ2MiwtNjI1LjIzOCAxMTY3LjQ2MiwtMTE2%0D%0ANy40NyAwLC0xNy43OSAtMC40MSwtMzUuNDggLTEuMiwtNTMuMDggODAuMTc5OSwtNTcuODYgMTQ5%0D%0ALjczOTksLTEzMC4xMiAyMDQuNzQ5OSwtMjEyLjQxIgogICAgc3R5bGU9ImZpbGw6IzAwYWNlZCIv%0D%0APgo8L3N2Zz4K' height='16'> <b>{0}</b>: {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", "", {})

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

BIN
ND_Core/source/ui/Logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,180 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
<script src="https://use.fontawesome.com/releases/v5.15.4/js/all.js" data-auto-a11y="true"></script>
<script src="js/jquery-3.6.0.min.js" type="text/javascript"></script>
<script src="js/listener.js" type="text/javascript"></script>
</head>
<body>
<script>
function spawnMenu(bool) {
if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").hide();
$("#spawnLocation").fadeIn("slow");
} else {
$("#spawnLocation").fadeOut("slow");
}
}
function tp(x, y, z, name) {
$.post("https://ND_Core/tpToLocation", JSON.stringify({
x: x,
y: y,
z: z,
name: name
}));
spawnMenu(false)
setTimeout(function(){
$("#spawnMenuContainer").empty();
}, 550);
return
}
</script>
<!--Main page design-->
<section id="overlay">
<div id="logoContainer">
<img src="Logo.png" id="logo">
</div>
<div>
<h1 id="serverName"></h1>
<p id="aop" class="mainPage" style="margin-bottom: -1vh;"></p>
<p class="mainPage">Select or create a character:</p>
</div>
<div>
<button class="homeScreenButton" id="newCharacterButton"><a class="fas fa-plus-circle" style="color:white;"></a> Create New Character <a id="playerAmount"></a></button>
<br>
<button class="homeScreenButton" id="quitGameButton"><a class="fas fa-sign-out-alt" style="color:white;"></a> Quit Game</button>
</div>
<div id="charactersSection">
</div>
</section>
<!--Create character menu design-->
<form id="characterCreator" class="characterMenu">
<div>
<p id="characterCreatorTopText"><a class="fas fa-user-edit" style="color:white;"></a> Character Creation</p>
<hr id="characterCreatorTopTextLine">
</div>
<div id="characterInfoContainer">
<div>
<label class="firstRowText" style="margin-right: 15.7vw;" for="firstname">First Name</label>
<label class="firstRowText" style="margin-right: 15.7vw;" for="lastname">Last Name</label>
<input id="firstName" class="firstRowInput" style="margin-right: 4.1vw;" type="text" placeholder="First Name" name="firstname" required>
<input id="lastName" class="firstRowInput" style="margin-right: 4.1vw;" type="text" placeholder="Last Name" name="lastname" required>
</div>
<div>
<label class="secondRowText" style="margin-right: 15vw;" for="dob">Date of Birth</label>
<label class="secondRowText" style="margin-right: 15vw;" for="gender">Gender</label>
<input id="dateOfBirth" class="secondRowInput" style="margin-right: 4.35vw;" type="date" name="dob" required>
<select id="gender" class="secondRowInput" style="margin-right: 4.35vw;" name="gender" required>
<option class="secondRowInput">Male</option>
<option class="secondRowInput">Female</option>
</select>
</div>
<div>
<label class="thirdRowText" style="margin-right: 14.38vw;" for="twotter">Twotter Name</label>
<label class="thirdRowText" style="margin-right: 14.38vw;" for="department">Department</label>
<input id="twtName" class="thirdRowInput" style="margin-right: 4.2vw;" type="text" placeholder="Twotter Name" name="twotter" required>
<select id="department" class="thirdRowInput departments" style="margin-right: 4.2vw;" name="department" required></select>
</div>
<div>
<label class="fourthRowText" style="margin-right: 18.2vw;" for="startingcash">Cash</label>
<label class="fourthRowText" style="margin-right: 18.2vw;" for="startingbank">Bank</label>
<input id="startingCash" class="fourthRowInput" style="margin-right: 4.2vw;" type="number" pattern="[0-9]+" placeholder="$2500" name="startingcash" required>
<input id="startingBank" class="fourthRowInput" style="margin-right: 4.2vw;" type="number" pattern="[0-9]+" placeholder="$8000" name="startingbank" required>
</div>
</div>
<div>
<hr id="characterCreatorTopTextLine" style="margin-top: 5vh;">
<button id="submitCharacterCreation" class="characterSubmitButton" type="submit" form="characterCreator"><a class="fas fa-plus-circle" style="color:white;"></a> Create Character</button>
<button id="cancelCharacterCreation" class="characterResetButton" type="reset"><a class="fas fa-times-circle" style="color:white;"></a> Cancel</button>
</div>
</form>
<!--Edit character menu design-->
<form id="characterEditor" class="characterMenu">
<div>
<p id="characterCreatorTopText"><a class="fas fa-user-edit" style="color:white;"></a> Character Editor</p>
<hr id="characterCreatorTopTextLine">
</div>
<div id="characterInfoContainer">
<div>
<label class="firstRowText" style="margin-right: 15.7vw;" for="firstname">First Name</label>
<label class="firstRowText" style="margin-right: 15.7vw;" for="lastname">Last Name</label>
<input id="newFirstName" class="firstRowInput" style="margin-right: 4.1vw;" type="text" placeholder="First Name" name="firstname" required>
<input id="newLastName" class="firstRowInput" style="margin-right: 4.1vw;" type="text" placeholder="Last Name" name="lastname" required>
</div>
<div>
<label class="secondRowText" style="margin-right: 15vw;" for="dob">Date of Birth</label>
<label class="secondRowText" style="margin-right: 15vw;" for="gender">Gender</label>
<input id="newDateOfBirth" class="secondRowInput" style="margin-right: 4.35vw;" type="date" name="dob" required>
<select id="newGender" class="secondRowInput" style="margin-right: 4.35vw;" name="gender" required>
<option class="secondRowInput">Male</option>
<option class="secondRowInput">Female</option>
</select>
</div>
<div>
<label class="thirdRowText" style="margin-right: 14.38vw;" for="twotter">Twotter Name</label>
<label class="thirdRowText" style="margin-right: 14.38vw;" for="department">Department</label>
<input id="newTwtName" class="thirdRowInput" style="margin-right: 4.2vw;" type="text" placeholder="Twotter Name" name="twotter" required>
<select id="newDepartment" class="thirdRowInput departments" style="margin-right: 4.2vw;" name="department" required></select>
</div>
<!--
<div>
<label class="fourthRowText" style="margin-right: 18.2vw;" for="startingcash">Cash</label>
<label class="fourthRowText" style="margin-right: 18.2vw;" for="startingbank">Bank</label>
<input id="newStartingCash" class="fourthRowInput" style="margin-right: 4.2vw;" type="number" pattern="[0-9]+" placeholder="$2500" name="startingcash" required>
<input id="newStartingBank" class="fourthRowInput" style="margin-right: 4.2vw;" type="number" pattern="[0-9]+" placeholder="$8000" name="startingbank" required>
</div>
-->
</div>
<div>
<hr id="characterCreatorTopTextLine" style="margin-top: 5vh;">
<button id="submitCharacterEditing" class="characterSubmitButton" type="submit" form="characterEditor"><a class="fas fa-plus-circle" style="color:white;"></a> Save Changes</button>
<button id="cancelCharacterEditing" class="characterResetButton" type="reset"><a class="fas fa-times-circle" style="color:white;"></a> Cancel</button>
</div>
</form>
<!--Character Spawn options-->
<section id="spawnLocation" class="spawnMenu">
<div>
<p id="characterCreatorTopText"><a class="fas fa-map-marker-alt" style="color:white;"></a> Spawn Location</p>
<hr id="characterCreatorTopTextLine">
</div>
<div id="spawnMenuContainer">
</div>
<div>
<hr id="characterCreatorTopTextLine" style="margin-top: 3vh;">
<button id="tpDoNot" class="characterSubmitButton" style="margin-left: 26vw; margin-bottom: 2vh;"><a class="fas fa-compass" style="color:white;"></a> Do not teleport</button>
<button id="tpCancel" class="characterResetButton"><a class="fas fa-times-circle" style="color:white;"></a> Cancel</button>
</div>
</section>
<!--Confirm exit game menu design-->
<section id="exitGameMenu" class="confirmationScreen">
<p id="characterCreatorTopText">Are you sure you'd like to quit the game?</p>
<hr id="characterCreatorTopTextLine">
<button id="exitGameConfirm" class="confirmationScreenConfirm"><a class="fas fa-check-circle" style="color:white;"></a> Confirm</button>
<button id="exitGameCancel" class="confirmationScreenCancel"><a class="fas fa-times-circle" style="color:white;"></a> Cancel</button>
</section>
<!--Confirm delete character button-->
<section id="deleteCharacterMenu" class="confirmationScreen">
<p id="characterCreatorTopText">Are you sure you'd like to delete this character?</p>
<hr id="characterCreatorTopTextLine">
<button id="deleteCharacterConfirm" class="confirmationScreenConfirm"><a class="fas fa-check-circle" style="color:white;"></a> Confirm</button>
<button id="deleteCharacterCancel" class="confirmationScreenCancel"><a class="fas fa-times-circle" style="color:white;"></a> Cancel</button>
</section>
<!--Money hud-->
<div id="money">
<p id="cash" class="text"></p>
<p id="bank" class="text"></p>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,274 @@
$(function() {
// Hide/show ui function
function display(bool) {
if (bool) {
$("body").show();
Money(false)
} else {
$("body").hide();
}
}
function characterCreatorMenu(bool) {
if (bool) {
$("#characterCreator").fadeIn("slow");
$("#characterEditor").hide();
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").hide();
$("#spawnLocation").hide();
} else {
$("#characterCreator").fadeOut("slow");
}
}
function characterEditorMenu(bool) {
if (bool) {
$("#characterCreator").hide();
$("#characterEditor").fadeIn("slow");
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").hide();
$("#spawnLocation").hide();
} else {
$("#characterEditor").fadeOut("slow");
}
}
function exitGameMenu(bool) {
if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").fadeIn("slow");
$("#deleteCharacterMenu").hide();
$("#spawnLocation").hide();
} else {
$("#exitGameMenu").fadeOut("slow");
}
}
function confirmDeleteMenu(bool) {
if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").fadeIn("slow");
$("#spawnLocation").hide();
} else {
$("#deleteCharacterMenu").fadeOut("slow");
}
}
function spawnMenu(bool) {
if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").hide();
$("#spawnLocation").fadeIn("slow");
} else {
$("#spawnLocation").fadeOut("slow");
}
}
function Money(bool) {
if (bool) {
$("#money").show();
$("body").css("background-image", "none");
$("body").show();
$("#overlay").hide();
} else {
$("#money").hide();
$("#overlay").show();
}
}
display(false)
characterCreatorMenu(false)
characterEditorMenu(false)
exitGameMenu(false)
confirmDeleteMenu(false)
spawnMenu(false)
Money(false)
window.addEventListener('message', function(event) {
const item = event.data;
if (item.type === "ui") {
if (item.status == true) {
$('#serverName').text(item.serverName);
$("body").css("background-image", "url(" + item.background + ")");
display(true)
} else {
display(false)
}
}
$('#playerAmount').text(item.characterAmount);
if (item.type === "character") {
characterCreatorMenu(false)
createCharacter(item.firstName, item.lastName, item.dateOfBirth, item.gender, item.twtName, item.department, item.startingCash, item.startingBank, item.id)
}
if (item.type === "setSpawns") {
createSpawnButtons(item.x, item.y, item.z, item.name)
}
if (item.type === "givePerms") {
$('.departments').append($('<option>', {
text: item.deptRole
}));
}
if (item.type === "aop") {
$("#aop").text(item.aop);
}
if (item.type === "Money") {
Money(true)
$("#cash").text(item.cash);
$("#bank").text(item.bank);
}
})
function createCharacter(firstName, lastName, dateOfBirth, gender, twtName, department, startingCash, startingBank, id) {
$("#charactersSection").append('<button id="characterButton' + id + '" class="createdButton" style="text-transform: capitalize;">' + firstName + " " + lastName + " (" + department +')</button><button id="characterButtonEdit' + id + '" class="createdButtonEdit"><a class="fas fa-edit"></a> Edit</button><button id="characterButtonDelete' + id + '" class="createdButtonDelete"><a class="fas fa-trash-alt"></a> Delete</button>');
$("#characterButton" + id).click(function() {
spawnMenu(true)
$.post("https://ND_Core/setMainCharacter", JSON.stringify({
firstName: firstName,
lastName: lastName,
dateOfBirth: dateOfBirth,
gender: gender,
twtName: twtName,
department: department,
startingCash: startingCash,
startingBank: startingBank,
character: id
}));
return
})
$("#characterButtonEdit" + id).click(function() {
characterEditorMenu(true)
characterEdited = id
return
})
$("#characterButtonDelete" + id).click(function() {
confirmDeleteMenu(true)
characterDeleting = id
return
})
}
/*
function tp(x, y, z, name) {
$.post("https://ND_Core/tpToLocation", JSON.stringify({
x: x,
y: y,
z: z,
name: name
}));
spawnMenu(false)
setTimeout(function(){
$("#spawnMenuContainer").empty();
}, 550);
return
}
*/
function createSpawnButtons(x, y, z, name) {
$("#spawnMenuContainer").empty();
setTimeout(function(){
$("#spawnMenuContainer").append(`<button class="spawnButtons" id="${x}, ${y}, ${z}, ${name}" onclick='tp("${x}", "${y}", "${z}", "${name}")' > ${name} </button>`);
}, 10);
}
$("#characterCreator").submit(function() {
$.post("https://ND_Core/newCharacter", JSON.stringify({
firstName: $("#firstName").val(),
lastName: $("#lastName").val(),
dateOfBirth: $("#dateOfBirth").val(),
gender: $("#gender").val(),
twtName: $("#twtName").val(),
department: $("#department").val(),
startingCash: $("#startingCash").val(),
startingBank: $("#startingBank").val()
}));
characterCreatorMenu(false)
return false
})
$("#characterEditor").submit(function() {
characterEditorMenu(false)
$.post("https://ND_Core/editCharacter", JSON.stringify({
firstName: $("#newFirstName").val(),
lastName: $("#newLastName").val(),
dateOfBirth: $("#newDateOfBirth").val(),
gender: $("#newGender").val(),
twtName: $("#newTwtName").val(),
department: $("#newDepartment").val(),
//startingCash: $("#newStartingCash").val(),
//startingBank: $("#newStartingBank").val(),
id: characterEdited
}));
$("#characterButton" + characterEdited).text($("#newFirstName").val() + " " + $("#newLastName").val() + " (" + $("#newDepartment").val() + ")");
return false
})
$("#deleteCharacterConfirm").click(function() {
confirmDeleteMenu(false)
$("#characterButton" + characterDeleting).fadeOut("slow",function(){
$("#characterButton" + characterDeleting).remove();
})
$("#characterButtonEdit" + characterDeleting).fadeOut("slow",function(){
$("#characterButtonEdit" + characterDeleting).remove();
})
$("#characterButtonDelete" + characterDeleting).fadeOut("slow",function(){
$("#characterButtonDelete" + characterDeleting).remove();
})
$.post("https://ND_Core/delCharacter", JSON.stringify({
character: characterDeleting
}));
return
})
$("#newCharacterButton").click(function() {
characterCreatorMenu(true)
return
})
$("#deleteCharacterCancel").click(function() {
confirmDeleteMenu(false)
return
})
$("#cancelCharacterCreation").click(function() {
characterCreatorMenu(false)
return
})
$("#cancelCharacterEditing").click(function() {
characterEditorMenu(false)
return
})
$("#tpCancel").click(function() {
spawnMenu(false)
setTimeout(function(){
$("#spawnMenuContainer").empty();
}, 550);
return
})
$("#tpDoNot").click(function() {
$.post("https://ND_Core/tpDoNot", JSON.stringify({
test: "test"
}));
spawnMenu(false)
setTimeout(function(){
$("#spawnMenuContainer").empty();
}, 550);
return
})
$("#quitGameButton").click(function() {
exitGameMenu(true)
return
})
$("#exitGameCancel").click(function() {
exitGameMenu(false)
return
})
$("#exitGameConfirm").click(function() {
$.post("https://ND_Core/exitGame", JSON.stringify({}));
return
})
});

281
ND_Core/source/ui/style.css Normal file
View File

@@ -0,0 +1,281 @@
body {
background-size: 105%;
background-repeat: no-repeat;
background-attachment: fixed;
background-position: center;
}
/* Main page */
#overlay {
top: 0px;
left: 0px;
height: 100vh;
width: 30vw;
background-color: rgba(2, 2, 2, 0.911);
position: fixed;
}
#charactersSection {
height: 50%;
margin: none;
padding: none;
width: 83%;
overflow-y: scroll;
}
::-webkit-scrollbar {
width: 10px;
}
::-webkit-scrollbar-track {
background: rgba(2, 2, 2, 0);
}
::-webkit-scrollbar-thumb {
background: rgba(99, 99, 99, 0.575);
border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
background: rgb(128, 128, 128);
border-radius: 10px;
}
#logoContainer {
margin-top: 3vh;
margin-left: 10vw;
}
#logo {
height: 10vw;
width: 10vw;
}
#serverName {
color: white;
font-size: 130%;
font-family: Verdana, Geneva, Tahoma, sans-serif;
text-align: center;
font-weight: bolder;
}
.mainPage {
color: white;
font-size: 95%;
font-family: Verdana, Geneva, Tahoma, sans-serif;
text-align: center;
font-weight: lighter;
}
.homeScreenButton, .createdButton, .createdButtonEdit, .createdButtonDelete {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
font-weight: bold;
text-align: center;
border: none;
color: white;
}
#newCharacterButton {
margin-left: 9vw;
margin-bottom: 0.8vh;
height: 4.5vh;
width: 12vw;
background: rgb(95,141,254);
background-image: linear-gradient(90deg, rgba(95,141,254,1) 0%, rgba(142,104,219,1) 100%);
border-radius: 5vw;
transition: 0.3s;
}
#quitGameButton {
margin-left: 10vw;
margin-bottom: 5vh;
height: 4.5vh;
width: 10vw;
background: rgb(255,110,100);
background: linear-gradient(90deg, rgb(255, 100, 208) 0%, rgb(255, 60, 109) 100%);
border-radius: 5vw;
transition: 0.3s;
}
.createdButton {
display: inline-block;
margin-bottom: 1vh;
margin-left: 5.5vw;
height: 3vh;
width: 10vw;
background-color: rgb(17, 113, 238);
border: none;
border-radius: 0.5vh;
transition: 0.3s;
}
.createdButtonEdit {
margin-left: 0.2vw;
height: 3vh;
width: 4vw;
background-color: rgb(128, 128, 128);
border: none;
border-radius: 0.5vh;
transition: 0.3s;
}
.createdButtonDelete {
margin-left: 0.2vw;
height: 3vh;
width: 4vw;
background-color: rgb(236, 19, 19);
border: none;
border-radius: 0.5vh;
transition: 0.3s;
}
/* Button transitions */
#newCharacterButton:hover, #quitGameButton:hover, .characterSubmitButton:hover, .characterResetButton:hover, .confirmationScreenConfirm:hover, .confirmationScreenCancel:hover, .createdButton:hover, .createdButtonEdit:hover, .createdButtonDelete:hover, .spawnButtons:hover {
transition: 0.3s;
opacity: 0.7;
}
#newCharacterButton:active, #quitGameButton:active, .characterSubmitButton:active, .characterResetButton:active, .confirmationScreenConfirm:active, .confirmationScreenCancel:active, .createdButton:active, .createdButtonEdit:active, .createdButtonDelete:active, .spawnButtons:active {
transition: none;
opacity: 1;
}
/* Character creator and Editor menu */
.characterMenu {
height: 60%;
width: 50vw;
margin-top: 15vh;
margin-left: 40vw;
background-color: rgba(2, 2, 2, 0.911);
border-radius: 3vh;
}
#characterCreatorTopText {
padding-top: 2vh;
margin-left: 3vw;
color: white;
font-size: 120%;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
font-weight: bold;
}
#characterCreatorTopTextLine {
background: rgb(255, 255, 255);
background: linear-gradient(90deg, rgba(0,0,0,1) 0%, rgba(255,255,255,1) 15%, rgba(255,255,255,1) 85%, rgba(0,0,0,1) 100%);
height: 0.1vh;
width: 95%;
border: none;
border-radius: 2vh;
}
/* character info */
#characterInfoContainer {
margin-top: 2vh;
margin-left: 6.5vw;
}
.firstRowText, .secondRowText, .thirdRowText, .fourthRowText {
color: white;
display: inline-block;
margin-top: 2vh;
margin-bottom: 1vh;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
font-weight: bold;
}
.firstRowInput, .secondRowInput, .thirdRowInput, .fourthRowInput {
background: white;
color: black;
display: inline-block;
border: none;
border-radius: 0.2vw;
height: 4vh;
width: 36%;
}
.characterSubmitButton {
margin-top: 1vh;
margin-left: 30.3vw;
margin-bottom: 2vh;
width: 8vw;
background-color: rgb(17, 113, 238);
}
.characterResetButton {
width: 4vw;
background-color: rgb(231, 50, 50);
}
.characterSubmitButton, .characterResetButton, .confirmationScreenConfirm, .confirmationScreenCancel, .spawnButtons {
height: 4vh;
color: white;
font-weight: bold;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
border: none;
border-radius: 1vh;
transition: 0.3s;
}
/* confirmation Screen */
.confirmationScreen {
height: 25vh;
width: 30vw;
margin-top: 20vh;
margin-left: 45vw;
background-color: rgba(2, 2, 2, 0.911);
border-radius: 3vh;
}
.confirmationScreenConfirm {
margin-top: 5vh;
margin-left: 19%;
margin-right: 5%;
width: 8vw;
background-color: rgb(17, 113, 238);
}
.confirmationScreenCancel {
width: 8vw;
background-color: rgb(231, 50, 50);
}
.spawnMenu {
height: 39%;
width: 40vw;
margin-top: 15vh;
margin-left: 40vw;
background-color: rgba(2, 2, 2, 0.911);
border-radius: 3vh;
}
#spawnMenuContainer {
margin-top: 3vh;
margin-left: 5%;
}
.spawnButtons {
display: block;
margin-left: 0;
margin-bottom: 1vh;
text-align: center;
width: 95%;
height: 4vh;
background-color: rgb(17, 113, 238);
}
.text {
font-family: "Pricedown Bl", sans-serif;
position: absolute;
font-size: 1vw;
color: rgba(255, 255, 255, 0.925);
margin: auto;
text-align: center;
padding: 0.15% 1.1%;
background-color: rgba(2, 2, 2, 0.548);
border-radius: 10vw;
}
#cash {
top: 5.5vh;
right: 1.5vw;
}
#bank {
top: 9vh;
right: 1.5vw;
}