388 lines
12 KiB
Lua
388 lines
12 KiB
Lua
local QBCore = exports['qb-core']:GetCoreObject()
|
|
local PlayerJob = QBCore.Functions.GetPlayerData().job
|
|
local shownBossMenu = false
|
|
local DynamicMenuItems = {}
|
|
|
|
-- UTIL
|
|
local function CloseMenuFull()
|
|
exports['qb-menu']:closeMenu()
|
|
exports['qb-core']:HideText()
|
|
shownBossMenu = false
|
|
end
|
|
|
|
local function comma_value(amount)
|
|
local formatted = amount
|
|
while true do
|
|
local k
|
|
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
|
|
if (k == 0) then
|
|
break
|
|
end
|
|
end
|
|
return formatted
|
|
end
|
|
|
|
local function AddBossMenuItem(data, id)
|
|
local menuID = id or (#DynamicMenuItems + 1)
|
|
DynamicMenuItems[menuID] = deepcopy(data)
|
|
return menuID
|
|
end
|
|
|
|
exports("AddBossMenuItem", AddBossMenuItem)
|
|
|
|
local function RemoveBossMenuItem(id)
|
|
DynamicMenuItems[id] = nil
|
|
end
|
|
|
|
exports("RemoveBossMenuItem", RemoveBossMenuItem)
|
|
|
|
AddEventHandler('onResourceStart', function(resource)
|
|
if resource == GetCurrentResourceName() then
|
|
PlayerJob = QBCore.Functions.GetPlayerData().job
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
|
|
PlayerJob = QBCore.Functions.GetPlayerData().job
|
|
end)
|
|
|
|
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo)
|
|
PlayerJob = JobInfo
|
|
end)
|
|
|
|
RegisterNetEvent('qb-bossmenu:client:OpenMenu', function()
|
|
if not PlayerJob.name or not PlayerJob.isboss then return end
|
|
|
|
local bossMenu = {
|
|
{
|
|
header = Lang:t("headers.bsm").. string.upper(PlayerJob.label),
|
|
icon = "fa-solid fa-circle-info",
|
|
isMenuHeader = true,
|
|
},
|
|
{
|
|
header = Lang:t("body.manage"),
|
|
txt = Lang:t("body.managed"),
|
|
icon = "fa-solid fa-list",
|
|
params = {
|
|
event = "qb-bossmenu:client:employeelist",
|
|
}
|
|
},
|
|
{
|
|
header = Lang:t("body.hire"),
|
|
txt = Lang:t("body.hired"),
|
|
icon = "fa-solid fa-hand-holding",
|
|
params = {
|
|
event = "qb-bossmenu:client:HireMenu",
|
|
}
|
|
},
|
|
{
|
|
header = Lang:t("body.storage"),
|
|
txt = Lang:t("body.storaged"),
|
|
icon = "fa-solid fa-box-open",
|
|
params = {
|
|
event = "qb-bossmenu:client:Stash",
|
|
}
|
|
},
|
|
{
|
|
header = Lang:t("body.outfits"),
|
|
txt = Lang:t("body.outfitsd"),
|
|
icon = "fa-solid fa-shirt",
|
|
params = {
|
|
event = "qb-bossmenu:client:Wardrobe",
|
|
}
|
|
},
|
|
{
|
|
header = Lang:t("body.money"),
|
|
txt = Lang:t("body.moneyd"),
|
|
icon = "fa-solid fa-sack-dollar",
|
|
params = {
|
|
event = "qb-bossmenu:client:SocietyMenu",
|
|
}
|
|
},
|
|
}
|
|
|
|
for _, v in pairs(DynamicMenuItems) do
|
|
bossMenu[#bossMenu + 1] = v
|
|
end
|
|
|
|
bossMenu[#bossMenu + 1] = {
|
|
header = Lang:t("body.exit"),
|
|
icon = "fa-solid fa-angle-left",
|
|
params = {
|
|
event = "qb-menu:closeMenu",
|
|
}
|
|
}
|
|
|
|
exports['qb-menu']:openMenu(bossMenu)
|
|
end)
|
|
|
|
RegisterNetEvent('qb-bossmenu:client:employeelist', function()
|
|
local EmployeesMenu = {
|
|
{
|
|
header = Lang:t("body.mempl").. string.upper(PlayerJob.label),
|
|
isMenuHeader = true,
|
|
icon = "fa-solid fa-circle-info",
|
|
},
|
|
}
|
|
QBCore.Functions.TriggerCallback('qb-bossmenu:server:GetEmployees', function(cb)
|
|
for _, v in pairs(cb) do
|
|
EmployeesMenu[#EmployeesMenu + 1] = {
|
|
header = v.name,
|
|
txt = v.grade.name,
|
|
icon = "fa-solid fa-circle-user",
|
|
params = {
|
|
event = "qb-bossmenu:client:ManageEmployee",
|
|
args = {
|
|
player = v,
|
|
work = PlayerJob
|
|
}
|
|
}
|
|
}
|
|
end
|
|
EmployeesMenu[#EmployeesMenu + 1] = {
|
|
header = Lang:t("body.return"),
|
|
icon = "fa-solid fa-angle-left",
|
|
params = {
|
|
event = "qb-bossmenu:client:OpenMenu",
|
|
}
|
|
}
|
|
exports['qb-menu']:openMenu(EmployeesMenu)
|
|
end, PlayerJob.name)
|
|
end)
|
|
|
|
RegisterNetEvent('qb-bossmenu:client:ManageEmployee', function(data)
|
|
local EmployeeMenu = {
|
|
{
|
|
header = Lang:t("body.mngpl").. data.player.name .. " - " .. string.upper(PlayerJob.label),
|
|
isMenuHeader = true,
|
|
icon = "fa-solid fa-circle-info"
|
|
},
|
|
}
|
|
for k, v in pairs(QBCore.Shared.Jobs[data.work.name].grades) do
|
|
EmployeeMenu[#EmployeeMenu + 1] = {
|
|
header = v.name,
|
|
txt = Lang:t("body.grade") .. k,
|
|
params = {
|
|
isServer = true,
|
|
event = "qb-bossmenu:server:GradeUpdate",
|
|
icon = "fa-solid fa-file-pen",
|
|
args = {
|
|
cid = data.player.empSource,
|
|
grade = tonumber(k),
|
|
gradename = v.name
|
|
}
|
|
}
|
|
}
|
|
end
|
|
EmployeeMenu[#EmployeeMenu + 1] = {
|
|
header = Lang:t("body.fireemp"),
|
|
icon = "fa-solid fa-user-large-slash",
|
|
params = {
|
|
isServer = true,
|
|
event = "qb-bossmenu:server:FireEmployee",
|
|
args = data.player.empSource
|
|
}
|
|
}
|
|
EmployeeMenu[#EmployeeMenu + 1] = {
|
|
header = Lang:t("body.return"),
|
|
icon = "fa-solid fa-angle-left",
|
|
params = {
|
|
event = "qb-bossmenu:client:OpenMenu",
|
|
}
|
|
}
|
|
exports['qb-menu']:openMenu(EmployeeMenu)
|
|
end)
|
|
|
|
RegisterNetEvent('qb-bossmenu:client:Stash', function()
|
|
TriggerServerEvent("inventory:server:OpenInventory", "stash", "boss_" .. PlayerJob.name, {
|
|
maxweight = 4000000,
|
|
slots = 25,
|
|
})
|
|
TriggerEvent("inventory:client:SetCurrentStash", "boss_" .. PlayerJob.name)
|
|
end)
|
|
|
|
RegisterNetEvent('qb-bossmenu:client:Wardrobe', function()
|
|
TriggerEvent('qb-clothing:client:openOutfitMenu')
|
|
end)
|
|
|
|
RegisterNetEvent('qb-bossmenu:client:HireMenu', function()
|
|
local HireMenu = {
|
|
{
|
|
header = Lang:t("body.hireemp").. string.upper(PlayerJob.label),
|
|
isMenuHeader = true,
|
|
icon = "fa-solid fa-circle-info",
|
|
},
|
|
}
|
|
QBCore.Functions.TriggerCallback('qb-bossmenu:getplayers', function(players)
|
|
for _, v in pairs(players) do
|
|
if v and v ~= PlayerId() then
|
|
HireMenu[#HireMenu + 1] = {
|
|
header = v.name,
|
|
txt = Lang:t("body.cid").. v.citizenid .. " - ID: " .. v.sourceplayer,
|
|
icon = "fa-solid fa-user-check",
|
|
params = {
|
|
isServer = true,
|
|
event = "qb-bossmenu:server:HireEmployee",
|
|
args = v.sourceplayer
|
|
}
|
|
}
|
|
end
|
|
end
|
|
HireMenu[#HireMenu + 1] = {
|
|
header = Lang:t("body.return"),
|
|
icon = "fa-solid fa-angle-left",
|
|
params = {
|
|
event = "qb-bossmenu:client:OpenMenu",
|
|
}
|
|
}
|
|
exports['qb-menu']:openMenu(HireMenu)
|
|
end)
|
|
end)
|
|
|
|
RegisterNetEvent('qb-bossmenu:client:SocietyMenu', function()
|
|
QBCore.Functions.TriggerCallback('qb-bossmenu:server:GetAccount', function(cb)
|
|
local SocietyMenu = {
|
|
{
|
|
header = Lang:t("body.balance").. comma_value(cb) .. " - " .. string.upper(PlayerJob.label),
|
|
isMenuHeader = true,
|
|
icon = "fa-solid fa-circle-info",
|
|
},
|
|
{
|
|
header = Lang:t("body.deposit"),
|
|
icon = "fa-solid fa-money-bill-transfer",
|
|
txt = Lang:t("body.depositd"),
|
|
params = {
|
|
event = "qb-bossmenu:client:SocetyDeposit",
|
|
args = comma_value(cb)
|
|
}
|
|
},
|
|
{
|
|
header = Lang:t("body.withdraw"),
|
|
icon = "fa-solid fa-money-bill-transfer",
|
|
txt = Lang:t("body.withdrawd"),
|
|
params = {
|
|
event = "qb-bossmenu:client:SocetyWithDraw",
|
|
args = comma_value(cb)
|
|
}
|
|
},
|
|
{
|
|
header = Lang:t("body.return"),
|
|
icon = "fa-solid fa-angle-left",
|
|
params = {
|
|
event = "qb-bossmenu:client:OpenMenu",
|
|
}
|
|
},
|
|
}
|
|
exports['qb-menu']:openMenu(SocietyMenu)
|
|
end, PlayerJob.name)
|
|
end)
|
|
|
|
RegisterNetEvent('qb-bossmenu:client:SocetyDeposit', function(money)
|
|
local deposit = exports['qb-input']:ShowInput({
|
|
header = Lang:t("body.depositm").. money,
|
|
submitText = Lang:t("body.submit"),
|
|
inputs = {
|
|
{
|
|
type = 'number',
|
|
isRequired = true,
|
|
name = 'amount',
|
|
text = Lang:t("body.amount")
|
|
}
|
|
}
|
|
})
|
|
if deposit then
|
|
if not deposit.amount then return end
|
|
TriggerServerEvent("qb-bossmenu:server:depositMoney", tonumber(deposit.amount))
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('qb-bossmenu:client:SocetyWithDraw', function(money)
|
|
local withdraw = exports['qb-input']:ShowInput({
|
|
header = Lang:t("body.withdrawm").. money,
|
|
submitText = Lang:t("body.submit"),
|
|
inputs = {
|
|
{
|
|
type = 'number',
|
|
isRequired = true,
|
|
name = 'amount',
|
|
text = Lang:t("body.amount")
|
|
}
|
|
}
|
|
})
|
|
if withdraw then
|
|
if not withdraw.amount then return end
|
|
TriggerServerEvent("qb-bossmenu:server:withdrawMoney", tonumber(withdraw.amount))
|
|
end
|
|
end)
|
|
|
|
-- MAIN THREAD
|
|
CreateThread(function()
|
|
if Config.UseTarget then
|
|
for job, zones in pairs(Config.BossMenuZones) do
|
|
for index, data in ipairs(zones) do
|
|
exports['qb-target']:AddBoxZone(job.."-BossMenu-"..index, data.coords, data.length, data.width, {
|
|
name = job.."-BossMenu-"..index,
|
|
heading = data.heading,
|
|
-- debugPoly = true,
|
|
minZ = data.minZ,
|
|
maxZ = data.maxZ,
|
|
}, {
|
|
options = {
|
|
{
|
|
type = "client",
|
|
event = "qb-bossmenu:client:OpenMenu",
|
|
icon = "fas fa-sign-in-alt",
|
|
label = Lang:t("target.label"),
|
|
canInteract = function() return job == PlayerJob.name and PlayerJob.isboss end,
|
|
},
|
|
},
|
|
distance = 2.5
|
|
})
|
|
end
|
|
end
|
|
else
|
|
while true do
|
|
local wait = 2500
|
|
local pos = GetEntityCoords(PlayerPedId())
|
|
local inRangeBoss = false
|
|
local nearBossmenu = false
|
|
if PlayerJob then
|
|
wait = 0
|
|
for k, menus in pairs(Config.BossMenus) do
|
|
for _, coords in ipairs(menus) do
|
|
if k == PlayerJob.name and PlayerJob.isboss then
|
|
if #(pos - coords) < 5.0 then
|
|
inRangeBoss = true
|
|
if #(pos - coords) <= 1.5 then
|
|
nearBossmenu = true
|
|
if not shownBossMenu then
|
|
exports['qb-core']:DrawText(Lang:t("drawtext.label"), 'left')
|
|
shownBossMenu = true
|
|
end
|
|
if IsControlJustReleased(0, 38) then
|
|
exports['qb-core']:HideText()
|
|
TriggerEvent("qb-bossmenu:client:OpenMenu")
|
|
end
|
|
end
|
|
|
|
if not nearBossmenu and shownBossMenu then
|
|
CloseMenuFull()
|
|
shownBossMenu = false
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if not inRangeBoss then
|
|
Wait(1500)
|
|
if shownBossMenu then
|
|
CloseMenuFull()
|
|
shownBossMenu = false
|
|
end
|
|
end
|
|
end
|
|
Wait(wait)
|
|
end
|
|
end
|
|
end)
|