This commit is contained in:
Andyyy7666
2022-07-08 23:24:04 +02:00
committed by GitHub
parent a33c4238bb
commit 0cf6edec7e
9 changed files with 474 additions and 599 deletions

View File

@@ -1,9 +1,10 @@
-- For support join my discord: https://discord.gg/Z9Mxu72zZ6
config = {
serverName = "Andy's Development", -- Server name to display on the ui.
serverName = "Andy's Development",
characterLimit = 15,
changeCharacterCommand = "changecharacter", -- this is the command to open the ui again and change your character.
customPauseMenu = true, -- this will create a custom pause menu. It will display your money, characters name. And server name in the pause menu.
-- set your backgrounds, if you have more than 1 then it will randomly change everytime you open the ui.
backgrounds = {
@@ -12,13 +13,12 @@ config = {
"https://i.imgur.com/ZWKfYD9.png" -- Credits: 2XRondo#6374
},
-- set up the name of your departments and the discord role id for permission. A role id of 0 will allow anyone to choose that department.
departments = {
["CIV"] = {"0"},
["SAHP"] = {"0"},
["LSPD"] = {"0"},
["BCSO"] = {"0"},
["LSFD"] = {"0"}
["CIV"] = {"872921520719142932"},
["SAHP"] = {"872921520719142932"},
["LSPD"] = {"872921520719142932"},
["BCSO"] = {"872921520719142932"},
["LSFD"] = {"872921520719142932"}
},
-- set up the spawn buttons for each department.
@@ -54,51 +54,14 @@ config = {
-- Money related
enableMoneySystem = true,
legacyMoneyDisplay = false, -- set to tru if you want to use the hud from my standalone money system.
maxStartingCash = 2500,
maxStartingBank = 8000,
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.
-- Area of Play
enableAopCommand = true,
aopCommand = "setaop",
checkAopCommand = "aop",
defaultAop = "Sandy Shores",
canChangeAOP = { -- Roles that can change the aop.
["ADMIN"] = "0",
["STAFF"] = "0"
},
-- Prority cooldown
enablePriorityCooldown = true,
enablePriorityDefaultHUD = true, -- this will remove the hud of the priority, if you're using ModernHUD set this to false and go into ModernHUD config and change it to true from there.
startPriorityCommand = "prio-start",
stopPriorityCommand = "prio-stop",
cooldownPriorityCommand = "prio-cd",
joinPriorityCommand = "prio-join",
leavePriorityCommand = "prio-leave",
cooldownAfterPriority = 10, -- This is how long a cooldown will start after a priority is stopped.
canSeePriority = { -- Departments that can see the priority status on their screen. (It's usually just useful for civs)
"CIV"
},
-- Dark web
enableDarkweb = true,
canSeeDarkweb = { -- Departments that can see and use the darkweb command.
"CIV"
},
-- Hide reticle or default gta money and ammo dispaly. WARNING: turning both to true will add a 0.01 to the resmon.
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 = 10, -- how many seconds delay until it updates status.
updateIntervall = 60, -- how many seconds delay until it updates status.
appId = 858146067018416128,
largeLogo = "andyyy",
smallLogo = "andyyy",
@@ -106,4 +69,4 @@ config = {
firstButtonLink = "https://discord.gg/Z9Mxu72zZ6",
secondButtonName = "TEBEX",
secondButtonLink = "https://andyyy.tebex.io/category/fivem-scripts"
}
}

View File

@@ -1,6 +1,6 @@
-- For support join my discord: https://discord.gg/Z9Mxu72zZ6
server_config = {
DiscordToken = "0", -- discord bot token for permissions
GuildId = "872496972454592523", -- discord guild id
}
discordServerToken = "OTAwODg1MDMxMDQ2Nzc0ODQ1.YXH0kQ.2m4oWEw5hYmqnM4YOGnd4bn2AKI", -- discord bot token for permissions
guildId = "872496972454592523", -- discord guild id
}

View File

@@ -1,8 +1,8 @@
-- For support join my discord: https://discord.gg/Z9Mxu72zZ6
author "Andyyy#7666"
description "ND Framework Core"
version "1.4.0"
description "ND-Core"
version "2.0.0"
fx_version "cerulean"
game "gta5"
@@ -10,29 +10,22 @@ lua54 "yes"
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",
"source/ui/script.js",
"source/ui/style.css"
}
ui_page "source/ui/index.html"
shared_script "config_client.lua"
client_script "source/client.lua"
server_scripts {
"config_server.lua",
"source/server/discord.lua",
"source/server/main.lua",
"source/server/commands.lua"
}
client_scripts {
"source/client/main.lua",
"source/client/commands.lua"
"source/server.lua"
}
exports {
"getCharacterInfo", -- getCharacterInfo(infoType), 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.
"getCharacterInfo",
}
server_exports {
"transferBank", -- exports["ND_Core"]:transferBank(amount, player, target)
"giveCashToClosestTarget", -- exports["ND_Core"]:giveCashToClosestTarget(amount, player)
@@ -40,10 +33,11 @@ server_exports {
"depositMoney", -- exports["ND_Core"]:depositMoney(amount, player)
"deductMoney", -- exports["ND_Core"]:deductMoney(amount, player, from)
"addMoney", -- exports["ND_Core"]:addMoney(amount, player, to)
"getCharacterTable" -- exports["ND_Core"]:getCharacterTable() this will return a table with all the online players and their info. View below on how to use this.
}
dependency "oxmysql"
--[[
Keys in the getCharacterTable:
@@ -60,4 +54,4 @@ server_exports {
Usage:
players = exports["ND_Core"]:getCharacterTable()
print(players[3].bank) this will print the bank account of the player with id 3.
]]
]]

View File

@@ -10,4 +10,4 @@ CREATE TABLE `characters` (
`cash` INT(10) NULL DEFAULT '0',
`bank` INT(10) NULL DEFAULT '0',
PRIMARY KEY (`character_id`) USING BTREE
);
);

