283 lines
		
	
	
	
		
			9.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			283 lines
		
	
	
	
		
			9.1 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 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 = {
 | |
|                 isServer = true,
 | |
|                 event = 'qb-bossmenu:server:stash',
 | |
|             }
 | |
|         },
 | |
|         {
 | |
|             header = Lang:t('body.outfits'),
 | |
|             txt = Lang:t('body.outfitsd'),
 | |
|             icon = 'fa-solid fa-shirt',
 | |
|             params = {
 | |
|                 event = 'qb-bossmenu:client:Wardrobe',
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     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: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)
 | |
| 
 | |
| -- MAIN THREAD
 | |
| CreateThread(function()
 | |
|     if Config.UseTarget then
 | |
|         for job, zones in pairs(Config.BossMenus) do
 | |
|             for index, coords in ipairs(zones) do
 | |
|                 local zoneName = job .. '_bossmenu_' .. index
 | |
|                 exports['qb-target']:AddCircleZone(zoneName, coords, 0.5, {
 | |
|                     name = zoneName,
 | |
|                     debugPoly = false,
 | |
|                     useZ = true
 | |
|                 }, {
 | |
|                     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)
 | 
