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)