Main/resources/[qb]/qb-management/server/sv_boss.lua
2025-06-07 08:51:21 +02:00

184 lines
7 KiB
Lua

local QBCore = exports['qb-core']:GetCoreObject()
function ExploitBan(id, reason)
MySQL.insert('INSERT INTO bans (name, license, discord, ip, reason, expire, bannedby) VALUES (?, ?, ?, ?, ?, ?, ?)', {
GetPlayerName(id),
QBCore.Functions.GetIdentifier(id, 'license'),
QBCore.Functions.GetIdentifier(id, 'discord'),
QBCore.Functions.GetIdentifier(id, 'ip'),
reason,
2147483647,
'qb-management'
})
TriggerEvent('qb-log:server:CreateLog', 'bans', 'Player Banned', 'red', string.format('%s was banned by %s for %s', GetPlayerName(id), 'qb-management', reason), true)
DropPlayer(id, 'You were permanently banned by the server for: Exploiting')
end
-- Get Employees
QBCore.Functions.CreateCallback('qb-bossmenu:server:GetEmployees', function(source, cb, jobname)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player.PlayerData.job.isboss then
ExploitBan(src, 'GetEmployees Exploiting')
return
end
local employees = {}
local players = MySQL.query.await("SELECT * FROM `players` WHERE `job` LIKE '%" .. jobname .. "%'", {})
if players[1] ~= nil then
for _, value in pairs(players) do
local Target = QBCore.Functions.GetPlayerByCitizenId(value.citizenid) or QBCore.Functions.GetOfflinePlayerByCitizenId(value.citizenid)
if Target and Target.PlayerData.job.name == jobname then
local isOnline = Target.PlayerData.source
employees[#employees + 1] = {
empSource = Target.PlayerData.citizenid,
grade = Target.PlayerData.job.grade,
isboss = Target.PlayerData.job.isboss,
name = (isOnline and '🟢 ' or '') .. Target.PlayerData.charinfo.firstname .. ' ' .. Target.PlayerData.charinfo.lastname
}
end
end
table.sort(employees, function(a, b)
return a.grade.level > b.grade.level
end)
end
cb(employees)
end)
RegisterNetEvent('qb-bossmenu:server:stash', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local playerJob = Player.PlayerData.job
if not playerJob.isboss then return end
local playerPed = GetPlayerPed(src)
local playerCoords = GetEntityCoords(playerPed)
if not Config.BossMenus[playerJob.name] then return end
local bossCoords = Config.BossMenus[playerJob.name]
for i = 1, #bossCoords do
local coords = bossCoords[i]
if #(playerCoords - coords) < 2.5 then
local stashName = 'boss_' .. playerJob.name
exports['qb-inventory']:OpenInventory(src, stashName, {
maxweight = 4000000,
slots = 25,
})
return
end
end
end)
-- Grade Change
RegisterNetEvent('qb-bossmenu:server:GradeUpdate', function(data)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local Employee = QBCore.Functions.GetPlayerByCitizenId(data.cid) or QBCore.Functions.GetOfflinePlayerByCitizenId(data.cid)
if not Player.PlayerData.job.isboss then
ExploitBan(src, 'GradeUpdate Exploiting')
return
end
if data.grade > Player.PlayerData.job.grade.level then
TriggerClientEvent('QBCore:Notify', src, 'You cannot promote to this rank!', 'error')
return
end
if Employee then
if Employee.Functions.SetJob(Player.PlayerData.job.name, data.grade) then
TriggerClientEvent('QBCore:Notify', src, 'Sucessfully promoted!', 'success')
Employee.Functions.Save()
if Employee.PlayerData.source then -- Player is online
TriggerClientEvent('QBCore:Notify', Employee.PlayerData.source, 'You have been promoted to ' .. data.gradename .. '.', 'success')
end
else
TriggerClientEvent('QBCore:Notify', src, 'Promotion grade does not exist.', 'error')
end
end
TriggerClientEvent('qb-bossmenu:client:OpenMenu', src)
end)
-- Fire Employee
RegisterNetEvent('qb-bossmenu:server:FireEmployee', function(target)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local Employee = QBCore.Functions.GetPlayerByCitizenId(target) or QBCore.Functions.GetOfflinePlayerByCitizenId(target)
if not Player.PlayerData.job.isboss then
ExploitBan(src, 'FireEmployee Exploiting')
return
end
if Employee then
if target == Player.PlayerData.citizenid then
TriggerClientEvent('QBCore:Notify', src, 'You can\'t fire yourself', 'error')
return
elseif Employee.PlayerData.job.grade.level > Player.PlayerData.job.grade.level then
TriggerClientEvent('QBCore:Notify', src, 'You cannot fire this citizen!', 'error')
return
end
if Employee.Functions.SetJob('unemployed', '0') then
Employee.Functions.Save()
TriggerClientEvent('QBCore:Notify', src, 'Employee fired!', 'success')
TriggerEvent('qb-log:server:CreateLog', 'bossmenu', 'Job Fire', 'red', Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname .. ' successfully fired ' .. Employee.PlayerData.charinfo.firstname .. ' ' .. Employee.PlayerData.charinfo.lastname .. ' (' .. Player.PlayerData.job.name .. ')', false)
if Employee.PlayerData.source then -- Player is online
TriggerClientEvent('QBCore:Notify', Employee.PlayerData.source, 'You have been fired! Good luck.', 'error')
end
else
TriggerClientEvent('QBCore:Notify', src, 'Error..', 'error')
end
end
TriggerClientEvent('qb-bossmenu:client:OpenMenu', src)
end)
-- Recruit Player
RegisterNetEvent('qb-bossmenu:server:HireEmployee', function(recruit)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local Target = QBCore.Functions.GetPlayer(recruit)
if not Player.PlayerData.job.isboss then
ExploitBan(src, 'HireEmployee Exploiting')
return
end
if Target and Target.Functions.SetJob(Player.PlayerData.job.name, 0) then
TriggerClientEvent('QBCore:Notify', src, 'You hired ' .. (Target.PlayerData.charinfo.firstname .. ' ' .. Target.PlayerData.charinfo.lastname) .. ' come ' .. Player.PlayerData.job.label .. '', 'success')
TriggerClientEvent('QBCore:Notify', Target.PlayerData.source, 'You were hired as ' .. Player.PlayerData.job.label .. '', 'success')
TriggerEvent('qb-log:server:CreateLog', 'bossmenu', 'Recruit', 'lightgreen', (Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname) .. ' successfully recruited ' .. (Target.PlayerData.charinfo.firstname .. ' ' .. Target.PlayerData.charinfo.lastname) .. ' (' .. Player.PlayerData.job.name .. ')', false)
end
TriggerClientEvent('qb-bossmenu:client:OpenMenu', src)
end)
-- Get closest player sv
QBCore.Functions.CreateCallback('qb-bossmenu:getplayers', function(source, cb)
local src = source
local players = {}
local PlayerPed = GetPlayerPed(src)
local pCoords = GetEntityCoords(PlayerPed)
for _, v in pairs(QBCore.Functions.GetPlayers()) do
local targetped = GetPlayerPed(v)
local tCoords = GetEntityCoords(targetped)
local dist = #(pCoords - tCoords)
if PlayerPed ~= targetped and dist < 10 then
local ped = QBCore.Functions.GetPlayer(v)
players[#players + 1] = {
id = v,
coords = GetEntityCoords(targetped),
name = ped.PlayerData.charinfo.firstname .. ' ' .. ped.PlayerData.charinfo.lastname,
citizenid = ped.PlayerData.citizenid,
sources = GetPlayerPed(ped.PlayerData.source),
sourceplayer = ped.PlayerData.source
}
end
end
table.sort(players, function(a, b)
return a.name < b.name
end)
cb(players)
end)