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 -- For support join my discord: https://discord.gg/Z9Mxu72zZ6
config = { config = {
serverName = "Andy's Development", -- Server name to display on the ui. serverName = "Andy's Development",
characterLimit = 15, characterLimit = 15,
changeCharacterCommand = "changecharacter", -- this is the command to open the ui again and change your character. 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. -- set your backgrounds, if you have more than 1 then it will randomly change everytime you open the ui.
backgrounds = { backgrounds = {
@@ -12,13 +13,12 @@ config = {
"https://i.imgur.com/ZWKfYD9.png" -- Credits: 2XRondo#6374 "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 = { departments = {
["CIV"] = {"0"}, ["CIV"] = {"872921520719142932"},
["SAHP"] = {"0"}, ["SAHP"] = {"872921520719142932"},
["LSPD"] = {"0"}, ["LSPD"] = {"872921520719142932"},
["BCSO"] = {"0"}, ["BCSO"] = {"872921520719142932"},
["LSFD"] = {"0"} ["LSFD"] = {"872921520719142932"}
}, },
-- set up the spawn buttons for each department. -- set up the spawn buttons for each department.
@@ -54,51 +54,14 @@ config = {
-- Money related -- Money related
enableMoneySystem = true, enableMoneySystem = true,
legacyMoneyDisplay = false, -- set to tru if you want to use the hud from my standalone money system.
maxStartingCash = 2500, maxStartingCash = 2500,
maxStartingBank = 8000, maxStartingBank = 8000,
payCommand = "pay", -- Command to transfer someone money from bank account. payCommand = "pay", -- Command to transfer someone money from bank account.
giveCommand = "give", -- Command to give someone close money from wallet. 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 -- Discord Rich precence
enableRichPrecence = true, enableRichPrecence = true,
updateIntervall = 10, -- how many seconds delay until it updates status. updateIntervall = 60, -- how many seconds delay until it updates status.
appId = 858146067018416128, appId = 858146067018416128,
largeLogo = "andyyy", largeLogo = "andyyy",
smallLogo = "andyyy", smallLogo = "andyyy",
@@ -106,4 +69,4 @@ config = {
firstButtonLink = "https://discord.gg/Z9Mxu72zZ6", firstButtonLink = "https://discord.gg/Z9Mxu72zZ6",
secondButtonName = "TEBEX", secondButtonName = "TEBEX",
secondButtonLink = "https://andyyy.tebex.io/category/fivem-scripts" secondButtonLink = "https://andyyy.tebex.io/category/fivem-scripts"
} }

View File

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

View File

@@ -1,8 +1,8 @@
-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 -- For support join my discord: https://discord.gg/Z9Mxu72zZ6
author "Andyyy#7666" author "Andyyy#7666"
description "ND Framework Core" description "ND-Core"
version "1.4.0" version "2.0.0"
fx_version "cerulean" fx_version "cerulean"
game "gta5" game "gta5"
@@ -10,29 +10,22 @@ lua54 "yes"
files { files {
"source/ui/index.html", "source/ui/index.html",
"source/ui/js/jquery-3.6.0.min.js", "source/ui/script.js",
"source/ui/js/listener.js", "source/ui/style.css"
"source/ui/Logo.png",
"source/ui/style.css",
} }
ui_page "source/ui/index.html" ui_page "source/ui/index.html"
shared_script "config_client.lua" shared_script "config_client.lua"
client_script "source/client.lua"
server_scripts { server_scripts {
"config_server.lua", "config_server.lua",
"source/server/discord.lua", "source/server.lua"
"source/server/main.lua",
"source/server/commands.lua"
}
client_scripts {
"source/client/main.lua",
"source/client/commands.lua"
} }
exports { 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 { server_exports {
"transferBank", -- exports["ND_Core"]:transferBank(amount, player, target) "transferBank", -- exports["ND_Core"]:transferBank(amount, player, target)
"giveCashToClosestTarget", -- exports["ND_Core"]:giveCashToClosestTarget(amount, player) "giveCashToClosestTarget", -- exports["ND_Core"]:giveCashToClosestTarget(amount, player)
@@ -40,10 +33,11 @@ server_exports {
"depositMoney", -- exports["ND_Core"]:depositMoney(amount, player) "depositMoney", -- exports["ND_Core"]:depositMoney(amount, player)
"deductMoney", -- exports["ND_Core"]:deductMoney(amount, player, from) "deductMoney", -- exports["ND_Core"]:deductMoney(amount, player, from)
"addMoney", -- exports["ND_Core"]:addMoney(amount, player, to) "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. "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: Keys in the getCharacterTable:
@@ -60,4 +54,4 @@ server_exports {
Usage: Usage:
players = exports["ND_Core"]:getCharacterTable() players = exports["ND_Core"]:getCharacterTable()
print(players[3].bank) this will print the bank account of the player with id 3. 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', `cash` INT(10) NULL DEFAULT '0',
`bank` INT(10) NULL DEFAULT '0', `bank` INT(10) NULL DEFAULT '0',
PRIMARY KEY (`character_id`) USING BTREE PRIMARY KEY (`character_id`) USING BTREE
); );

View File

@@ -1,58 +1,92 @@
-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 -- For support join my discord: https://discord.gg/Z9Mxu72zZ6
local background = config.backgrounds[math.random(1, #config.backgrounds)] local selectedCharacter
local started = true local characterAmount = 0
local priorityText = nil
registered = false function SetDisplay(bool, typeName, bg)
cash = nil if not bg then
bank = nil 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. -- This is used to add department drop down on the ui.
RegisterNetEvent("permsChecked") RegisterNetEvent("permsChecked")
AddEventHandler("permsChecked", function(role, rolePermission) AddEventHandler("permsChecked", function(allowedRoles)
if rolePermission then for _, dept in pairs(allowedRoles) do
SendNUIMessage({ SendNUIMessage({
type = "givePerms", type = "givePerms",
deptRole = role deptRole = dept
}) })
end end
end) end)
RegisterNetEvent("refreshCharacters") -- Notification when you recieve money.
AddEventHandler("refreshCharacters", function() RegisterNetEvent("receiveBank")
TriggerServerEvent("getCharacters") 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) end)
Citizen.CreateThread(function() -- Notification when you receive cash.
while started do RegisterNetEvent("receiveCash")
Citizen.Wait(200) AddEventHandler("receiveCash", function(amount, playerSending, playerId)
local ped = PlayerPedId() BeginTextCommandThefeedPost("STRING")
if IsPedOnFoot(ped) or IsPedInVehicle(ped, GetVehiclePedIsIn(ped, false), false) then AddTextComponentSubstringPlayerName(playerSending .. " gave you $" .. amount .. ".")
print("^0This framework is created by ^5Andyyy#7666 ^0for support you can join the ^5discord: ^0https://discord.gg/Z9Mxu72zZ6") EndTextCommandThefeedPostMessagetext("CHAR_DEFAULT", "CHAR_DEFAULT", true, 9, playerSending .. " [".. playerId .."]", "")
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
end) end)
RegisterNUICallback("exitGame", function(data) RegisterNetEvent("updateMoney")
TriggerServerEvent("exitGame") AddEventHandler("updateMoney", function(cash, bank)
selectedCharacter.cash = cash
selectedCharacter.bank = bank
end) end)
-- Gets all the characters and displays them on the ui.
RegisterNetEvent("returnCharacters") RegisterNetEvent("returnCharacters")
AddEventHandler("returnCharacters", function(characters) AddEventHandler("returnCharacters", function(characters)
characterAmount = 0 characterAmount = 0
@@ -77,59 +111,21 @@ AddEventHandler("returnCharacters", function(characters)
SetDisplay(true, "ui", background) SetDisplay(true, "ui", background)
end) end)
-- Creating a character -- Selecting a player from the iu.
RegisterNUICallback("newCharacter", function(data) RegisterNUICallback("setMainCharacter", function(data)
if characterAmount < config.characterLimit then selectedCharacter = {
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 = {
firstName = data.firstName, firstName = data.firstName,
lastName = data.lastName, lastName = data.lastName,
dateOfBirth = data.dateOfBirth, dob = data.dateOfBirth,
gender = data.gender, gender = data.gender,
twtName = data.twtName, twt = data.twtName,
department = data.department, department = data.department,
id = data.id cash = data.startingCash,
bank = data.startingBank,
id = data.character
} }
TriggerServerEvent("editCharacter", newCharacter)
end)
-- deleting a character for _, spawn in pairs(config.spawns[selectedCharacter.department]) do
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
SendNUIMessage({ SendNUIMessage({
type = "setSpawns", type = "setSpawns",
x = spawn.x, x = spawn.x,
@@ -139,74 +135,54 @@ RegisterNUICallback("setMainCharacter", function(data)
}) })
end end
TriggerServerEvent("characterOnline", mainCharaterId) TriggerServerEvent("characterOnline", selectedCharacter.id)
TriggerServerEvent("getPriority") TriggerEvent("characterChanged", selectedCharacter)
registered = true
end) end)
if config.enableMoneySystem then -- Creating a character from the ui.
-- This will display the money that the player has. RegisterNUICallback("newCharacter", function(data)
RegisterNetEvent("returnMoney") if characterAmount < config.characterLimit then
AddEventHandler("returnMoney", function(newCash, newBank) TriggerServerEvent("newCharacter", {
while not registered do firstName = data.firstName,
Citizen.Wait(10) lastName = data.lastName,
end dateOfBirth = data.dateOfBirth,
cash = tostring(newCash) gender = data.gender,
bank = tostring(newBank) twtName = data.twtName,
if config.legacyMoneyDisplay then department = data.department,
if registered then startingCash = data.startingCash,
while true do startingBank = data.startingBank
Citizen.Wait(0) })
text("💵", 0.885, 0.028, 0.35, 7) end
text("💳", 0.885, 0.068, 0.35, 7) end)
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)
-- This is to update the players money on the ui. -- editing a character from the ui.
RegisterNetEvent("updateMoney") RegisterNUICallback("editCharacter", function(data)
AddEventHandler("updateMoney", function() TriggerServerEvent("editCharacter", {
TriggerServerEvent("getMoney", mainCharaterId) firstName = data.firstName,
end) lastName = data.lastName,
dateOfBirth = data.dateOfBirth,
gender = data.gender,
twtName = data.twtName,
department = data.department,
id = data.id
})
end)
-- Notification when you recieve money. -- deleting a character from the ui.
RegisterNetEvent("receiveBank") RegisterNUICallback("delCharacter", function(data)
AddEventHandler("receiveBank", function(amount, playerSending, playerId) TriggerServerEvent("delCharacter", data.character)
BeginTextCommandThefeedPost("STRING") characterAmount = characterAmount -1
AddTextComponentSubstringPlayerName("Received $" .. amount .. " from " .. playerSending .. " [".. playerId .."]") SendNUIMessage({
EndTextCommandThefeedPostMessagetext("CHAR_BANK_FLEECA", "CHAR_BANK_FLEECA", true, 9,"FleecaBank", "") characterAmount = characterAmount .. "/" .. config.characterLimit
end) })
end)
-- Notification when you receive cash. -- Quit button from ui.
RegisterNetEvent("receiveCash") RegisterNUICallback("exitGame", function(data)
AddEventHandler("receiveCash", function(amount, playerSending, playerId) TriggerServerEvent("exitGame")
BeginTextCommandThefeedPost("STRING") end)
AddTextComponentSubstringPlayerName(playerSending .. " gave you $" .. amount .. ".")
EndTextCommandThefeedPostMessagetext("CHAR_DEFAULT", "CHAR_DEFAULT", true, 9, playerSending .. " [".. playerId .."]", "")
end)
-- Notification when receiving salary. -- Teleporting using ui.
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
RegisterNUICallback("tpToLocation", function(data) RegisterNUICallback("tpToLocation", function(data)
local ped = PlayerPedId() local ped = PlayerPedId()
FreezeEntityPosition(ped, false) FreezeEntityPosition(ped, false)
@@ -218,7 +194,7 @@ RegisterNUICallback("tpToLocation", function(data)
Citizen.Wait(500) Citizen.Wait(500)
FreezeEntityPosition(ped, false) FreezeEntityPosition(ped, false)
SetEntityVisible(ped, true, 0) SetEntityVisible(ped, true, 0)
TriggerServerEvent("getMoney", mainCharaterId) TriggerServerEvent("getMoney", selectedCharacter.id)
end) end)
-- Choosing the do not tp button. -- Choosing the do not tp button.
@@ -230,128 +206,61 @@ RegisterNUICallback("tpDoNot", function()
Citizen.Wait(500) Citizen.Wait(500)
SetEntityVisible(ped, true, 0) SetEntityVisible(ped, true, 0)
FreezeEntityPosition(ped, false) FreezeEntityPosition(ped, false)
TriggerServerEvent("getMoney", mainCharaterId) TriggerServerEvent("getMoney", selectedCharacter.id)
end) end)
function SetDisplay(bool, typeName, bg) -- discord rich precense will show on a users profile.
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
if config.enableRichPrecence then if config.enableRichPrecence then
Citizen.CreateThread(function() Citizen.CreateThread(function()
while true do while true do
Citizen.Wait(config.updateIntervall * 1000)
SetDiscordAppId(config.appId) SetDiscordAppId(config.appId)
if registered then if selectedCharacter then
SetRichPresence(" Playing : " .. config.serverName .. " as " .. mainFirstName .. " " .. mainLastName) SetRichPresence(" Playing : " .. config.serverName .. " as " .. selectedCharacter.firstName .. " " .. selectedCharacter.lastName)
SetDiscordRichPresenceAsset(config.largeLogo) SetDiscordRichPresenceAsset(config.largeLogo)
SetDiscordRichPresenceAssetText("Playing: " .. config.serverName) SetDiscordRichPresenceAssetText("Playing: " .. config.serverName)
SetDiscordRichPresenceAssetSmall(config.smallLogo) SetDiscordRichPresenceAssetSmall(config.smallLogo)
SetDiscordRichPresenceAssetSmallText("Playing as: " .. mainFirstName .. " " .. mainLastName) SetDiscordRichPresenceAssetSmallText("Playing as: " .. selectedCharacter.firstName .. " " .. selectedCharacter.lastName)
SetDiscordRichPresenceAction(0, config.firstButtonName, config.firstButtonLink) SetDiscordRichPresenceAction(0, config.firstButtonName, config.firstButtonLink)
SetDiscordRichPresenceAction(1, config.secondButtonName, config.secondButtonLink) SetDiscordRichPresenceAction(1, config.secondButtonName, config.secondButtonLink)
end end
Citizen.Wait(config.updateIntervall * 1000)
end end
end) end)
end end
if config.enablePriorityCooldown then -- show server name, first name, last name, and the amount of money the character has in the pause menu.
TriggerEvent("chat:addSuggestion", "/" .. config.startPriorityCommand, "Start a priority.") if config.customPauseMenu then
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
Citizen.CreateThread(function() Citizen.CreateThread(function()
while true do while true do
Citizen.Wait(0) Citizen.Wait(0)
if config.hideAmmoAndMoney then if selectedCharacter 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 IsPauseMenuActive() then if IsPauseMenuActive() then
BeginScaleformMovieMethodOnFrontendHeader("SET_HEADING_DETAILS") BeginScaleformMovieMethodOnFrontendHeader("SET_HEADING_DETAILS")
AddTextEntry("FE_THDR_GTAO", config.serverName) AddTextEntry("FE_THDR_GTAO", config.serverName)
ScaleformMovieMethodAddParamPlayerNameString(mainFirstName .. " " .. mainLastName) ScaleformMovieMethodAddParamPlayerNameString(selectedCharacter.firstName .. " " .. selectedCharacter.lastName)
if registered and config.enableMoneySystem then if config.enableMoneySystem then
PushScaleformMovieFunctionParameterString("Cash: $" .. cash) PushScaleformMovieFunctionParameterString("Cash: $" .. tostring(selectedCharacter.cash))
PushScaleformMovieFunctionParameterString("Bank: $" .. bank) PushScaleformMovieFunctionParameterString("Bank: $" .. tostring(selectedCharacter.bank))
end end
EndScaleformMovieMethod() EndScaleformMovieMethod()
end end
end end
if config.enablePriorityCooldown and priorityText and config.enablePriorityDefaultHUD then
text(priorityText, 0.182, 0.891, 0.4, 4)
end
end end
end) end)
end end
-- Notification above the map. -- Change character command
function notify(message) RegisterCommand(config.changeCharacterCommand, function()
BeginTextCommandThefeedPost("STRING") SwitchOutPlayer(PlayerPedId(), 0, 1)
AddTextComponentSubstringPlayerName(message) Citizen.Wait(2000)
EndTextCommandThefeedPostTicker(0,1) FreezeEntityPosition(ped, true)
end SetEntityVisible(ped, false, 0)
SetDisplay(true, "ui")
end, false)
function getCharacterInfo(infoType) -- chat suggestions
if registered then TriggerEvent("chat:addSuggestion", "/" .. config.changeCharacterCommand, "Switch your framework character.")
mainCharacter = { if config.enableMoneySystem then
mainFirstName, TriggerEvent("chat:addSuggestion", "/" .. config.payCommand, "Transfer money to player", {{name="id", help="Player server id" }, {name="amount", help="amount to pay"}})
mainLastName, TriggerEvent("chat:addSuggestion", "/" .. config.giveCommand, "Give money to closeby player", {{name="amount", help="amount to give"}})
mainDateOfBirth, end
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

View File

@@ -10,23 +10,26 @@ if resource ~= expectedName then
end end
-- check if resource version is up to date -- 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) PerformHttpRequest("https://raw.githubusercontent.com/Andyyy7666/ND_Framework/main/ND_Core/fxmanifest.lua", function(errorCode, resultData, resultHeaders)
i, j = string.find(tostring(res), "version") i, j = string.find(tostring(resultData), "version")
res = string.sub(tostring(res), i, j + 6) resultData = string.sub(tostring(resultData), i, j + 12)
res = string.gsub(res, "version ", "") resultData = string.gsub(resultData, "version \"", "")
res = string.gsub(res, '"', "") i, j = string.find(resultData, "\"")
resp = tonumber(res) resultData = string.sub(resultData, 1, i - 1)
verFile = GetResourceMetadata(expectedName, "version", 0) local githubVersion = string.gsub(resultData, "%.", "")
local fileVersion = string.gsub(GetResourceMetadata(expectedName, "version", 0), "%.", "")
if verFile then githubVersion = tonumber(githubVersion)
if tonumber(verFile) < resp then fileVersion = tonumber(fileVersion)
if githubVersion and fileVersion then
if githubVersion > fileVersion then
print("^1[^4" .. expectedName .. "^1] WARNING^0") 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|") 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 tonumber(verFile) > tonumber(resp) then elseif githubVersion < fileVersion then
print("^1[^4" .. expectedName .. "^1] WARNING^0") 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 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 end
else else
print("^1[^4" .. expectedName .. "^1] WARNING^0") print("^1[^4" .. expectedName .. "^1] WARNING^0")
@@ -34,27 +37,43 @@ PerformHttpRequest("https://raw.githubusercontent.com/Andyyy7666/ND_Framework/ma
end end
end) end)
-- onlinePlayers table. -- Used to retrive the players discord server nickname, discord name and tag, and the roles.
onlinePlayers = {} function getUserDiscordInfo(discordUserId)
local data
-- Get player identifier function (This will not change the identifier all the time) PerformHttpRequest("https://discordapp.com/api/guilds/" .. server_config.guildId .. "/members/" .. discordUserId, function(errorCode, resultData, resultHeaders)
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 if errorCode ~= 200 then
local identifiers = {} return
local identifierCount = GetNumPlayerIdentifiers(source) end
local result = json.decode(resultData)
for a = 0, identifierCount do local roles = {}
table.insert(identifiers, GetPlayerIdentifier(source, a)) for _, roleId in pairs(result.roles) do
end roles[roleId] = roleId
end
for b = 1, #identifiers do data = {
if string.find(identifiers[b], type, 1) then nickname = result.nick,
return identifiers[b] discordTag = tostring(result.user.username) .. "#" .. tostring(result.user.discriminator),
end roles = roles
end }
return nil end, "GET", "", {["Content-Type"] = "application/json", ["Authorization"] = "Bot " .. server_config.discordServerToken})
while not data do
Citizen.Wait(0)
end
return data
end 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 if tonumber(cash) > config.maxStartingCash or tonumber(bank) > config.maxStartingBank then
return false return false
end end
@@ -62,12 +81,13 @@ function validateMoney(cash, bank)
end end
function validateDepartment(player, department) function validateDepartment(player, department)
local rolePermission = false
local departmentExists = config.departments[department] local departmentExists = config.departments[department]
if departmentExists then if departmentExists then
for i = 1, #departmentExists do local discordUserId = string.gsub(GetPlayerIdentifierFromType("discord", player), "discord:", "")
rolePermission = IsRolePresent(player, department, departmentExists[i], "start") local roles = getUserDiscordInfo(discordUserId).roles
if rolePermission then
for _, roleId in pairs(departmentExists) do
if roles[roleId] or roleId == 0 then
return true return true
end end
end end
@@ -75,25 +95,22 @@ function validateDepartment(player, department)
return false return false
end end
-- Using the IsRolePresent function from discord.lua to check if the player has the roles.
RegisterNetEvent("checkPerms") RegisterNetEvent("checkPerms")
AddEventHandler("checkPerms", function(role) AddEventHandler("checkPerms", function()
local player = source local player = source
local rolePermission = false local discordUserId = string.gsub(GetPlayerIdentifierFromType("discord", player), "discord:", "")
for i = 1, #config.departments[role] do local allowedRoles = {}
rolePermission = IsRolePresent(player, role, config.departments[role][i], "start") local roles = getUserDiscordInfo(discordUserId).roles
if rolePermission then
break 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
end end
TriggerClientEvent("permsChecked", player, role, rolePermission)
end)
-- Disconnecting a player TriggerClientEvent("permsChecked", player, allowedRoles)
RegisterNetEvent("exitGame")
AddEventHandler("exitGame", function()
local player = source
DropPlayer(player, "Disconnected using framework.")
end) end)
-- Inserting the players characters into characters table -- Inserting the players characters into characters table
@@ -124,7 +141,7 @@ AddEventHandler("newCharacter", function(newCharacter)
local startingCash = newCharacter.startingCash local startingCash = newCharacter.startingCash
local startingBank = newCharacter.startingBank local startingBank = newCharacter.startingBank
print(startingCash)
if config.enableMoneySystem then if config.enableMoneySystem then
-- Don't trust the client, validate maximum amounts. -- Don't trust the client, validate maximum amounts.
local moneyCheck = validateMoney(startingCash, startingBank) local moneyCheck = validateMoney(startingCash, startingBank)
@@ -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}) exports.oxmysql:query("UPDATE characters SET first_name = ?, last_name = ?, dob = ?, gender = ?, twt = ?, department = ? WHERE license = ? AND character_id = ?", {newCharacter.firstName, newCharacter.lastName, newCharacter.dateOfBirth, newCharacter.gender, newCharacter.twtName, newCharacter.department, GetPlayerIdentifierFromType("license", player), newCharacter.id})
end) end)
if config.enableMoneySystem then -- onlinePlayers table, this is used to store all the players current character info on the server.
-- This is used to find out how much money the player has and use it in the client to show it on the ui. onlinePlayers = {}
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
-- add a player to the table. -- add a player to the table.
RegisterNetEvent("characterOnline") RegisterNetEvent("characterOnline")
@@ -252,111 +226,174 @@ AddEventHandler("playerDropped", function(reason)
onlinePlayers[player] = nil onlinePlayers[player] = nil
end) 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() function getCharacterTable()
return onlinePlayers return onlinePlayers
end end
function transferBank(amount, player, target) function updateMoney(player)
exports.oxmysql:query("SELECT bank FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result) 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 result then
if player == target then local cash = result[1].cash
TriggerClientEvent("chat:addMessage", player, { local bank = result[1].bank
color = {255, 0, 0}, onlinePlayers[player].cash = cash
args = {"Error", "You can't send money to yourself."} onlinePlayers[player].bank = bank
}) TriggerClientEvent("updateMoney", player, cash, bank)
elseif GetPlayerPing(target) == 0 then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "That player does not exist."}
})
elseif result[1].bank < amount then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "You don't have enough money."}
})
else
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", target), onlinePlayers[target].characterId})
TriggerClientEvent("updateMoney", target)
TriggerClientEvent("chat:addMessage", player, {
color = {0, 255, 0},
args = {"Success", "You paid " .. onlinePlayers[target].firstName .. " " .. onlinePlayers[target].lastName .. " $" .. amount .. "."}
})
TriggerClientEvent("receiveBank", target, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
end
end end
end) end)
end end
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) function giveCashToClosestTarget(amount, player)
exports.oxmysql:query("SELECT cash FROM characters WHERE license = ? AND character_id = ?", {GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}, function(result) local amount = tonumber(amount)
if result then local player = tonumber(player)
local playerFound = false local playerFound = false
local playerCoords = GetEntityCoords(GetPlayerPed(player)) local playerCoords = GetEntityCoords(GetPlayerPed(player))
if result[1].cash < amount then 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, { TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0}, color = {0, 255, 0},
args = {"Error", "You don't have enough money."} args = {"Success", "You gave " .. onlinePlayers[targetId].firstName .. " " .. onlinePlayers[targetId].lastName .. " $" .. amount .. "."}
}) })
else TriggerClientEvent("receiveCash", targetId, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
for k, v in pairs(onlinePlayers) do break
local targetCoords = GetEntityCoords(GetPlayerPed(k)) end
if (#(playerCoords - targetCoords) < 2.0) and (k ~= player) and not playerFound then
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player)
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", k), tonumber(v.characterId)})
TriggerClientEvent("updateMoney", k)
playerFound = true
TriggerClientEvent("chat:addMessage", player, {
color = {0, 255, 0},
args = {"Success", "You gave " .. onlinePlayers[k].firstName .. " " .. onlinePlayers[k].lastName .. " $" .. amount .. "."}
})
TriggerClientEvent("receiveCash", k, amount, onlinePlayers[player].firstName .. " " .. onlinePlayers[player].lastName, player)
break
end
end
if not playerFound then
TriggerClientEvent("chat:addMessage", player, {
color = {255, 0, 0},
args = {"Error", "No players nearby."}
})
end
playerFound = false
end
end 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 end
function withdrawMoney(amount, player) function withdrawMoney(amount, player)
exports.oxmysql:query("UPDATE characters SET bank = bank - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) local amount = tonumber(amount)
exports.oxmysql:query("UPDATE characters SET cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) local player = tonumber(player)
TriggerClientEvent("updateMoney", 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 end
function depositMoney(amount, player) function depositMoney(amount, player)
exports.oxmysql:query("UPDATE characters SET cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) local amount = tonumber(amount)
exports.oxmysql:query("UPDATE characters SET bank = bank + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId}) local player = tonumber(player)
TriggerClientEvent("updateMoney", 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 end
function deductMoney(amount, player, from) function deductMoney(amount, player, from)
local amount = tonumber(amount)
local player = tonumber(player)
if from == "bank" then if from == "bank" 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 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 elseif from == "cash" 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 cash = cash - ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player) Citizen.Wait(500)
updateMoney(player)
end end
end end
function addMoney(amount, player, to) function addMoney(amount, player, to)
local amount = tonumber(amount)
local player = tonumber(player)
if to == "bank" then if to == "bank" 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 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 elseif to == "cash" 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 cash = cash + ? WHERE license = ? AND character_id = ?", {amount, GetPlayerIdentifierFromType("license", player), onlinePlayers[player].characterId})
TriggerClientEvent("updateMoney", player) Citizen.Wait(500)
updateMoney(player)
end end
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"> <meta charset="utf-8">
<link rel="stylesheet" href="style.css"> <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="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="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="js/listener.js" type="text/javascript"></script> <script src="script.js" type="text/javascript"></script>
</head> </head>
<body> <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--> <!--Main page design-->
<section id="overlay"> <section id="overlay">
<div id="logoContainer"> <div id="logoContainer">
<img src="Logo.png" id="logo"> <img src="https://i.imgur.com/02A5Cgl.png" id="logo">
</div> </div>
<h1 id="serverName"></h1> <h1 id="serverName"></h1>
@@ -197,4 +169,4 @@
<p id="bank" class="text"></p> <p id="bank" class="text"></p>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -4,68 +4,53 @@ $(function() {
// Hide/show ui function // Hide/show ui function
function display(bool) { function display(bool) {
if (bool) { if (bool) {
displayOn = true displayOn = true;
$("body").show(); $("body").show();
Money(false) Money(false)
} else { } else {
displayOn = false displayOn = false;
$("body").hide(); $("body").hide();
} }
} }
function characterCreatorMenu(bool) { function characterCreatorMenu(bool) {
if (bool) { if (bool) {
$("#characterCreator").fadeIn("slow"); $("#characterCreator").fadeIn("slow");
$("#characterEditor").hide(); $("#characterEditor, #exitGameMenu, #deleteCharacterMenu, #spawnLocation").hide();
$("#exitGameMenu").hide(); return;
$("#deleteCharacterMenu").hide();
$("#spawnLocation").hide();
} else {
$("#characterCreator").fadeOut("slow");
} }
$("#characterCreator").fadeOut("slow");
} }
function characterEditorMenu(bool) { function characterEditorMenu(bool) {
if (bool) { if (bool) {
$("#characterCreator").hide();
$("#characterEditor").fadeIn("slow"); $("#characterEditor").fadeIn("slow");
$("#exitGameMenu").hide(); $("#characterCreator, #exitGameMenu, #deleteCharacterMenu, #spawnLocation").hide();
$("#deleteCharacterMenu").hide(); return;
$("#spawnLocation").hide();
} else {
$("#characterEditor").fadeOut("slow");
} }
$("#characterEditor").fadeOut("slow");
} }
function exitGameMenu(bool) { function exitGameMenu(bool) {
if (bool) { if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").fadeIn("slow"); $("#exitGameMenu").fadeIn("slow");
$("#deleteCharacterMenu").hide(); $("#characterCreator, #characterEditor, #deleteCharacterMenu, #spawnLocation").hide();
$("#spawnLocation").hide(); return;
} else {
$("#exitGameMenu").fadeOut("slow");
} }
$("#exitGameMenu").fadeOut("slow");
} }
function confirmDeleteMenu(bool) { function confirmDeleteMenu(bool) {
if (bool) { if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").fadeIn("slow"); $("#deleteCharacterMenu").fadeIn("slow");
$("#spawnLocation").hide(); $("#characterCreator, #characterEditor, #exitGameMenu, #spawnLocation").hide();
} else { return;
$("#deleteCharacterMenu").fadeOut("slow");
} }
$("#deleteCharacterMenu").fadeOut("slow");
} }
function spawnMenu(bool) { function spawnMenu(bool) {
if (bool) { if (bool) {
$("#characterCreator").hide();
$("#characterEditor").hide();
$("#exitGameMenu").hide();
$("#deleteCharacterMenu").hide();
$("#spawnLocation").fadeIn("slow"); $("#spawnLocation").fadeIn("slow");
} else { $("#characterCreator, #characterEditor, #exitGameMenu, #deleteCharacterMenu").hide();
$("#spawnLocation").fadeOut("slow"); return;
} }
$("#spawnLocation").fadeOut("slow");
} }
function Money(bool) { function Money(bool) {
if (bool) { if (bool) {
@@ -80,13 +65,13 @@ $(function() {
$("#overlay").show(); $("#overlay").show();
} }
} }
display(false) display(false);
characterCreatorMenu(false) characterCreatorMenu(false);
characterEditorMenu(false) characterEditorMenu(false);
exitGameMenu(false) exitGameMenu(false);
confirmDeleteMenu(false) confirmDeleteMenu(false);
spawnMenu(false) spawnMenu(false);
Money(false) Money(false);
window.addEventListener('message', function(event) { window.addEventListener('message', function(event) {
const item = event.data; const item = event.data;
@@ -94,21 +79,36 @@ $(function() {
if (item.status) { if (item.status) {
$('#serverName').text(item.serverName); $('#serverName').text(item.serverName);
$("body").css("background-image", "url(" + item.background + ")"); $("body").css("background-image", "url(" + item.background + ")");
display(true) display(true);
} else { } else {
display(false) display(false);
} }
} }
$('#playerAmount').text(item.characterAmount); $('#playerAmount').text(item.characterAmount);
if (item.type === "character") { if (item.type === "character") {
characterCreatorMenu(false) characterCreatorMenu(false);
createCharacter(item.firstName, item.lastName, item.dateOfBirth, item.gender, item.twtName, item.department, item.startingCash, item.startingBank, item.id) createCharacter(item.firstName, item.lastName, item.dateOfBirth, item.gender, item.twtName, item.department, item.startingCash, item.startingBank, item.id);
} }
if (item.type === "setSpawns") { 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") { if (item.type === "givePerms") {
@@ -127,7 +127,7 @@ $(function() {
$("#bank").text(item.bank); $("#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>'); $("#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>'); $("#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({ $("#startingBank").attr({
@@ -144,8 +144,8 @@ $(function() {
}) })
function createCharacter(firstName, lastName, dateOfBirth, gender, twtName, department, startingCash, startingBank, id) { 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>'); $("#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() { $(`#characterButton${id}`).click(function() {
spawnMenu(true) spawnMenu(true)
$.post(`https://${GetParentResourceName()}/setMainCharacter`, JSON.stringify({ $.post(`https://${GetParentResourceName()}/setMainCharacter`, JSON.stringify({
firstName: firstName, firstName: firstName,
@@ -158,25 +158,24 @@ $(function() {
startingBank: startingBank, startingBank: startingBank,
character: id character: id
})); }));
return return;
}) });
$("#characterButtonEdit" + id).click(function() { $(`#characterButtonEdit${id}`).click(function() {
characterEditorMenu(true) characterEditorMenu(true)
$("#newFirstName").val(firstName);
$("#newLastName").val(lastName);
$("#newDateOfBirth").val(dateOfBirth);
$("#newGender").val(gender);
$("#newTwtName").val(twtName);
$("#newDepartment").val(department);
characterEdited = id characterEdited = id
return return;
}) });
$("#characterButtonDelete" + id).click(function() { $(`#characterButtonDelete${id}`).click(function() {
confirmDeleteMenu(true) confirmDeleteMenu(true)
characterDeleting = id characterDeleting = id
return 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() { $("#characterCreator").submit(function() {
@@ -192,8 +191,8 @@ $(function() {
})); }));
characterCreatorMenu(false) characterCreatorMenu(false)
$("#firstName, #lastName, #dateOfBirth, #twtName, #startingCash, #startingBank").val("") $("#firstName, #lastName, #dateOfBirth, #twtName, #startingCash, #startingBank").val("")
return false return false;
}) });
$("#characterEditor").submit(function() { $("#characterEditor").submit(function() {
characterEditorMenu(false) characterEditorMenu(false)
@@ -207,8 +206,8 @@ $(function() {
id: characterEdited id: characterEdited
})); }));
$("#characterButton" + characterEdited).text($("#newFirstName").val() + " " + $("#newLastName").val() + " (" + $("#newDepartment").val() + ")"); $("#characterButton" + characterEdited).text($("#newFirstName").val() + " " + $("#newLastName").val() + " (" + $("#newDepartment").val() + ")");
return false return false;
}) });
$("#deleteCharacterConfirm").click(function() { $("#deleteCharacterConfirm").click(function() {
confirmDeleteMenu(false) confirmDeleteMenu(false)
@@ -224,53 +223,53 @@ $(function() {
$.post(`https://${GetParentResourceName()}/delCharacter`, JSON.stringify({ $.post(`https://${GetParentResourceName()}/delCharacter`, JSON.stringify({
character: characterDeleting character: characterDeleting
})); }));
return return;
}) });
$("#newCharacterButton").click(function() { $("#newCharacterButton").click(function() {
characterCreatorMenu(true) characterCreatorMenu(true)
return return;
}) });
$("#deleteCharacterCancel").click(function() { $("#deleteCharacterCancel").click(function() {
confirmDeleteMenu(false) confirmDeleteMenu(false)
return return;
}) });
$("#cancelCharacterCreation").click(function() { $("#cancelCharacterCreation").click(function() {
characterCreatorMenu(false) characterCreatorMenu(false)
return return;
}) });
$("#cancelCharacterEditing").click(function() { $("#cancelCharacterEditing").click(function() {
characterEditorMenu(false) characterEditorMenu(false)
return return;
}) });
$("#tpCancel").click(function() { $("#tpCancel").click(function() {
spawnMenu(false) spawnMenu(false)
setTimeout(function(){ setTimeout(function(){
$("#spawnMenuContainer").empty(); $("#spawnMenuContainer").empty();
}, 550); }, 550);
return return;
}) });
$("#tpDoNot").click(function() { $("#tpDoNot").click(function() {
$.post(`https://${GetParentResourceName()}/tpDoNot`); $.post(`https://${GetParentResourceName()}/tpDoNot`);
spawnMenu(false) spawnMenu(false)
setTimeout(function(){ setTimeout(function(){
$("#spawnMenuContainer").empty(); $("#spawnMenuContainer").empty();
}, 550); }, 550);
return return;
}) });
$("#quitGameButton").click(function() { $("#quitGameButton").click(function() {
exitGameMenu(true) exitGameMenu(true)
return return;
}) });
$("#exitGameCancel").click(function() { $("#exitGameCancel").click(function() {
exitGameMenu(false) exitGameMenu(false)
return return;
}) });
$("#exitGameConfirm").click(function() { $("#exitGameConfirm").click(function() {
$.post(`https://${GetParentResourceName()}/exitGame`); $.post(`https://${GetParentResourceName()}/exitGame`);
return return;
}) });
}); });

View File

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