View File

@@ -1,58 +1,92 @@
-- For support join my discord: https://discord.gg/Z9Mxu72zZ6
local background = config.backgrounds[math.random(1, #config.backgrounds)]
local started = true
local priorityText = nil
registered = false
cash = nil
bank = nil
local selectedCharacter
local characterAmount = 0
function SetDisplay(bool, typeName, bg)
if not bg then
background = config.backgrounds[math.random(1, #config.backgrounds)]
end
SetNuiFocus(bool, bool)
SendNUIMessage({
type = typeName,
background = background,
status = bool,
serverName = config.serverName,
characterAmount = characterAmount .. "/" .. config.characterLimit
})
end
function getCharacterInfo()
return selectedCharacter
end
function start(switch)
TriggerServerEvent("checkPerms")
TriggerServerEvent("getCharacters")
TriggerServerEvent("getAop")
Citizen.Wait(100)
if switch then
local ped = PlayerPedId()
SwitchOutPlayer(ped, 0, 1)
FreezeEntityPosition(ped, true)
SetEntityVisible(ped, false, 0)
end
SendNUIMessage({
type = "onStart",
enableMoneySystem = config.enableMoneySystem,
maxStartingBank = config.maxStartingBank,
maxStartingCash = config.maxStartingCash
})
end
AddEventHandler("onResourceStart", function(resourceName)
if (GetCurrentResourceName() ~= resourceName) then
return
end
Citizen.Wait(1000)
start(false)
end)
AddEventHandler("playerSpawned", function()
print("^0This framework is created by ^5Andyyy#7666 ^0for support you can join the ^5discord: ^0https://discord.gg/Z9Mxu72zZ6")
start(true)
end)
-- This is used to add department drop down on the ui.
RegisterNetEvent("permsChecked")
AddEventHandler("permsChecked", function(role, rolePermission)
if rolePermission then
AddEventHandler("permsChecked", function(allowedRoles)
for _, dept in pairs(allowedRoles) do
SendNUIMessage({
type = "givePerms",
deptRole = role
deptRole = dept
})
end
end)
RegisterNetEvent("refreshCharacters")
AddEventHandler("refreshCharacters", function()
TriggerServerEvent("getCharacters")
-- Notification when you recieve money.
RegisterNetEvent("receiveBank")
AddEventHandler("receiveBank", function(amount, playerSending, playerId)
BeginTextCommandThefeedPost("STRING")
AddTextComponentSubstringPlayerName("Received $" .. amount .. " from " .. playerSending .. " [".. playerId .."]")
EndTextCommandThefeedPostMessagetext("CHAR_BANK_FLEECA", "CHAR_BANK_FLEECA", true, 9,"FleecaBank", "")
end)
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 departmentName in pairs(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", departmentName) -- check permissions for each department with the department names.
end
TriggerServerEvent("getCharacters")
Citizen.Wait(100)
TriggerServerEvent("getAop")
SwitchOutPlayer(ped, 0, 1)
FreezeEntityPosition(ped, true)
SetEntityVisible(ped, false, 0)
started = false
SendNUIMessage({
type = "onStart",
enableMoneySystem = config.enableMoneySystem,
maxStartingBank = config.maxStartingBank,
maxStartingCash = config.maxStartingCash
})
end
end
-- Notification when you receive cash.
RegisterNetEvent("receiveCash")
AddEventHandler("receiveCash", function(amount, playerSending, playerId)
BeginTextCommandThefeedPost("STRING")
AddTextComponentSubstringPlayerName(playerSending .. " gave you $" .. amount .. ".")
EndTextCommandThefeedPostMessagetext("CHAR_DEFAULT", "CHAR_DEFAULT", true, 9, playerSending .. " [".. playerId .."]", "")
end)
RegisterNUICallback("exitGame", function(data)
TriggerServerEvent("exitGame")
RegisterNetEvent("updateMoney")
AddEventHandler("updateMoney", function(cash, bank)
selectedCharacter.cash = cash
selectedCharacter.bank = bank
end)
-- Gets all the characters and displays them on the ui.
RegisterNetEvent("returnCharacters")
AddEventHandler("returnCharacters", function(characters)
characterAmount = 0
@@ -77,59 +111,21 @@ AddEventHandler("returnCharacters", function(characters)
SetDisplay(true, "ui", background)
end)
-- Creating a character
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)
-- editing a character
RegisterNUICallback("editCharacter", function(data)
newCharacter = {
-- Selecting a player from the iu.
RegisterNUICallback("setMainCharacter", function(data)
selectedCharacter = {
firstName = data.firstName,
lastName = data.lastName,
dateOfBirth = data.dateOfBirth,
dob = data.dateOfBirth,
gender = data.gender,
twtName = data.twtName,
twt = data.twtName,
department = data.department,
id = data.id
cash = data.startingCash,
bank = data.startingBank,
id = data.character
}
TriggerServerEvent("editCharacter", newCharacter)
end)
-- deleting a character
RegisterNUICallback("delCharacter", function(data)
TriggerServerEvent("delCharacter", data.character)
characterAmount = characterAmount -1
SendNUIMessage({
characterAmount = characterAmount .. "/" .. config.characterLimit
})
end)
-- Once the player clicks on the character in the ui, it will be set as the main character or the current character. This info can be used later in exports or elsewhere in this resource.
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
for _, spawn in pairs(config.spawns[mainDepartment]) do
for _, spawn in pairs(config.spawns[selectedCharacter.department]) do
SendNUIMessage({
type = "setSpawns",
x = spawn.x,
@@ -139,74 +135,54 @@ RegisterNUICallback("setMainCharacter", function(data)
})
end
TriggerServerEvent("characterOnline", mainCharaterId)
TriggerServerEvent("getPriority")
registered = true
TriggerServerEvent("characterOnline", selectedCharacter.id)
TriggerEvent("characterChanged", selectedCharacter)
end)
if config.enableMoneySystem then
-- This will display the money that the player has.
RegisterNetEvent("returnMoney")
AddEventHandler("returnMoney", function(newCash, newBank)
while not registered do
Citizen.Wait(10)
end
cash = tostring(newCash)
bank = tostring(newBank)
if config.legacyMoneyDisplay then
if registered then
while true do
Citizen.Wait(0)
text("💵", 0.885, 0.028, 0.35, 7)
text("💳", 0.885, 0.068, 0.35, 7)
text("~g~$~w~".. cash, 0.91, 0.03, 0.55, 7)
text("~b~$~w~".. bank, 0.91, 0.07, 0.55, 7)
end
end
else
SendNUIMessage({
type = "Money",
cash = "Cash: $" .. cash,
bank = "Bank: $" .. bank
})
end
end)
-- Creating a character from the ui.
RegisterNUICallback("newCharacter", function(data)
if characterAmount < config.characterLimit then
TriggerServerEvent("newCharacter", {
firstName = data.firstName,
lastName = data.lastName,
dateOfBirth = data.dateOfBirth,
gender = data.gender,
twtName = data.twtName,
department = data.department,
startingCash = data.startingCash,
startingBank = data.startingBank
})
end
end)
-- This is to update the players money on the ui.
RegisterNetEvent("updateMoney")
AddEventHandler("updateMoney", function()
TriggerServerEvent("getMoney", mainCharaterId)
end)
-- editing a character from the ui.
RegisterNUICallback("editCharacter", function(data)
TriggerServerEvent("editCharacter", {
firstName = data.firstName,
lastName = data.lastName,
dateOfBirth = data.dateOfBirth,
gender = data.gender,
twtName = data.twtName,
department = data.department,
id = data.id
})
end)
-- Notification when you recieve money.
RegisterNetEvent("receiveBank")
AddEventHandler("receiveBank", function(amount, playerSending, playerId)
BeginTextCommandThefeedPost("STRING")
AddTextComponentSubstringPlayerName("Received $" .. amount .. " from " .. playerSending .. " [".. playerId .."]")
EndTextCommandThefeedPostMessagetext("CHAR_BANK_FLEECA", "CHAR_BANK_FLEECA", true, 9,"FleecaBank", "")
end)
-- deleting a character from the ui.
RegisterNUICallback("delCharacter", function(data)
TriggerServerEvent("delCharacter", data.character)
characterAmount = characterAmount -1
SendNUIMessage({
characterAmount = characterAmount .. "/" .. config.characterLimit
})
end)
-- Notification when you receive cash.
RegisterNetEvent("receiveCash")
AddEventHandler("receiveCash", function(amount, playerSending, playerId)
BeginTextCommandThefeedPost("STRING")
AddTextComponentSubstringPlayerName(playerSending .. " gave you $" .. amount .. ".")
EndTextCommandThefeedPostMessagetext("CHAR_DEFAULT", "CHAR_DEFAULT", true, 9, playerSending .. " [".. playerId .."]", "")
end)
-- Quit button from ui.
RegisterNUICallback("exitGame", function(data)
TriggerServerEvent("exitGame")
end)
-- Notification when receiving salary.
RegisterNetEvent("receiveSalary")
AddEventHandler("receiveSalary", function(amount)
if registered then
BeginTextCommandThefeedPost("STRING")
AddTextComponentSubstringPlayerName("Daily Salary + $" .. config.salaryAmount)
EndTextCommandThefeedPostMessagetext("CHAR_BANK_FLEECA", "CHAR_BANK_FLEECA", true, 9,"FleecaBank", "")
TriggerServerEvent("getMoney", mainCharaterId)
end
end)
end
-- Teleporting
-- Teleporting using ui.
RegisterNUICallback("tpToLocation", function(data)
local ped = PlayerPedId()
FreezeEntityPosition(ped, false)
@@ -218,7 +194,7 @@ RegisterNUICallback("tpToLocation", function(data)
Citizen.Wait(500)
FreezeEntityPosition(ped, false)
SetEntityVisible(ped, true, 0)
TriggerServerEvent("getMoney", mainCharaterId)
TriggerServerEvent("getMoney", selectedCharacter.id)
end)
-- Choosing the do not tp button.
@@ -230,128 +206,61 @@ RegisterNUICallback("tpDoNot", function()
Citizen.Wait(500)
SetEntityVisible(ped, true, 0)
FreezeEntityPosition(ped, false)
TriggerServerEvent("getMoney", mainCharaterId)
TriggerServerEvent("getMoney", selectedCharacter.id)
end)
function SetDisplay(bool, typeName, bg)
if not bg then
background = config.backgrounds[math.random(1, #config.backgrounds)]
end
SetNuiFocus(bool, bool)
SendNUIMessage({
type = typeName,
background = background,
status = bool,
serverName = config.serverName,
characterAmount = characterAmount .. "/" .. config.characterLimit
})
end
-- discord rich precense will show on a users profile.
if config.enableRichPrecence then
Citizen.CreateThread(function()
while true do
Citizen.Wait(config.updateIntervall * 1000)
SetDiscordAppId(config.appId)
if registered then
SetRichPresence(" Playing : " .. config.serverName .. " as " .. mainFirstName .. " " .. mainLastName)
if selectedCharacter then
SetRichPresence(" Playing : " .. config.serverName .. " as " .. selectedCharacter.firstName .. " " .. selectedCharacter.lastName)
SetDiscordRichPresenceAsset(config.largeLogo)
SetDiscordRichPresenceAssetText("Playing: " .. config.serverName)
SetDiscordRichPresenceAssetSmall(config.smallLogo)
SetDiscordRichPresenceAssetSmallText("Playing as: " .. mainFirstName .. " " .. mainLastName)
SetDiscordRichPresenceAssetSmallText("Playing as: " .. selectedCharacter.firstName .. " " .. selectedCharacter.lastName)
SetDiscordRichPresenceAction(0, config.firstButtonName, config.firstButtonLink)
SetDiscordRichPresenceAction(1, config.secondButtonName, config.secondButtonLink)
end
Citizen.Wait(config.updateIntervall * 1000)
end
end)
end
if config.enablePriorityCooldown then
TriggerEvent("chat:addSuggestion", "/" .. config.startPriorityCommand, "Start a priority.")
TriggerEvent("chat:addSuggestion", "/" .. config.stopPriorityCommand, "Stop an active priority.")
TriggerEvent("chat:addSuggestion", "/" .. config.cooldownPriorityCommand, "Start a cooldown on priorities.", {
{name="Time", help="Time in minutes to start a cooldown"}
})
RegisterNetEvent("returnPriority")
AddEventHandler("returnPriority", function(priority)
priorityText = nil
for _, departmentName in pairs(config.canSeePriority) do
if departmentName == mainDepartment then
priorityText = priority
break
end
end
end)
end
if config.hideAmmoAndMoney or config.hideReticle or config.customPauseMenu or config.enablePriorityCooldown then
-- show server name, first name, last name, and the amount of money the character has in the pause menu.
if config.customPauseMenu then
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if config.hideAmmoAndMoney then
HideHudComponentThisFrame(3) -- CASH
HideHudComponentThisFrame(4) -- MP_CASH
HideHudComponentThisFrame(13) -- CASH_CHANGE
HideHudComponentThisFrame(2) -- WEAPON_ICON
end
if config.hideReticle then
HideHudComponentThisFrame(14) -- RETICLE
end
if config.customPauseMenu and registered then
if selectedCharacter then
if IsPauseMenuActive() then
BeginScaleformMovieMethodOnFrontendHeader("SET_HEADING_DETAILS")
AddTextEntry("FE_THDR_GTAO", config.serverName)
ScaleformMovieMethodAddParamPlayerNameString(mainFirstName .. " " .. mainLastName)
if registered and config.enableMoneySystem then
PushScaleformMovieFunctionParameterString("Cash: $" .. cash)
PushScaleformMovieFunctionParameterString("Bank: $" .. bank)
ScaleformMovieMethodAddParamPlayerNameString(selectedCharacter.firstName .. " " .. selectedCharacter.lastName)
if config.enableMoneySystem then
PushScaleformMovieFunctionParameterString("Cash: $" .. tostring(selectedCharacter.cash))
PushScaleformMovieFunctionParameterString("Bank: $" .. tostring(selectedCharacter.bank))
end
EndScaleformMovieMethod()
end
end
if config.enablePriorityCooldown and priorityText and config.enablePriorityDefaultHUD then
text(priorityText, 0.182, 0.891, 0.4, 4)
end
end
end)
end
-- Notification above the map.
function notify(message)
BeginTextCommandThefeedPost("STRING")
AddTextComponentSubstringPlayerName(message)
EndTextCommandThefeedPostTicker(0,1)
end
-- Change character command
RegisterCommand(config.changeCharacterCommand, function()
SwitchOutPlayer(PlayerPedId(), 0, 1)
Citizen.Wait(2000)
FreezeEntityPosition(ped, true)
SetEntityVisible(ped, false, 0)
SetDisplay(true, "ui")
end, false)
function getCharacterInfo(infoType)
if registered then
mainCharacter = {
mainFirstName,
mainLastName,
mainDateOfBirth,
mainGender,
mainTwtName,
mainDepartment,
cash,
bank,
mainCharaterId,
priorityText
}
return mainCharacter[infoType]
else
return "Error: Player not registered"
end
end
function text(text, x, y, scale, font)
SetTextFont(font)
SetTextProportional(0)
SetTextScale(scale, scale)
SetTextEdge(1, 0, 0, 0, 255)
SetTextDropShadow(0, 0, 0, 0,255)
SetTextOutline()
SetTextJustification(1)
SetTextEntry("STRING")
AddTextComponentString(text)
DrawText(x, y)
end
-- chat suggestions
TriggerEvent("chat:addSuggestion", "/" .. config.changeCharacterCommand, "Switch your framework character.")
if config.enableMoneySystem then
TriggerEvent("chat:addSuggestion", "/" .. config.payCommand, "Transfer money to player", {{name="id", help="Player server id" }, {name="amount", help="amount to pay"}})
TriggerEvent("chat:addSuggestion", "/" .. config.giveCommand, "Give money to closeby player", {{name="amount", help="amount to give"}})
end

View File

@@ -10,23 +10,26 @@ if resource ~= expectedName then
end
-- check if resource version is up to date
PerformHttpRequest("https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_Core/fxmanifest.lua", function(error, res, head)
i, j = string.find(tostring(res), "version")
res = string.sub(tostring(res), i, j + 6)
res = string.gsub(res, "version ", "")
res = string.gsub(res, '"', "")
resp = tonumber(res)
verFile = GetResourceMetadata(expectedName, "version", 0)
if verFile then
if tonumber(verFile) < resp then
PerformHttpRequest("https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_Core/fxmanifest.lua", function(errorCode, resultData, resultHeaders)
i, j = string.find(tostring(resultData), "version")
resultData = string.sub(tostring(resultData), i, j + 12)
resultData = string.gsub(resultData, "version \"", "")
i, j = string.find(resultData, "\"")
resultData = string.sub(resultData, 1, i - 1)
local githubVersion = string.gsub(resultData, "%.", "")
local fileVersion = string.gsub(GetResourceMetadata(expectedName, "version", 0), "%.", "")
githubVersion = tonumber(githubVersion)
fileVersion = tonumber(fileVersion)
if githubVersion and fileVersion then
if githubVersion > fileVersion then
print("^1[^4" .. expectedName .. "^1] WARNING^0")
print("^4" .. expectedName .. " ^0is outdated. Please update it from ^5https://github.com/Andyyy7666/ND_Framework ^0| Current Version: ^1" .. verFile .. " ^0| New Version: ^2" .. resp .. " ^0|")
elseif tonumber(verFile) > tonumber(resp) then
print("^4" .. expectedName .. " ^0is outdated. Please update it from ^5https://github.com/Andyyy7666/ND_Framework ^0| Current Version: ^1" .. fileVersion .. " ^0| New Version: ^2" .. githubVersion .. " ^0|")
elseif githubVersion < fileVersion then
print("^1[^4" .. expectedName .. "^1] WARNING^0")
print("^4" .. expectedName .. "s ^0version number is higher than we expected. | Current Version: ^3" .. verFile .. " ^0| Expected Version: ^2" .. resp .. " ^0|")
print("^4" .. expectedName .. " ^0version number is higher than expected | Current Version: ^3" .. fileVersion .. " ^0| Expected Version: ^2" .. githubVersion .. " ^0|")
else
print("^4" .. expectedName .. " ^0is up to date | Current Version: ^2" .. verFile .. " ^0|")
print("^4" .. expectedName .. " ^0is up to date | Current Version: ^2" .. fileVersion .. " ^0|")
end
else
print("^1[^4" .. expectedName .. "^1] WARNING^0")
@@ -34,27 +37,43 @@ PerformHttpRequest("https://raw.githubusercontent.com/Andyyy7666/ND_Framework/ma
end
end)
-- onlinePlayers table.
onlinePlayers = {}
-- Get player identifier function (This will not change the identifier all the time)
function GetPlayerIdentifierFromType(type, source) -- Credits: xander1998, Post: https://forum.cfx.re/t/solved-is-there-a-better-way-to-get-lic-steam-and-ip-than-getplayeridentifiers/236243/2?u=andyyy7666
local identifiers = {}
local identifierCount = GetNumPlayerIdentifiers(source)
for a = 0, identifierCount do
table.insert(identifiers, GetPlayerIdentifier(source, a))
end
for b = 1, #identifiers do
if string.find(identifiers[b], type, 1) then
return identifiers[b]
end
end
return nil
-- Used to retrive the players discord server nickname, discord name and tag, and the roles.
function getUserDiscordInfo(discordUserId)
local data
PerformHttpRequest("https://discordapp.com/api/guilds/" .. server_config.guildId .. "/members/" .. discordUserId, function(errorCode, resultData, resultHeaders)
if errorCode ~= 200 then
return
end
local result = json.decode(resultData)
local roles = {}
for _, roleId in pairs(result.roles) do
roles[roleId] = roleId
end
data = {
nickname = result.nick,
discordTag = tostring(result.user.username) .. "#" .. tostring(result.user.discriminator),
roles = roles
}
end, "GET", "", {["Content-Type"] = "application/json", ["Authorization"] = "Bot " .. server_config.discordServerToken})
while not data do
Citizen.Wait(0)
end
return data
end
function validateMoney(cash, bank)
-- Get player any identifier, available types: steam, license, xbl, ip, discord, live.
function GetPlayerIdentifierFromType(type, source)
local identifierCount = GetNumPlayerIdentifiers(source)
for count = 0, identifierCount do
local identifier = GetPlayerIdentifier(source, count)
if identifier and string.find(identifier, type) then
return identifier
end
end
return nil
end
function validateMoney(cash, bank)
if tonumber(cash) > config.maxStartingCash or tonumber(bank) > config.maxStartingBank then
return false
end
@@ -62,12 +81,13 @@ function validateMoney(cash, bank)
end
function validateDepartment(player, department)
local rolePermission = false
local departmentExists = config.departments[department]
if departmentExists then
for i = 1, #departmentExists do
rolePermission = IsRolePresent(player, department, departmentExists[i], "start")
if rolePermission then
local discordUserId = string.gsub(GetPlayerIdentifierFromType("discord", player), "discord:", "")
local roles = getUserDiscordInfo(discordUserId).roles
for _, roleId in pairs(departmentExists) do
if roles[roleId] or roleId == 0 then
return true
end
end
@@ -75,25 +95,22 @@ function validateDepartment(player, department)
return false
end
-- Using the IsRolePresent function from discord.lua to check if the player has the roles.
RegisterNetEvent("checkPerms")
AddEventHandler("checkPerms", function(role)
AddEventHandler("checkPerms", function()
local player = source
local rolePermission = false
for i = 1, #config.departments[role] do
rolePermission = IsRolePresent(player, role, config.departments[role][i], "start")
if rolePermission then
break
local discordUserId = string.gsub(GetPlayerIdentifierFromType("discord", player), "discord:", "")
local allowedRoles = {}
local roles = getUserDiscordInfo(discordUserId).roles
for dept, roleTable in pairs(config.departments) do
for _, roleId in pairs(roleTable) do
if roles[roleId] or roleId == 0 then
table.insert(allowedRoles, dept)
end
end
end
TriggerClientEvent("permsChecked", player, role, rolePermission)
end)
-- Disconnecting a player
RegisterNetEvent("exitGame")
AddEventHandler("exitGame", function()
local player = source
DropPlayer(player, "Disconnected using framework.")
TriggerClientEvent("permsChecked", player, allowedRoles)
end)
-- Inserting the players characters into characters table
@@ -124,7 +141,7 @@ AddEventHandler("newCharacter", function(newCharacter)
local startingCash = newCharacter.startingCash
local startingBank = newCharacter.startingBank
print(startingCash)
if config.enableMoneySystem then
-- Don't trust the client, validate maximum amounts.
local moneyCheck = validateMoney(startingCash, startingBank)
@@ -177,51 +194,8 @@ AddEventHandler("editCharacter", function(newCharacter)
exports.oxmysql:query("UPDATE characters SET first_name = ?, last_name = ?, dob = ?, gender = ?, twt = ?, department = ? WHERE license = ? AND character_id = ?", {newCharacter.firstName, newCharacter.lastName, newCharacter.dateOfBirth, newCharacter.gender, newCharacter.twtName, newCharacter.department, GetPlayerIdentifierFromType("license", player), newCharacter.id})
end)
if config.enableMoneySystem then
-- This is used to find out how much money the player has and use it in the client to show it on the ui.
RegisterNetEvent("getMoney")
AddEventHandler("getMoney", function(characterid)
local player = source
local license = GetPlayerIdentifierFromType("license", player)
exports.oxmysql:query("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {license, characterid}, function(result)
if result then
local cash = result[1].cash
local bank = result[1].bank
onlinePlayers[player].cash = cash
onlinePlayers[player].bank = bank
TriggerClientEvent("returnMoney", player, cash, bank)
end
end)
end)
-- paying command.
RegisterCommand(config.payCommand, function(source, args, raw)
local player = source
local target = tonumber(args[1])
local amount = tonumber(args[2])
transferBank(amount, player, target)
end)
-- Give money command.
RegisterCommand(config.giveCommand, function(source, args, raw)
local player = source
local amount = tonumber(args[1])
giveCashToClosestTarget(amount, player)
end)
-- Salary.
local salaryInterval = config.salaryInterval * 60000
Citizen.CreateThread(function()
while true do
Citizen.Wait(salaryInterval)
for playerid, playerinfo in pairs(onlinePlayers) do
local license = GetPlayerIdentifierFromType("license", playerid)
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {config.salaryAmount, license, playerinfo.characterId})
TriggerClientEvent("receiveSalary", playerid, config.salaryAmount)
end
end
end)
end
-- onlinePlayers table, this is used to store all the players current character info on the server.
onlinePlayers = {}
-- add a player to the table.
RegisterNetEvent("characterOnline")
@@ -252,111 +226,174 @@ AddEventHandler("playerDropped", function(reason)
onlinePlayers[player] = nil
end)
-- Disconnecting a player
RegisterNetEvent("exitGame")
AddEventHandler("exitGame", function()
local player = source
DropPlayer(player, "Disconnected using framework.")
end)
-- this is for the exports
function getCharacterTable()
return onlinePlayers
end
function transferBank(amount, player, target)
exports.oxmysql:query("SELECT bank FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result)
function updateMoney(player)
local player = tonumber(player)
local license = GetPlayerIdentifierFromType("license", player)
exports.oxmysql:query("SELECT cash, bank FROM characters WHERE license = ? AND character_id = ?", {license, onlinePlayers[player].characterId}, function(result)
if result then
if player == target then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "You can't send money to yourself."}
})
elseif GetPlayerPing(target) == 0 then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "That player does not exist."}
})
elseif result[1].bank < amount then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "You don't have enough money."}
})
else
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId})
TriggerClientEvent("updateMoney", target)
TriggerClientEvent("chat:addMessage", player, {
color = {0, 255, 0},
args = {"Success", "You paid " .. onlinePlayers[target].firstName .. " " .. onlinePlayers[target].lastName .. " $" .. amount .. "."}
})
TriggerClientEvent("receiveBank", target, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
end
local cash = result[1].cash
local bank = result[1].bank
onlinePlayers[player].cash = cash
onlinePlayers[player].bank = bank
TriggerClientEvent("updateMoney", player, cash, bank)
end
end)
end
function transferBank(amount, player, target)
local amount = tonumber(amount)
local player = tonumber(player)
local target = tonumber(target)
if player == target then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "You can't send money to yourself."}
})
return false
elseif GetPlayerPing(target) == 0 then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "That player does not exist."}
})
return false
elseif onlinePlayers[player].bank < amount then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "You don't have enough money."}
})
return false
else
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
updateMoney(player)
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId})
updateMoney(target)
TriggerClientEvent("chat:addMessage", player, {
color = {0, 255, 0},
args = {"Success", "You paid " .. onlinePlayers[target].firstName .. " " .. onlinePlayers[target].lastName .. " $" .. amount .. "."}
})
TriggerClientEvent("receiveBank", target, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
return true
end
end
function giveCashToClosestTarget(amount, player)
exports.oxmysql:query("SELECT cash FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result)
if result then
local playerFound = false
local playerCoords = GetEntityCoords(GetPlayerPed(player))
if result[1].cash < amount then
local amount = tonumber(amount)
local player = tonumber(player)
local playerFound = false
local playerCoords = GetEntityCoords(GetPlayerPed(player))
if onlinePlayers[player].cash < amount then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "You don't have enough money."}
})
return false
else
for targetId, targetInfo in pairs(onlinePlayers) do
local targetCoords = GetEntityCoords(GetPlayerPed(targetId))
if (#(playerCoords - targetCoords) < 2.0) and (targetId ~= player) and not playerFound then
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
updateMoney(player)
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", targetId), tonumber(targetInfo.characterId)})
updateMoney(targetId)
playerFound = true
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "You don't have enough money."}
color = {0, 255, 0},
args = {"Success", "You gave " .. onlinePlayers[targetId].firstName .. " " .. onlinePlayers[targetId].lastName .. " $" .. amount .. "."}
})
else
for k, v in pairs(onlinePlayers) do
local targetCoords = GetEntityCoords(GetPlayerPed(k))
if (#(playerCoords - targetCoords) < 2.0) and (k ~= player) and not playerFound then
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", k), tonumber(v.characterId)})
TriggerClientEvent("updateMoney", k)
playerFound = true
TriggerClientEvent("chat:addMessage", player, {
color = {0, 255, 0},
args = {"Success", "You gave " .. onlinePlayers[k].firstName .. " " .. onlinePlayers[k].lastName .. " $" .. amount .. "."}
})
TriggerClientEvent("receiveCash", k, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
break
end
end
if not playerFound then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "No players nearby."}
})
end
playerFound = false
end
TriggerClientEvent("receiveCash", targetId, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
break
end
end
end)
if not playerFound then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "No players nearby."}
})
return false
end
playerFound = false
return true
end
end
function withdrawMoney(amount, player)
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
local amount = tonumber(amount)
local player = tonumber(player)
if onlinePlayers[player].bank >= amount then
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
Citizen.Wait(500)
updateMoney(player)
return true
end
return false
end
function depositMoney(amount, player)
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
local amount = tonumber(amount)
local player = tonumber(player)
if onlinePlayers[player].cash >= amount then
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
Citizen.Wait(500)
updateMoney(player)
return true
end
return false
end
function deductMoney(amount, player, from)
local amount = tonumber(amount)
local player = tonumber(player)
if from == "bank" then
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
Citizen.Wait(500)
updateMoney(player)
elseif from == "cash" then
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
Citizen.Wait(500)
updateMoney(player)
end
end
function addMoney(amount, player, to)
local amount = tonumber(amount)
local player = tonumber(player)
if to == "bank" then
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
Citizen.Wait(500)
updateMoney(player)
elseif to == "cash" then
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
Citizen.Wait(500)
updateMoney(player)
end
end
-- paying command.
RegisterCommand(config.payCommand, function(source, args, raw)
local player = source
local target = tonumber(args[1])
local amount = math.floor(tonumber(args[2]))
transferBank(amount, player, target)
end)
-- Give money command.
RegisterCommand(config.giveCommand, function(source, args, raw)
local player = source
local amount = math.floor(tonumber(args[1]))
giveCashToClosestTarget(amount, player)
end)

