2026-04-14 17:41:39 +02:00

535 lines
17 KiB
Lua

Core = nil
job = ''
job_grade_level = 0
job_grade_name = ''
local ranks = {}
local employees = {}
local logs = {}
local bossInventory = {}
bossMenuOpen = false
function UpdateLogs()
local data = TriggerCallback('codem-mechanic:GetLogs')
logs = data
NuiMessage('UPDATE_LOGS', data)
end
RegisterNetEvent("codem-mechanic:UpdateLogs")
AddEventHandler("codem-mechanic:UpdateLogs", UpdateLogs)
RegisterNetEvent("codem-mechanic:NewLog")
AddEventHandler("codem-mechanic:NewLog", function(data)
table.insert(logs, data)
NuiMessage('UPDATE_LOGS', logs)
end)
-- RegisterNetEvent("codem-inventory:SetClientInventory")
-- AddEventHandler("codem-inventory:SetClientInventory", function()
-- if bossMenuOpen then
-- local inventory = TriggerCallback('codem-mechanic:GetPlayerInventory')
-- NuiMessage('SetInventory', inventory)
-- end
-- end)
-- RegisterNetEvent("esx:addInventoryItem")
-- AddEventHandler("esx:addInventoryItem", function()
-- if bossMenuOpen then
-- local inventory = TriggerCallback('codem-mechanic:GetPlayerInventory')
-- NuiMessage('SetInventory', inventory)
-- end
-- end)
function SetMyRank()
local myRankData = false
for _, v in pairs(ranks) do
if tonumber(v.grade) == tonumber(job_grade_level) then
myRankData = v
end
end
if myRankData then
NuiMessage('SET_MY_RANK', myRankData)
end
end
function CheckPermission(name)
if not ranks or next(ranks) == nil then
local _ranks = TriggerCallback('codem-mechanic:GetJobRanks')
ranks = _ranks
end
local myRankData = false
for _, v in pairs(ranks) do
if tonumber(v.grade) == tonumber(job_grade_level) then
myRankData = v
end
end
if myRankData and (myRankData.permissions[name] or myRankData.isBoss) then
return true
end
return false
end
RegisterNUICallback("WithdrawMoney", function(data, cb)
local amount = data.amount
TriggerServerEvent("codem-mechanic:WithdrawMoney", amount)
cb("ok")
end)
RegisterNUICallback("DepositMoney", function(data, cb)
local amount = data.amount
TriggerServerEvent("codem-mechanic:DepositMoney", amount)
cb("ok")
end)
RegisterNetEvent("codem-mechanic:RefreshBossMoney")
AddEventHandler("codem-mechanic:RefreshBossMoney", function()
local mechanic = Config.MechanicSettings[job]
if mechanic then
if Config.ModifyWithYourCash then
local playerMoney = TriggerCallback('codem-mechanic:getPlayerAccount')
TriggerEvent("codem-mechanic:RefreshMechanicVault", playerMoney)
NuiMessage('SET_BOSS_MONEY', playerMoney)
return
end
local money = TriggerCallback('codem-mechanic:GetBossMoney')
NuiMessage('SET_BOSS_MONEY', money)
TriggerEvent("codem-mechanic:RefreshMechanicVault", money)
end
if (openMenuDrawText and Config.MechanicMode == 'no_job') or (openMenuDrawText and CheckCanUseMechanic(getNearestMechanic()) ) then
Wait(1000)
local mechanic = Config.MechanicSettings[job]
if mechanic then
if Config.ModifyWithYourCash then
local playerMoney = TriggerCallback('codem-mechanic:getPlayerAccount')
TriggerEvent("codem-mechanic:RefreshMechanicVault", playerMoney)
NuiMessage('SET_BOSS_MONEY', playerMoney)
return
end
local money = TriggerCallback('codem-mechanic:GetBossMoney')
NuiMessage('SET_BOSS_MONEY', money)
TriggerEvent("codem-mechanic:RefreshMechanicVault", money)
else
local profileAccount = TriggerCallback('codem-mechanic:getAccount')
TriggerEvent("codem-mechanic:RefreshMechanicVault", profileAccount.cash)
end
end
end)
RegisterNetEvent("codem-mechanic:UpdateInv")
AddEventHandler("codem-mechanic:UpdateInv", function(inventory)
if bossMenuOpen then
NuiMessage('SetInventory', FormatItems(inventory))
end
end)
function FormatItems(items)
local data = {}
for _, v in pairs(items) do
local amount = v.count or v.amount
local formattedData = v
formattedData.name = v.name
formattedData.label = v.label
formattedData.amount = amount
formattedData.metadata = v.metadata or v.info
table.insert(data, formattedData)
end
return data
end
RegisterNetEvent("esx:playerLoaded")
AddEventHandler("esx:playerLoaded", function()
Wait(1000)
SetPlayerJob()
end)
RegisterNetEvent("QBCore:Client:OnPlayerLoaded")
AddEventHandler("QBCore:Client:OnPlayerLoaded", function()
Wait(1000)
SetPlayerJob()
end)
-- RegisterNetEvent("QBCore:Player:SetPlayerData")
-- AddEventHandler("QBCore:Player:SetPlayerData", function(PlayerData)
-- if bossMenuOpen then
-- NuiMessage('SetInventory', FormatItems(PlayerData.items))
-- end
-- end)
-- RegisterNetEvent("esx:removeInventoryItem")
-- AddEventHandler("esx:removeInventoryItem", function()
-- if bossMenuOpen then
-- local inventory = TriggerCallback('codem-mechanic:GetPlayerInventory')
-- NuiMessage('SetInventory', inventory)
-- end
-- end)
RegisterNetEvent("codem-mechanic:BossInventoryItemAdded")
AddEventHandler("codem-mechanic:BossInventoryItemAdded", function(data)
table.insert(bossInventory, data)
NuiMessage("UPDATE_BOSS_INVENTORY", bossInventory)
end)
RegisterNetEvent("codem-mechanic:BossInventoryItemRemoved")
AddEventHandler("codem-mechanic:BossInventoryItemRemoved", function(data)
local item, index = GetBossItemByName(data.name, data.metadata)
if item then
table.remove(bossInventory, index)
NuiMessage("UPDATE_BOSS_INVENTORY", bossInventory)
end
end)
function TableComp(a,b) --algorithm is O(n log n), due to table growth.
if #a ~= #b then return false end -- early out
local t1,t2 = {}, {} -- temp tables
for k,v in pairs(a) do -- copy all values into keys for constant time lookups
t1[k] = (t1[k] or 0) + 1 -- make sure we track how many times we see each value.
end
for k,v in pairs(b) do
t2[k] = (t2[k] or 0) + 1
end
for k,v in pairs(t1) do -- go over every element
if v ~= t2[k] then return false end -- if the number of times that element was seen don't match...
end
return true
end
function GetBossItemByName(itemName, metadata)
for _, v in pairs(bossInventory) do
if metadata and v.metadata then
if v.name == itemName and TableComp(v.metadata,metadata) then
return v, _
end
else
if v.name == itemName then
return v, _
end
end
end
return false
end
RegisterNetEvent("codem-mechanic:BossInventoryItemUpdated")
AddEventHandler("codem-mechanic:BossInventoryItemUpdated", function(data)
local item, index = GetBossItemByName(data.name)
if item then
bossInventory[index] = data
NuiMessage("UPDATE_BOSS_INVENTORY", bossInventory)
end
end)
RegisterNetEvent("codem-mechanic:NewEmployee")
AddEventHandler("codem-mechanic:NewEmployee", function(data)
table.insert(employees, data)
NuiMessage("SET_EMPLOYEES", employees)
UpdateRanks()
end)
RegisterNetEvent("codem-mechanic:UpdateEmployee")
AddEventHandler("codem-mechanic:UpdateEmployee", function(identifier, data)
for _, v in pairs(employees) do
if v.identifier == identifier then
employees[_] = data
end
end
NuiMessage("SET_EMPLOYEES", employees)
UpdateRanks()
end)
RegisterNUICallback("HireNewPlayer", function(data, cb)
local id = data.id
TriggerServerEvent("codem-mechanic:HireNewPlayer", id)
end)
RegisterNUICallback("PromotePlayer", function(data, cb)
local identifier = data.identifier
TriggerServerEvent("codem-mechanic:PromotePlayer", identifier)
end)
RegisterNUICallback("DemotePlayer", function(data, cb)
local identifier = data.identifier
TriggerServerEvent("codem-mechanic:DemotePlayer", identifier)
end)
RegisterNUICallback("FirePlayer", function(data, cb)
local identifier = data.identifier
TriggerServerEvent("codem-mechanic:FirePlayer", identifier)
end)
RegisterNetEvent("codem-mechanic:RemoveEmployee")
AddEventHandler("codem-mechanic:RemoveEmployee", function(identifier)
for _, v in pairs(employees) do
if v.identifier == identifier then
table.remove(employees, _)
end
end
NuiMessage("SET_EMPLOYEES", employees)
UpdateRanks()
end)
function UpdateRanks()
local mechanic = Config.MechanicSettings[job]
if mechanic then
local _ranks = TriggerCallback('codem-mechanic:GetJobRanks')
ranks = _ranks
NuiMessage("SET_RANKS", ranks)
SetMyRank()
end
end
function UpdateEmployees()
local mechanic = Config.MechanicSettings[job]
if mechanic then
local _employees = TriggerCallback('codem-mechanic:GetEmployees')
employees = _employees
NuiMessage("SET_EMPLOYEES", employees)
end
end
function UpdateBossInventory()
local mechanic = Config.MechanicSettings[job]
if mechanic then
local inventory = TriggerCallback('codem-mechanic:GetBossInventory', job)
bossInventory = inventory
NuiMessage("UPDATE_BOSS_INVENTORY", bossInventory)
end
end
function TriggerCallback(name, data)
local incomingData = false
local status = 'UNKOWN'
local counter = 0
while Core == nil do
Wait(0)
end
if Config.Framework == 'esx' then
Core.TriggerServerCallback(name, function(payload)
status = 'SUCCESS'
incomingData = payload
end, data)
else
Core.Functions.TriggerCallback(name, function(payload)
status = 'SUCCESS'
incomingData = payload
end, data)
end
CreateThread(function()
while incomingData == 'UNKOWN' do
Wait(1000)
if counter == 4 then
status = 'FAILED'
incomingData = false
break
end
counter = counter + 1
end
end)
while status == 'UNKOWN' do
Wait(0)
end
return incomingData
end
function WaitPlayer()
if Config.Framework == "esx" or Config.Framework == 'oldesx' then
while Core == nil do
Wait(0)
end
while Core.GetPlayerData() == nil do
Wait(0)
end
while Core.GetPlayerData().job == nil do
Wait(0)
end
else
while Core == nil do
Wait(0)
end
while Core.Functions.GetPlayerData() == nil do
Wait(0)
end
while Core.Functions.GetPlayerData().metadata == nil do
Wait(0)
end
end
end
CreateThread(function()
Core, Config.Framework = GetCore()
SetPlayerJob()
for k, v in pairs(Config.MechanicSettings) do
if v.blipSettings.showBlip then
local blip = AddBlipForCoord(v.blipSettings.coords)
SetBlipSprite(blip, v.blipSettings.sprite)
SetBlipScale(blip, v.blipSettings.scale)
SetBlipColour(blip, v.blipSettings.color)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName('STRING')
AddTextComponentString(v.blipSettings.label)
EndTextCommandSetBlipName(blip)
end
end
end)
RegisterNetEvent("esx:setJob")
AddEventHandler("esx:setJob", function(job)
Wait(1000)
SetPlayerJob()
end)
RegisterNetEvent("QBCore:Client:OnJobUpdate")
AddEventHandler("QBCore:Client:OnJobUpdate", function(data)
Wait(1000)
SetPlayerJob()
end)
function SetPlayerJob()
Wait(500)
while not nuiLoaded do
Wait(50)
end
WaitPlayer()
CheckJob()
if Config.Framework == 'esx' or Config.Framework == 'oldesx' then
local PlayerData = Core.GetPlayerData()
job = PlayerData.job.name
job_grade_level = PlayerData.job.grade
job_grade_name = PlayerData.job.grade_label
else
local PlayerData = Core.Functions.GetPlayerData()
job = PlayerData["job"].name
job_grade_level = PlayerData["job"].grade.level
job_grade_name = PlayerData["job"].grade.name
end
local mechanic = Config.MechanicSettings[job]
if mechanic then
TriggerServerEvent("codem-mechanic:CreateMechanicData")
if Config.MechanicMode ~= 'no_job' then
if Config.InteractionHandler == 'ox-target' then
for _, v in pairs(mechanic.bossMenuCoords) do
TriggerEvent("codem-mechanic:AddZone", v, 'mechanic-boss', {
{
name = 'mechanic-boss',
event = 'codem-mechanic:OpenBossMenu',
icon = 'fa-solid fa-bars-progress',
label = Config.Locales.OPEN_BOSS_MENU,
}
})
end
for _, v in pairs(mechanic.mechanicMenuCoords) do
TriggerEvent("codem-mechanic:AddZone", v, 'mechanic-tuning-menu', {
{
name = 'mechanic-boss',
event = 'codem-mechanic:OpenMechanicMenu',
icon = 'fas fa-gears',
label = Config.Locales.OPEN_MECHANIC_MENU,
}
})
end
end
if Config.InteractionHandler == 'qb-target' then
for _, v in pairs(mechanic.bossMenuCoords) do
TriggerEvent("codem-mechanic:AddZone", v, mechanic)
end
for _, v in pairs(mechanic.mechanicMenuCoords) do
TriggerEvent("codem-mechanic:AddZoneMechanic", v, mechanic)
end
end
end
Wait(1000)
UpdateBossInventory()
UpdateEmployees()
UpdateRanks()
SetMyRank()
UpdateLogs()
TriggerEvent("codem-mechanic:RefreshBossMoney")
else
if Config.InteractionHandler == 'ox-target' then
TriggerEvent("codem-mechanic:RemoveZone", 'mechanic-boss')
TriggerEvent("codem-mechanic:RemoveZone", 'mechanic-tuning-menu')
end
if Config.InteractionHandler == 'qb-target' then
TriggerEvent("codem-mechanic:RemoveZone")
TriggerEvent("codem-mechanic:RemoveZone")
end
end
end
RegisterNUICallback("ChangePermission", function(data, cb)
local rankLevel = data.rankLevel
local permissionName = data.permissionName
local allow = data.allow
TriggerServerEvent("codem-mechanic:ChangePermission", rankLevel, permissionName, allow)
end)
RegisterNetEvent("codem-mechanic:UpdateRanks")
AddEventHandler("codem-mechanic:UpdateRanks", function()
UpdateRanks()
end)
function CheckJob()
WaitPlayer()
local currentJob
local currentJobGradeLevel
local currentJobGradeLabel
if Config.Framework == 'esx' or Config.Framework == 'oldesx' then
local PlayerData = Core.GetPlayerData()
currentJob = PlayerData.job.name
currentJobGradeLevel = PlayerData.job.grade
currentJobGradeLabel = PlayerData.job.grade_label
else
local PlayerData = Core.Functions.GetPlayerData()
currentJob = PlayerData["job"].name
currentJobGradeLevel = PlayerData["job"].grade.level
currentJobGradeLabel = PlayerData["job"].grade.name
end
local lastJob = job
local lastJobGradeLevel = job_grade_level
local _mechanic = Config.MechanicSettings[lastJob]
local mechanic = Config.MechanicSettings[currentJob]
if lastJob ~= currentJob and _mechanic then
TriggerServerEvent("codem-mechanic:RemoveEmployee", {
name = lastJob,
})
end
if mechanic then
TriggerServerEvent("codem-mechanic:AddEmployee", {
name = currentJob,
grade_level = currentJobGradeLevel,
grade_name = currentJobGradeLabel,
})
Wait(500)
TriggerServerEvent("codem-mechanic:UpdateEmployee", {
name = currentJob,
}, "online", true)
end
if lastJob == currentJob and lastJobGradeLevel ~= currentJobGradeLevel and mechanic then
TriggerServerEvent("codem-mechanic:UpdateEmployee", {
name = currentJob,
}, "grade_level", currentJobGradeLevel)
TriggerServerEvent("codem-mechanic:UpdateEmployee", {
name = currentJob,
}, "grade_name", currentJobGradeLabel)
end
end
RegisterNUICallback("DragItem", function(data, cb)
TriggerServerEvent("codem-mechanic:DragItem", data)
cb("ok")
end)