Files
red-valley/resources/[framework]/[addons]/qb-management/client/cl_gang.lua
2026-03-29 21:41:17 +03:00

390 lines
13 KiB
Lua

local QBCore = exports['qb-core']:GetCoreObject()
local PlayerGang = QBCore.Functions.GetPlayerData().gang
local shownGangMenu = false
local DynamicMenuItems = {}
-- UTIL
local function CloseMenuFullGang()
exports['qb-menu']:closeMenu()
exports['qb-core']:HideText()
shownGangMenu = false
end
local function comma_valueGang(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
--//Events
AddEventHandler('onResourceStart', function(resource)--if you restart the resource
if resource == GetCurrentResourceName() then
Wait(200)
PlayerGang = QBCore.Functions.GetPlayerData().gang
end
end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
PlayerGang = QBCore.Functions.GetPlayerData().gang
end)
RegisterNetEvent('QBCore:Client:OnGangUpdate', function(InfoGang)
PlayerGang = InfoGang
end)
RegisterNetEvent('qb-gangmenu:client:Stash', function()
TriggerServerEvent("inventory:server:OpenInventory", "stash", "boss_" .. PlayerGang.name, {
maxweight = 4000000,
slots = 100,
})
TriggerEvent("inventory:client:SetCurrentStash", "boss_" .. PlayerGang.name)
end)
RegisterNetEvent('qb-gangmenu:client:Warbobe', function()
TriggerEvent('qb-clothing:client:openOutfitMenu')
end)
local function AddGangMenuItem(data, id)
local menuID = id or (#DynamicMenuItems + 1)
DynamicMenuItems[menuID] = deepcopy(data)
return menuID
end
exports("AddGangMenuItem", AddGangMenuItem)
local function RemoveGangMenuItem(id)
DynamicMenuItems[id] = nil
end
exports("RemoveGangMenuItem", RemoveGangMenuItem)
RegisterNetEvent('qb-gangmenu:client:OpenMenu', function()
shownGangMenu = true
local gangMenu = {
{
header = Lang:t("headersgang.bsm").. string.upper(PlayerGang.label),
icon = "fa-solid fa-circle-info",
isMenuHeader = true,
},
{
header = Lang:t("bodygang.manage"),
txt = Lang:t("bodygang.managed"),
icon = "fa-solid fa-list",
params = {
event = "qb-gangmenu:client:ManageGang",
}
},
{
header = Lang:t("bodygang.hire"),
txt = Lang:t("bodygang.hired"),
icon = "fa-solid fa-hand-holding",
params = {
event = "qb-gangmenu:client:HireMembers",
}
},
{
header = Lang:t("bodygang.storage"),
txt = Lang:t("bodygang.storaged"),
icon = "fa-solid fa-box-open",
params = {
event = "qb-gangmenu:client:Stash",
}
},
{
header = Lang:t("bodygang.outfits"),
txt = Lang:t("bodygang.outfitsd"),
icon = "fa-solid fa-shirt",
params = {
event = "qb-gangmenu:client:Warbobe",
}
},
{
header = Lang:t("bodygang.money"),
txt = Lang:t("bodygang.moneyd"),
icon = "fa-solid fa-sack-dollar",
params = {
event = "qb-gangmenu:client:SocietyMenu",
}
},
}
for _, v in pairs(DynamicMenuItems) do
gangMenu[#gangMenu + 1] = v
end
gangMenu[#gangMenu + 1] = {
header = Lang:t("bodygang.exit"),
icon = "fa-solid fa-angle-left",
params = {
event = "qb-menu:closeMenu",
}
}
exports['qb-menu']:openMenu(gangMenu)
end)
RegisterNetEvent('qb-gangmenu:client:ManageGang', function()
local GangMembersMenu = {
{
header = Lang:t("bodygang.mempl").. string.upper(PlayerGang.label),
icon = "fa-solid fa-circle-info",
isMenuHeader = true,
},
}
QBCore.Functions.TriggerCallback('qb-gangmenu:server:GetEmployees', function(cb)
for _, v in pairs(cb) do
GangMembersMenu[#GangMembersMenu + 1] = {
header = v.name,
txt = v.grade.name,
icon = "fa-solid fa-circle-user",
params = {
event = "qb-gangmenu:lient:ManageMember",
args = {
player = v,
work = PlayerGang
}
}
}
end
GangMembersMenu[#GangMembersMenu + 1] = {
header = Lang:t("bodygang.return"),
icon = "fa-solid fa-angle-left",
params = {
event = "qb-gangmenu:client:OpenMenu",
}
}
exports['qb-menu']:openMenu(GangMembersMenu)
end, PlayerGang.name)
end)
RegisterNetEvent('qb-gangmenu:lient:ManageMember', function(data)
local MemberMenu = {
{
header = Lang:t("bodygang.mngpl").. data.player.name .. " - " .. string.upper(PlayerGang.label),
isMenuHeader = true,
icon = "fa-solid fa-circle-info",
},
}
for k, v in pairs(QBCore.Shared.Gangs[data.work.name].grades) do
MemberMenu[#MemberMenu + 1] = {
header = v.name,
txt = Lang:t("bodygang.grade") .. k,
params = {
isServer = true,
event = "qb-gangmenu:server:GradeUpdate",
icon = "fa-solid fa-file-pen",
args = {
cid = data.player.empSource,
grade = tonumber(k),
gradename = v.name
}
}
}
end
MemberMenu[#MemberMenu + 1] = {
header = Lang:t("bodygang.fireemp"),
icon = "fa-solid fa-user-large-slash",
params = {
isServer = true,
event = "qb-gangmenu:server:FireMember",
args = data.player.empSource
}
}
MemberMenu[#MemberMenu + 1] = {
header = Lang:t("bodygang.return"),
icon = "fa-solid fa-angle-left",
params = {
event = "qb-gangmenu:client:ManageGang",
}
}
exports['qb-menu']:openMenu(MemberMenu)
end)
RegisterNetEvent('qb-gangmenu:client:HireMembers', function()
local HireMembersMenu = {
{
header = Lang:t("bodygang.hireemp") .. string.upper(PlayerGang.label),
isMenuHeader = true,
icon = "fa-solid fa-circle-info",
},
}
QBCore.Functions.TriggerCallback('qb-gangmenu:getplayers', function(players)
for _, v in pairs(players) do
if v and v ~= PlayerId() then
HireMembersMenu[#HireMembersMenu + 1] = {
header = v.name,
txt = Lang:t("bodygang.cid") .. v.citizenid .. " - ID: " .. v.sourceplayer,
icon = "fa-solid fa-user-check",
params = {
isServer = true,
event = "qb-gangmenu:server:HireMember",
args = v.sourceplayer
}
}
end
end
HireMembersMenu[#HireMembersMenu + 1] = {
header = Lang:t("bodygang.return"),
icon = "fa-solid fa-angle-left",
params = {
event = "qb-gangmenu:client:OpenMenu",
}
}
exports['qb-menu']:openMenu(HireMembersMenu)
end)
end)
RegisterNetEvent('qb-gangmenu:client:SocietyMenu', function()
QBCore.Functions.TriggerCallback('qb-gangmenu:server:GetAccount', function(cb)
local SocietyMenu = {
{
header = Lang:t("bodygang.balance").. comma_valueGang(cb) .. " - " .. string.upper(PlayerGang.label),
isMenuHeader = true,
icon = "fa-solid fa-circle-info",
},
{
header = Lang:t("bodygang.deposit"),
icon = "fa-solid fa-money-bill-transfer",
txt = Lang:t("bodygang.depositd"),
params = {
event = "qb-gangmenu:client:SocietyDeposit",
args = comma_valueGang(cb)
}
},
{
header = Lang:t("bodygang.withdraw"),
icon = "fa-solid fa-money-bill-transfer",
txt = Lang:t("bodygang.withdrawd"),
params = {
event = "qb-gangmenu:client:SocietyWithdraw",
args = comma_valueGang(cb)
}
},
{
header = Lang:t("bodygang.return"),
icon = "fa-solid fa-angle-left",
params = {
event = "qb-gangmenu:client:OpenMenu",
}
},
}
exports['qb-menu']:openMenu(SocietyMenu)
end, PlayerGang.name)
end)
RegisterNetEvent('qb-gangmenu:client:SocietyDeposit', function(saldoattuale)
local deposit = exports['qb-input']:ShowInput({
header = Lang:t("bodygang.depositm").. saldoattuale,
submitText = Lang:t("bodygang.submit"),
inputs = {
{
type = 'number',
isRequired = true,
name = 'amount',
text = Lang:t("bodygang.amount")
}
}
})
if deposit then
if not deposit.amount then return end
TriggerServerEvent("qb-gangmenu:server:depositMoney", tonumber(deposit.amount))
end
end)
RegisterNetEvent('qb-gangmenu:client:SocietyWithdraw', function(saldoattuale)
local withdraw = exports['qb-input']:ShowInput({
header = Lang:t("bodygang.withdrawm").. saldoattuale,
submitText = Lang:t("bodygang.submit"),
inputs = {
{
type = 'number',
isRequired = true,
name = 'amount',
text = Lang:t("bodygang.amount")
}
}
})
if withdraw then
if not withdraw.amount then return end
TriggerServerEvent("qb-gangmenu:server:withdrawMoney", tonumber(withdraw.amount))
end
end)
-- MAIN THREAD
CreateThread(function()
if Config.UseTarget then
for gang, zones in pairs(Config.GangMenuZones) do
for index, data in ipairs(zones) do
exports['qb-target']:AddBoxZone(gang.."-GangMenu"..index, data.coords, data.length, data.width, {
name = gang.."-GangMenu"..index,
heading = data.heading,
-- debugPoly = true,
minZ = data.minZ,
maxZ = data.maxZ,
}, {
options = {
{
type = "client",
event = "qb-gangmenu:client:OpenMenu",
icon = "fas fa-sign-in-alt",
label = Lang:t("targetgang.label"),
canInteract = function() return gang == PlayerGang.name and PlayerGang.isboss end,
},
},
distance = 2.5
})
end
end
else
while true do
local wait = 2500
local pos = GetEntityCoords(PlayerPedId())
local inRangeGang = false
local nearGangmenu = false
if PlayerGang then
wait = 0
for k, menus in pairs(Config.GangMenus) do
for _, coords in ipairs(menus) do
if k == PlayerGang.name and PlayerGang.isboss then
if #(pos - coords) < 5.0 then
inRangeGang = true
if #(pos - coords) <= 1.5 then
nearGangmenu = true
if not shownGangMenu then
exports['qb-core']:DrawText(Lang:t("drawtextgang.label"), 'left')
end
if IsControlJustReleased(0, 38) then
exports['qb-core']:HideText()
TriggerEvent("qb-gangmenu:client:OpenMenu")
end
end
if not nearGangmenu and shownGangMenu then
CloseMenuFullGang()
shownGangMenu = false
end
end
end
end
end
if not inRangeGang then
Wait(1500)
if shownGangMenu then
CloseMenuFullGang()
shownGangMenu = false
end
end
end
Wait(wait)
end
end
end)