View File

@@ -4,42 +4,14 @@
<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>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="script.js" type="text/javascript"></script>
</head>
<body>
<script>
// spawning 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://${GetParentResourceName()}/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">
<img src="https://i.imgur.com/02A5Cgl.png" id="logo">
</div>
<h1 id="serverName"></h1>
@@ -197,4 +169,4 @@
<p id="bank" class="text"></p>
</div>
</body>
</html>
</html>

View File

@@ -4,68 +4,53 @@ $(function() {
// Hide/show ui function
function display(bool) {
if (bool) {
displayOn = true
displayOn = true;
$("body").show();
Money(false)
} else {
displayOn = false
displayOn = false;
$("body").hide();
}
}
function characterCreatorMenu(bool) {
if (bool) {
$("#characterCreator").fadeIn("slow");
$("#characterEditor").hide();
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").hide();
$("#spawnLocation").hide();
} else {
$("#characterCreator").fadeOut("slow");
$("#characterEditor, #exitGameMenu, #deleteCharacterMenu, #spawnLocation").hide();
return;
}
$("#characterCreator").fadeOut("slow");
}
function characterEditorMenu(bool) {
if (bool) {
$("#characterCreator").hide();
$("#characterEditor").fadeIn("slow");
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").hide();
$("#spawnLocation").hide();
} else {
$("#characterEditor").fadeOut("slow");
$("#characterCreator, #exitGameMenu, #deleteCharacterMenu, #spawnLocation").hide();
return;
}
$("#characterEditor").fadeOut("slow");
}
function exitGameMenu(bool) {
if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").fadeIn("slow");
$("#deleteCharacterMenu").hide();
$("#spawnLocation").hide();
} else {
$("#exitGameMenu").fadeOut("slow");
$("#characterCreator, #characterEditor, #deleteCharacterMenu, #spawnLocation").hide();
return;
}
$("#exitGameMenu").fadeOut("slow");
}
function confirmDeleteMenu(bool) {
if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").fadeIn("slow");
$("#spawnLocation").hide();
} else {
$("#deleteCharacterMenu").fadeOut("slow");
$("#characterCreator, #characterEditor, #exitGameMenu, #spawnLocation").hide();
return;
}
$("#deleteCharacterMenu").fadeOut("slow");
}
function spawnMenu(bool) {
if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").hide();
$("#spawnLocation").fadeIn("slow");
} else {
$("#spawnLocation").fadeOut("slow");
$("#characterCreator, #characterEditor, #exitGameMenu, #deleteCharacterMenu").hide();
return;
}
$("#spawnLocation").fadeOut("slow");
}
function Money(bool) {
if (bool) {
@@ -80,13 +65,13 @@ $(function() {
$("#overlay").show();
}
}
display(false)
characterCreatorMenu(false)
characterEditorMenu(false)
exitGameMenu(false)
confirmDeleteMenu(false)
spawnMenu(false)
Money(false)
display(false);
characterCreatorMenu(false);
characterEditorMenu(false);
exitGameMenu(false);
confirmDeleteMenu(false);
spawnMenu(false);
Money(false);
window.addEventListener('message', function(event) {
const item = event.data;
@@ -94,21 +79,36 @@ $(function() {
if (item.status) {
$('#serverName').text(item.serverName);
$("body").css("background-image", "url(" + item.background + ")");
display(true)
display(true);
} else {
display(false)
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)
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)
$("#spawnMenuContainer").empty();
setTimeout(function(){
$("#spawnMenuContainer").append(`<button class="spawnButtons" data-x="${item.x}" data-y="${item.y}" data-z="${item.z}">${item.name}</button>`);
$(".spawnButtons").click(function() {
$.post(`https://${GetParentResourceName()}/tpToLocation`, JSON.stringify({
x: $(this).data("x"),
y: $(this).data("y"),
z: $(this).data("z")
}));
spawnMenu(false);
setTimeout(function(){
$("#spawnMenuContainer").empty();
}, 550);
return;
});
}, 10);
}
if (item.type === "givePerms") {
@@ -127,7 +127,7 @@ $(function() {
$("#bank").text(item.bank);
}
if (item.type === "onStart" && item.enableMoneySystem === true) {
if (item.type === "onStart" && item.enableMoneySystem) {
$("#characterInfoContainerLeft").append('<label class="fourthRowText" for="startingcash">Cash</label><br><input id="startingCash" class="fourthRowInput" type="number" pattern="[0-9]+" placeholder="$2500" name="startingcash" required>');
$("#characterInfoContainerRight").append('<label class="fourthRowText" for="startingbank">Bank</label><br><input id="startingBank" class="fourthRowInput" type="number" pattern="[0-9]+" placeholder="$8000" name="startingbank" style="width: 93%;" required>');
$("#startingBank").attr({
@@ -144,8 +144,8 @@ $(function() {
})
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() {
$("#charactersSection").append(`<button id="characterButton${id}" class="createdButton">${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://${GetParentResourceName()}/setMainCharacter`, JSON.stringify({
firstName: firstName,
@@ -158,25 +158,24 @@ $(function() {
startingBank: startingBank,
character: id
}));
return
})
$("#characterButtonEdit" + id).click(function() {
return;
});
$(`#characterButtonEdit${id}`).click(function() {
characterEditorMenu(true)
$("#newFirstName").val(firstName);
$("#newLastName").val(lastName);
$("#newDateOfBirth").val(dateOfBirth);
$("#newGender").val(gender);
$("#newTwtName").val(twtName);
$("#newDepartment").val(department);
characterEdited = id
return
})
$("#characterButtonDelete" + id).click(function() {
return;
});
$(`#characterButtonDelete${id}`).click(function() {
confirmDeleteMenu(true)
characterDeleting = id
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);
return;
});
}
$("#characterCreator").submit(function() {
@@ -192,8 +191,8 @@ $(function() {
}));
characterCreatorMenu(false)
$("#firstName, #lastName, #dateOfBirth, #twtName, #startingCash, #startingBank").val("")
return false
})
return false;
});
$("#characterEditor").submit(function() {
characterEditorMenu(false)
@@ -207,8 +206,8 @@ $(function() {
id: characterEdited
}));
$("#characterButton" + characterEdited).text($("#newFirstName").val() + " " + $("#newLastName").val() + " (" + $("#newDepartment").val() + ")");
return false
})
return false;
});
$("#deleteCharacterConfirm").click(function() {
confirmDeleteMenu(false)
@@ -224,53 +223,53 @@ $(function() {
$.post(`https://${GetParentResourceName()}/delCharacter`, JSON.stringify({
character: characterDeleting
}));
return
})
return;
});
$("#newCharacterButton").click(function() {
characterCreatorMenu(true)
return
})
return;
});
$("#deleteCharacterCancel").click(function() {
confirmDeleteMenu(false)
return
})
return;
});
$("#cancelCharacterCreation").click(function() {
characterCreatorMenu(false)
return
})
return;
});
$("#cancelCharacterEditing").click(function() {
characterEditorMenu(false)
return
})
return;
});
$("#tpCancel").click(function() {
spawnMenu(false)
setTimeout(function(){
$("#spawnMenuContainer").empty();
}, 550);
return
})
return;
});
$("#tpDoNot").click(function() {
$.post(`https://${GetParentResourceName()}/tpDoNot`);
spawnMenu(false)
setTimeout(function(){
$("#spawnMenuContainer").empty();
}, 550);
return
})
return;
});
$("#quitGameButton").click(function() {
exitGameMenu(true)
return
})
return;
});
$("#exitGameCancel").click(function() {
exitGameMenu(false)
return
})
return;
});
$("#exitGameConfirm").click(function() {
$.post(`https://${GetParentResourceName()}/exitGame`);
return
})
});
return;
});
});

View File

@@ -104,6 +104,7 @@ body {
border-radius: 0.5vh;
transition: 0.3s;
white-space: nowrap;
text-transform: capitalize;
}
.createdButtonEdit {
@@ -283,4 +284,4 @@ body {
#bank {
top: 9vh;
right: 1.5vw;
}
}