390 lines
13 KiB
Lua
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)
|