1035 lines
39 KiB
Lua
1035 lines
39 KiB
Lua
|
local QBCore = exports['qb-core']:GetCoreObject()
|
||
|
|
||
|
--devices
|
||
|
-- ===========================================
|
||
|
-- Spawn / object Control
|
||
|
-- ===========================================
|
||
|
AddEventHandler('onResourceStart', function(resourceName)
|
||
|
if (GetCurrentResourceName() ~= resourceName) then
|
||
|
return
|
||
|
end
|
||
|
GlobalScirptData:wipeALL()
|
||
|
Sync_with_database()
|
||
|
end)
|
||
|
-- ==========================================
|
||
|
-- Update / server Side
|
||
|
-- ==========================================
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:pump_fueloil', function(source, cb, data)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
if player == nil then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Spiller ikke fundet!")
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
SendOilFuelToStorage(player, source, cb)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:PumpOilToStorageCallback', function(source, cb, data)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
if player == nil then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Spiller ikke fundet!")
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
local oilrig, id = GlobalScirptData:getByHash(data)
|
||
|
if not oilrig then
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
local is_employee, is_owner = oilrig.is_employee(player.PlayerData.citizenid)
|
||
|
if not is_employee and not is_owner then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Du har ikke adgang til denne del!")
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
if oilrig.metadata.oil_storage <= 0 then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Lager er tomt!")
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
SendOilToStorage(oilrig, source, cb)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:getStorageData', function(source, cb)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local storage = GlobalScirptData:getDeviceByCitizenId('oilrig_storage', citizenid)
|
||
|
if storage == false then
|
||
|
InitStorage({
|
||
|
citizenid = citizenid,
|
||
|
name = player.PlayerData.name .. "'s inventar",
|
||
|
}, cb)
|
||
|
return
|
||
|
end
|
||
|
cb(storage)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:Withdraw', function(source, cb, data)
|
||
|
if not data then cb(false) return end
|
||
|
if not data.amount then cb(false) return end
|
||
|
if not data.type then cb(false) return end
|
||
|
if type(data.amount) == "string" then data.amount = tonumber(data.amount) end
|
||
|
if data.amount <= 0 then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Værdi skal være større end 0!", 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if not data.truck then
|
||
|
local barrel_max_size = Oilwell_config.Settings.capacity.oilbarell.size
|
||
|
local stash_size = 5
|
||
|
|
||
|
if data.amount > (barrel_max_size * stash_size) then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Ingen plads i inventar!", 'error')
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Maksimum: " .. (barrel_max_size * stash_size) .. "/L",
|
||
|
'error')
|
||
|
return
|
||
|
end
|
||
|
else
|
||
|
if data.amount > 100000 then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Maksimum: 100.000/L",
|
||
|
'error')
|
||
|
return
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local storage = GlobalScirptData:getDeviceByCitizenId('oilrig_storage', citizenid)
|
||
|
|
||
|
if storage == false then
|
||
|
InitStorage({
|
||
|
citizenid = citizenid,
|
||
|
name = player.PlayerData.name .. "'s inventar",
|
||
|
})
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Kunne ikke tilgå inventar!", 'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local value = storage.metadata[data.type]
|
||
|
if value < data.amount then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Du kan ikke tage denne mængde!", 'error')
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Anmodet: " .. data.amount .. " Nuværrende: " .. value, 'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
storage.metadata[data.type] = storage.metadata[data.type] - data.amount
|
||
|
storage.metadata.queue[#storage.metadata.queue + 1] = {
|
||
|
truck = data.truck,
|
||
|
type = data.type,
|
||
|
gal = data.amount,
|
||
|
avg_gas_octane = storage.metadata.avg_gas_octane
|
||
|
}
|
||
|
|
||
|
if storage.metadata[data.type] < 1.0 then
|
||
|
-- remove waste
|
||
|
storage.metadata.avg_gas_octane = 87
|
||
|
storage.metadata[data.type] = 0
|
||
|
end
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Vi gennemførte din anmodning!", 'success')
|
||
|
cb(true)
|
||
|
end)
|
||
|
|
||
|
local function isWithdrawStashEmpty(Player)
|
||
|
local stash = 'Withdraw_' .. Player.PlayerData.citizenid
|
||
|
local result = MySQL.Sync.fetchScalar("SELECT items FROM stashitems WHERE stash= ?", { stash })
|
||
|
if result == nil then
|
||
|
-- need to init stash
|
||
|
return false, -1
|
||
|
end
|
||
|
result = json.decode(result)
|
||
|
local size = Tablelength(result)
|
||
|
if size >= 1 then
|
||
|
return false, size
|
||
|
else
|
||
|
return true, size
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function divide_barells(barrel)
|
||
|
local barrel_max_size = Oilwell_config.Settings.capacity.oilbarell.size
|
||
|
local divide = math.floor(barrel.gal / barrel_max_size)
|
||
|
local leftover = barrel.gal % barrel_max_size
|
||
|
|
||
|
local count = {
|
||
|
full_size = 0,
|
||
|
leftover = 0,
|
||
|
leftover_value = 0
|
||
|
}
|
||
|
for i = 1, divide + 1, 1 do
|
||
|
if i ~= (divide + 1) then
|
||
|
count.full_size = count.full_size + 1
|
||
|
else
|
||
|
if leftover ~= 0 then
|
||
|
count.leftover = count.leftover + 1
|
||
|
count.leftover_value = leftover
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return count
|
||
|
end
|
||
|
|
||
|
local function add_oilbarell_2(Player, divide_res, barrel_type, barrel_avg_gas_octane)
|
||
|
-- send barells to withdraw stash
|
||
|
local barrel_max_size = Oilwell_config.Settings.capacity.oilbarell.size
|
||
|
local items = {}
|
||
|
local stash = 'Withdraw_' .. Player.PlayerData.citizenid
|
||
|
local result = MySQL.Sync.fetchAll("SELECT items FROM stashitems WHERE stash=?", { stash })
|
||
|
local res = result[1]
|
||
|
if res == nil then return false end
|
||
|
if res.items == nil then return false end
|
||
|
res.items = json.decode(res.items)
|
||
|
if res.items == nil then return false end
|
||
|
local item_name = 'oilbarell'
|
||
|
local itemInfo = QBCore.Shared.Items[item_name:lower()]
|
||
|
|
||
|
if barrel_type ~= 'gasoline' then
|
||
|
barrel_avg_gas_octane = 0
|
||
|
end
|
||
|
|
||
|
for i = 1, divide_res.full_size, 1 do
|
||
|
items[#items + 1] = {
|
||
|
name = itemInfo["name"],
|
||
|
amount = 1,
|
||
|
label = itemInfo["label"],
|
||
|
description = itemInfo["description"] ~= nil and itemInfo["description"] or "",
|
||
|
weight = itemInfo["weight"], -- can not set weight
|
||
|
type = itemInfo["type"],
|
||
|
unique = itemInfo["unique"],
|
||
|
useable = itemInfo["useable"],
|
||
|
image = itemInfo["image"],
|
||
|
slot = #items + 1,
|
||
|
info = {
|
||
|
type = barrel_type,
|
||
|
gal = barrel_max_size,
|
||
|
avg_gas_octane = barrel_avg_gas_octane
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
for i = 1, divide_res.leftover, 1 do
|
||
|
items[#items + 1] = {
|
||
|
name = itemInfo["name"],
|
||
|
amount = 1,
|
||
|
label = itemInfo["label"],
|
||
|
description = itemInfo["description"] ~= nil and itemInfo["description"] or "",
|
||
|
weight = itemInfo["weight"], -- can not set weight
|
||
|
type = itemInfo["type"],
|
||
|
unique = itemInfo["unique"],
|
||
|
useable = itemInfo["useable"],
|
||
|
image = itemInfo["image"],
|
||
|
slot = #items + 1,
|
||
|
info = {
|
||
|
type = barrel_type,
|
||
|
gal = divide_res.leftover_value,
|
||
|
avg_gas_octane = barrel_avg_gas_octane
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
MySQL.Async.execute("UPDATE stashitems SET items = ? WHERE stash = ?", { json.encode(items), stash })
|
||
|
end
|
||
|
|
||
|
RegisterNetEvent('keep-oilwell:server:purgeWithdrawStash', function()
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
local stash = 'Withdraw_' .. Player.PlayerData.citizenid
|
||
|
MySQL.Async.execute("UPDATE stashitems SET items = '[]' WHERE stash = ?", { stash })
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Tømning fuldført!", 'success')
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:withdraw_from_queue', function(source, cb, Type)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local storage = GlobalScirptData:getDeviceByCitizenId('oilrig_storage', citizenid)
|
||
|
if storage == false then
|
||
|
InitStorage({
|
||
|
citizenid = citizenid,
|
||
|
name = player.PlayerData.name .. "'s inventar",
|
||
|
})
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Kunne ikke tilgå inventar!", 'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
if type(storage.metadata.queue) ~= "table" then
|
||
|
-- failsafe
|
||
|
storage.metadata.queue = {}
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
if type(storage.metadata.queue) == "table" and next(storage.metadata.queue) == nil then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Intet i kø!", 'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
for key, barrel in pairs(storage.metadata.queue) do
|
||
|
|
||
|
if barrel == nil then
|
||
|
goto here
|
||
|
end
|
||
|
|
||
|
if not (barrel.truck == Type) then
|
||
|
goto here
|
||
|
end
|
||
|
if not barrel.truck then
|
||
|
local stashEmpty, size = isWithdrawStashEmpty(player)
|
||
|
if not stashEmpty and not (size == -1) then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Inventar er ikke tomt!", 'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
elseif not stashEmpty and size == -1 then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Inventar skal være åbnet en enkelt gang!",
|
||
|
'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
local divide_res = divide_barells(barrel)
|
||
|
|
||
|
-- calcualte barell cost
|
||
|
local cost_of_1 = Oilwell_config.Settings.capacity.oilbarell.cost
|
||
|
local total_cost = cost_of_1 * (divide_res.full_size + divide_res.leftover)
|
||
|
|
||
|
local removemoeny = player.Functions.RemoveMoney('bank', total_cost, 'oil_barells')
|
||
|
if removemoeny then
|
||
|
add_oilbarell_2(player, divide_res, barrel.type, barrel.avg_gas_octane)
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Anmodning fuldført!", 'success')
|
||
|
cb({ truck = false })
|
||
|
storage.metadata.queue[key] = nil
|
||
|
return
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Ikke nok penge i banken!", 'error')
|
||
|
end
|
||
|
cb(storage)
|
||
|
return
|
||
|
elseif barrel.truck and barrel.truck == true then
|
||
|
local divide_res = divide_barells(barrel)
|
||
|
|
||
|
-- calcualte barell cost
|
||
|
local removemoeny = player.Functions.RemoveMoney('bank', 25000, 'oil_barells')
|
||
|
if removemoeny then
|
||
|
local items = Split_oilbarrel_size(divide_res, barrel.type, barrel.avg_gas_octane)
|
||
|
items.truck = true
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Anmodning fuldført!", 'success')
|
||
|
cb(items)
|
||
|
storage.metadata.queue[key] = nil
|
||
|
return
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Ikke nok penge i banken!", 'error')
|
||
|
end
|
||
|
cb(storage)
|
||
|
return
|
||
|
end
|
||
|
::here::
|
||
|
end
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Du har intet i kø her!", 'error')
|
||
|
cb(false)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateUseableItem('oilbarell', function(source, item)
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateUseableItem('oilwell', function(source, item)
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
local RemovedItem = Player.Functions.RemoveItem('oilwell', 1)
|
||
|
TriggerClientEvent('ps-inventory:client:ItemBox', source, QBCore.Shared.Items['oilwell'], "remove")
|
||
|
|
||
|
if item.amount >= 1 and RemovedItem == true then
|
||
|
TriggerClientEvent('keep-oilrig:client:spawn', source)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
function Split_oilbarrel_size(divide_res, barrel_type, barrel_avg_gas_octane)
|
||
|
local barrel_max_size = Oilwell_config.Settings.capacity.oilbarell.size
|
||
|
local item_name = 'oilbarell'
|
||
|
local itemInfo = QBCore.Shared.Items[item_name:lower()]
|
||
|
local items = {}
|
||
|
|
||
|
for i = 1, divide_res.full_size, 1 do
|
||
|
items[#items + 1] = {
|
||
|
name = itemInfo["name"],
|
||
|
amount = 1,
|
||
|
label = itemInfo["label"],
|
||
|
description = itemInfo["description"] ~= nil and itemInfo["description"] or "",
|
||
|
weight = itemInfo["weight"], -- can not set weight
|
||
|
type = itemInfo["type"],
|
||
|
unique = itemInfo["unique"],
|
||
|
useable = itemInfo["useable"],
|
||
|
image = itemInfo["image"],
|
||
|
slot = #items + 1,
|
||
|
info = {
|
||
|
type = barrel_type,
|
||
|
gal = barrel_max_size,
|
||
|
avg_gas_octane = barrel_avg_gas_octane
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
for i = 1, divide_res.leftover, 1 do
|
||
|
items[#items + 1] = {
|
||
|
name = itemInfo["name"],
|
||
|
amount = 1,
|
||
|
label = itemInfo["label"],
|
||
|
description = itemInfo["description"] ~= nil and itemInfo["description"] or "",
|
||
|
weight = itemInfo["weight"], -- can not set weight
|
||
|
type = itemInfo["type"],
|
||
|
unique = itemInfo["unique"],
|
||
|
useable = itemInfo["useable"],
|
||
|
image = itemInfo["image"],
|
||
|
slot = #items + 1,
|
||
|
info = {
|
||
|
type = barrel_type,
|
||
|
gal = divide_res.leftover_value,
|
||
|
avg_gas_octane = barrel_avg_gas_octane
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
return items
|
||
|
end
|
||
|
|
||
|
RegisterNetEvent('keep-oilrig:server:updateSpeed', function(inputData, id)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
if player == nil then return end
|
||
|
-- validate speed for 0 - 100
|
||
|
local oilrig = GlobalScirptData:read(id)
|
||
|
local is_employee, is_owner = oilrig.is_employee(player.PlayerData.citizenid)
|
||
|
if not is_employee and not is_owner then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Du har ikke adgang til denne oliebrønd!", 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local speed = tonumber(inputData.speed)
|
||
|
if not (0 <= speed and speed <= 100) then
|
||
|
TriggerClientEvent('QBCore:Notify', source, 'Hastighed skal være mellem 0-100', "error")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
oilrig.metadata.speed = speed
|
||
|
-- sync speed on other clients
|
||
|
TriggerClientEvent('keep-oilrig:client:syncSpeed', -1, id, speed)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:get_CDU_Data', function(source, cb)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local CDU = GlobalScirptData:getDeviceByCitizenId('oilrig_cdu', citizenid)
|
||
|
|
||
|
if CDU == false then
|
||
|
Init_CDU(citizenid, cb)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- callback must return CDU's object reason ==> reopen menu with new values
|
||
|
cb(CDU)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:set_CDU_temp', function(source, cb, inputData)
|
||
|
if type(inputData.temp) == "string" then
|
||
|
inputData.temp = tonumber(inputData.temp)
|
||
|
end
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local CDU = GlobalScirptData:getDeviceByCitizenId('oilrig_cdu', citizenid)
|
||
|
CDU.metadata.req_temp = inputData.temp
|
||
|
-- callback must return CDU's object reason ==> reopen menu with new values
|
||
|
cb(CDU)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:switchPower_of_CDU', function(source, cb)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local CDU = GlobalScirptData:getDeviceByCitizenId('oilrig_cdu', citizenid)
|
||
|
if CDU.metadata.state == false then
|
||
|
CDU.metadata.state = true
|
||
|
else
|
||
|
CDU.metadata.state = false
|
||
|
end
|
||
|
|
||
|
-- callback must return CDU's object reason ==> reopen menu with new values
|
||
|
cb(CDU)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:pumpCrudeOil_to_CDU', function(source, cb, inputData)
|
||
|
if type(inputData.amount) == "string" then
|
||
|
inputData.amount = tonumber(inputData.amount)
|
||
|
end
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local CDU = GlobalScirptData:getDeviceByCitizenId('oilrig_cdu', citizenid)
|
||
|
local storage = GlobalScirptData:getDeviceByCitizenId('oilrig_storage', citizenid)
|
||
|
|
||
|
if storage == false then
|
||
|
InitStorage({
|
||
|
citizenid = citizenid,
|
||
|
name = player.PlayerData.name .. "'s inventar",
|
||
|
})
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Kunne ikke tilgå inventar!", 'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if inputData.amount <= 0 then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Skal være mere end 0", 'error')
|
||
|
cb(CDU)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if storage.metadata.crudeOil == 0.0 then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Inventar tomt", 'error')
|
||
|
cb(CDU)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if storage.metadata.crudeOil >= inputData.amount then
|
||
|
storage.metadata.crudeOil = storage.metadata.crudeOil - inputData.amount
|
||
|
CDU.metadata.oil_storage = CDU.metadata.oil_storage + inputData.amount
|
||
|
end
|
||
|
-- callback must return CDU's object reason ==> reopen menu with new values
|
||
|
cb(CDU)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:ShowBlender', function(source, cb)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local blender = GlobalScirptData:getDeviceByCitizenId('oilrig_blender', citizenid)
|
||
|
if blender == false then
|
||
|
Init_Blender(citizenid, cb)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
cb(blender)
|
||
|
end)
|
||
|
|
||
|
local function inRange(x, min, max)
|
||
|
return (x >= min and x <= max)
|
||
|
end
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:toggle_blender', function(source, cb)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local blender = GlobalScirptData:getDeviceByCitizenId('oilrig_blender', citizenid)
|
||
|
if blender.metadata.state == false then
|
||
|
blender.metadata.state = true
|
||
|
else
|
||
|
blender.metadata.state = false
|
||
|
end
|
||
|
cb(blender)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:recipe_blender', function(source, cb, inputData)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local blender = GlobalScirptData:getDeviceByCitizenId('oilrig_blender', citizenid)
|
||
|
|
||
|
for _, value in pairs(inputData) do
|
||
|
local current_num = tonumber(value)
|
||
|
if not inRange(current_num, 0, 100) then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Skal være mellem 0-100", 'error')
|
||
|
return
|
||
|
end
|
||
|
inputData[_] = current_num
|
||
|
end
|
||
|
|
||
|
blender.metadata.recipe.heavy_naphtha = inputData.heavy_naphtha or blender.metadata.recipe.heavy_naphtha
|
||
|
blender.metadata.recipe.light_naphtha = inputData.light_naphtha or blender.metadata.recipe.light_naphtha
|
||
|
blender.metadata.recipe.other_gases = inputData.other_gases or blender.metadata.recipe.other_gases
|
||
|
|
||
|
--new elements
|
||
|
blender.metadata.recipe.diesel = inputData.diesel or blender.metadata.recipe.diesel
|
||
|
blender.metadata.recipe.kerosene = inputData.kerosene or blender.metadata.recipe.kerosene
|
||
|
|
||
|
cb(blender)
|
||
|
end)
|
||
|
|
||
|
local current_transport_stock = {
|
||
|
crudeOil = 0,
|
||
|
fuel_oil = 0,
|
||
|
gasoline = 0
|
||
|
}
|
||
|
local TRANSPORT = Oilwell_config.Transport
|
||
|
|
||
|
local function change_item_info(Player, slot, info)
|
||
|
if Player.PlayerData.items[slot] then
|
||
|
Player.PlayerData.items[slot].info = info
|
||
|
end
|
||
|
Player.Functions.SetInventory(Player.PlayerData.items, true)
|
||
|
end
|
||
|
|
||
|
local function reachedMaxStock(Type)
|
||
|
local max = TRANSPORT.max_stock
|
||
|
return (current_transport_stock[Type] >= max)
|
||
|
end
|
||
|
|
||
|
local function canWeAcceptMoreStock(Type, amount)
|
||
|
local max = TRANSPORT.max_stock
|
||
|
return not (current_transport_stock[Type] + amount >= max)
|
||
|
end
|
||
|
|
||
|
local function remove_item(source, Player, name, slot)
|
||
|
Player.Functions.RemoveItem(name, 1, slot)
|
||
|
TriggerClientEvent('ps-inventory:client:ItemBox', source, QBCore.Shared.Items[name], "remove")
|
||
|
end
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:oil_transport:fillTransportWell', function(source, cb, amount)
|
||
|
amount = tonumber(amount) -- just in case
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local oil_barrel = player.Functions.GetItemByName('oilbarell')
|
||
|
local msg_string = ""
|
||
|
|
||
|
if not oil_barrel then
|
||
|
TriggerClientEvent('QBCore:Notify', source, 'Du har ikke en olietønde!', 'error')
|
||
|
return
|
||
|
end
|
||
|
local current_info = oil_barrel.info
|
||
|
|
||
|
if not current_info.type then
|
||
|
TriggerClientEvent('QBCore:Notify', source, 'Kunne ikke finde oile-type', 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if not (current_info.type == 'crudeOil' or current_info.type == 'fuel_oil' or current_info.type == 'gasoline') then
|
||
|
TriggerClientEvent('QBCore:Notify', source, 'Vi eksporterer ikke denne type olie!', 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if reachedMaxStock(current_info.type) then
|
||
|
-- when we reached max stock
|
||
|
TriggerClientEvent('QBCore:Notify', source, 'Vi tager ikke imod flere tilbud. Kom igen senere!',
|
||
|
'primary')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if not canWeAcceptMoreStock(current_info.type, amount) then
|
||
|
-- when buying results in more oil than what we need
|
||
|
local max_amount = math.floor(TRANSPORT.max_stock - current_transport_stock)
|
||
|
msg_string = "Vi kan kun acceptere op til %d liter"
|
||
|
msg_string = string.format(msg_string, max_amount)
|
||
|
TriggerClientEvent('QBCore:Notify', source, '', 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if current_info.gal < amount then
|
||
|
-- when they don't have what they want to sell
|
||
|
msg_string = 'Du vil sælge: %d, men har kun: %d'
|
||
|
msg_string = string.format(msg_string, amount, current_info.gal)
|
||
|
TriggerClientEvent('QBCore:Notify', source, msg_string, 'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local gender = Oilwell_config.Locale.info.mr
|
||
|
if player.PlayerData.charinfo.gender == 1 then
|
||
|
gender = Oilwell_config.Locale.info.mrs
|
||
|
end
|
||
|
local charinfo = player.PlayerData.charinfo
|
||
|
|
||
|
local cost = TRANSPORT.prices[current_info.type] * amount
|
||
|
if current_info.gal > amount then
|
||
|
-- asking less than what they have
|
||
|
current_info.gal = math.floor(current_info.gal - amount)
|
||
|
-- this function can be called just once after conditions but this should prevent switching slots
|
||
|
change_item_info(player, oil_barrel.slot, oil_barrel.info)
|
||
|
|
||
|
player.Functions.AddMoney("bank", cost, 'crude_oil_transport')
|
||
|
|
||
|
msg_string = 'Du solgte: %d liter for: %.2f,-'
|
||
|
msg_string = string.format(msg_string, amount, cost)
|
||
|
TriggerClientEvent('QBCore:Notify', source, msg_string, 'success')
|
||
|
|
||
|
TriggerClientEvent('keep-oilrig:client:local_mail_sender', source, {
|
||
|
gender = gender,
|
||
|
charinfo = charinfo,
|
||
|
refund = 0,
|
||
|
money = cost,
|
||
|
amount = amount
|
||
|
})
|
||
|
elseif current_info.gal == amount and amount ~= 0 then
|
||
|
-- asking for all they have
|
||
|
current_info.gal = 0
|
||
|
-- this function can be called just once after conditions but this should prevent switching slots
|
||
|
change_item_info(player, oil_barrel.slot, oil_barrel.info)
|
||
|
remove_item(source, player, 'oilbarell', oil_barrel.slot)
|
||
|
-- money for what they sold
|
||
|
local money = (cost) + TRANSPORT.barell_refund
|
||
|
player.Functions.AddMoney("bank", money, 'crude_oil_transport')
|
||
|
|
||
|
msg_string = 'Du solgte: %d liter for: %.2f,- + tønde refundering: %.2f,-'
|
||
|
msg_string = string.format(msg_string, amount, cost, TRANSPORT.barell_refund)
|
||
|
TriggerClientEvent('QBCore:Notify', source, msg_string, 'success')
|
||
|
|
||
|
TriggerClientEvent('keep-oilrig:client:local_mail_sender', source, {
|
||
|
gender = gender,
|
||
|
charinfo = charinfo,
|
||
|
refund = TRANSPORT.barell_refund,
|
||
|
money = cost,
|
||
|
amount = amount
|
||
|
})
|
||
|
else
|
||
|
-- invalid
|
||
|
-- or they ask for much more than they have
|
||
|
TriggerClientEvent('QBCore:Notify', source, 'Du har ikke en tønde, ellers er den tom!', 'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
current_transport_stock[current_info.type] = current_transport_stock[current_info.type] + amount
|
||
|
cb(true)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('keep-oilrig:server:oil_transport:checkPrice', function()
|
||
|
local names = {
|
||
|
crudeOil = 'Råoile',
|
||
|
gasoline = 'Brændstof',
|
||
|
fuel_oil = 'Brændselsolie'
|
||
|
}
|
||
|
local msg_string = "Vores nuværrende lager af [%s] er: %d/%d. Pris per liter: %.2f,-"
|
||
|
for key, value in pairs(current_transport_stock) do
|
||
|
local s = string.format(msg_string, names[key], math.floor(value), TRANSPORT.max_stock, TRANSPORT.prices[key])
|
||
|
TriggerClientEvent('QBCore:Notify', source, s, 'primary', 7500)
|
||
|
end
|
||
|
|
||
|
end)
|
||
|
|
||
|
-- =======================================
|
||
|
-- Send Data / to Client
|
||
|
-- =======================================
|
||
|
|
||
|
---send oilrigs data to loaded player
|
||
|
---@param source integer
|
||
|
---@param cb table
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:getNetIDs', function(source, cb)
|
||
|
local player = QBCore.Functions.GetPlayer(source)
|
||
|
local citizenid = player.PlayerData.citizenid
|
||
|
local temp = {}
|
||
|
for key, value in pairs(GlobalScirptData:readAll()) do
|
||
|
temp[key] = deepcopy(value)
|
||
|
temp[key].employees_list = nil
|
||
|
temp[key].employees = nil
|
||
|
temp[key].is_employee = nil
|
||
|
temp[key].metadata = nil
|
||
|
temp[key].citizenid = nil
|
||
|
|
||
|
if value.citizenid == citizenid then
|
||
|
temp[key].isOwner = true
|
||
|
else
|
||
|
temp[key].isOwner = false
|
||
|
end
|
||
|
end
|
||
|
cb(temp)
|
||
|
end)
|
||
|
|
||
|
-- ======================================
|
||
|
-- Register / from Client
|
||
|
-- ======================================
|
||
|
|
||
|
--- create oilrig and initialize it's data into database
|
||
|
---@param source integer
|
||
|
---@param cb 'calback'
|
||
|
---@param coords table
|
||
|
---@return 'NetId'
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:createNewOilrig', function(source, cb, coords)
|
||
|
local rigmodel = GetHashKey('p_oil_pjack_03_s')
|
||
|
|
||
|
local oilrig = CreateObject(rigmodel, coords.x, coords.y, coords.z, 1, 1, 0)
|
||
|
while not DoesEntityExist(oilrig) do
|
||
|
Wait(50)
|
||
|
end
|
||
|
local NetId = NetworkGetNetworkIdFromEntity(oilrig)
|
||
|
cb(NetId)
|
||
|
end)
|
||
|
|
||
|
---register oilrig to player by their current cid
|
||
|
QBCore.Functions.CreateCallback('keep-oilrig:server:regiserOilrig', function(source, cb, inputData)
|
||
|
-- get player by entered cid
|
||
|
local cid = tonumber(inputData.cid)
|
||
|
local player = QBCore.Functions.GetPlayer(cid)
|
||
|
if player ~= nil then
|
||
|
local PlayerData = player.PlayerData
|
||
|
local entity = NetworkGetEntityFromNetworkId(inputData.netId)
|
||
|
local coord = GetEntityCoords(entity)
|
||
|
local rotation = GetEntityRotation(entity)
|
||
|
local position = {
|
||
|
coord = {
|
||
|
x = coord.x,
|
||
|
y = coord.y,
|
||
|
z = coord.z,
|
||
|
},
|
||
|
rotation = {
|
||
|
x = rotation.x,
|
||
|
y = rotation.y,
|
||
|
z = rotation.z,
|
||
|
}
|
||
|
}
|
||
|
local metadata = {
|
||
|
speed = 0,
|
||
|
temp = 0,
|
||
|
duration = 0,
|
||
|
secduration = 0,
|
||
|
oil_storage = 0,
|
||
|
part_info = {
|
||
|
belt = 0,
|
||
|
polish = 0,
|
||
|
clutch = 0,
|
||
|
}
|
||
|
}
|
||
|
local hash = RandomHash(15)
|
||
|
local id = GeneralInsert({
|
||
|
citizenid = PlayerData.citizenid,
|
||
|
name = inputData.name,
|
||
|
oilrig_hash = hash,
|
||
|
position = position,
|
||
|
metadata = metadata,
|
||
|
state = false
|
||
|
})
|
||
|
GlobalScirptData:newOilwell({
|
||
|
id = id,
|
||
|
citizenid = PlayerData.citizenid,
|
||
|
position = position,
|
||
|
name = inputData.name,
|
||
|
state = false,
|
||
|
oilrig_hash = hash,
|
||
|
metadata = metadata
|
||
|
}, {})
|
||
|
TriggerClientEvent('keep-oilwell:client:force_reload', -1)
|
||
|
cb(true)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Kunne ikke finde spiller med det BorgerID!")
|
||
|
cb(false)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
function GetOilPumpItems(oilrig_hash)
|
||
|
local items = {}
|
||
|
local stash = 'oilPump_' .. oilrig_hash
|
||
|
local result = MySQL.Sync.fetchAll("SELECT items FROM stashitems WHERE stash=?", { stash })
|
||
|
local res = result[1]
|
||
|
if res == nil then return false end
|
||
|
if res.items == nil then return false end
|
||
|
res.items = json.decode(res.items)
|
||
|
if res.items == nil then return false end
|
||
|
|
||
|
for k, item in pairs(res.items) do
|
||
|
local itemInfo = QBCore.Shared.Items[item.name:lower()]
|
||
|
items[item.slot] = {
|
||
|
name = itemInfo["name"],
|
||
|
amount = tonumber(item.amount),
|
||
|
info = item.info ~= nil and item.info or "",
|
||
|
label = itemInfo["label"],
|
||
|
description = itemInfo["description"] ~= nil and itemInfo["description"] or "",
|
||
|
weight = itemInfo["weight"],
|
||
|
type = itemInfo["type"],
|
||
|
unique = itemInfo["unique"],
|
||
|
useable = itemInfo["useable"],
|
||
|
image = itemInfo["image"],
|
||
|
slot = item.slot,
|
||
|
}
|
||
|
end
|
||
|
return items
|
||
|
end
|
||
|
|
||
|
local function isOneOfItems(item)
|
||
|
local s = {
|
||
|
['oilfilter'] = 'polish',
|
||
|
['reliefvalvestring'] = 'polish',
|
||
|
['skewgear'] = 'kobling',
|
||
|
['timingchain'] = 'bælte',
|
||
|
['driveshaft'] = 'drivaksel'
|
||
|
}
|
||
|
|
||
|
for _, part in pairs(s) do
|
||
|
if item.name == _ then
|
||
|
return item, part
|
||
|
end
|
||
|
end
|
||
|
return nil
|
||
|
end
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilwell:server:fix_oil_well', function(source, cb, oilrig_hash)
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
local items = GetOilPumpItems(oilrig_hash)
|
||
|
local stash = 'oilPump_' .. oilrig_hash
|
||
|
local oil_well = GlobalScirptData:getByHash(oilrig_hash)
|
||
|
if not oil_well then cb(false) return end
|
||
|
local is_employee, is_owner = oil_well.is_employee(Player.PlayerData.citizenid)
|
||
|
if not is_employee and not is_owner then
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
for _, data in pairs(items) do
|
||
|
local _item, part = isOneOfItems(data)
|
||
|
if _item then
|
||
|
local increase = oil_well.metadata.part_info[part] + 10 * _item.amount
|
||
|
if increase >= 0 and increase <= 100 then
|
||
|
oil_well.metadata.part_info[part] = increase
|
||
|
elseif increase >= 100 then
|
||
|
oil_well.metadata.part_info[part] = 100
|
||
|
else
|
||
|
oil_well.metadata.part_info[part] = 0
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Dele brugt til at fikse oliebrønd.", 'primary')
|
||
|
MySQL.Async.execute("UPDATE stashitems SET items = '[]' WHERE stash = ?", { stash })
|
||
|
cb(true)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilwell:server:is_employee', function(source, cb, oilrig_hash)
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
local oil_well = GlobalScirptData:getByHash(oilrig_hash)
|
||
|
if not oil_well then cb(false) return end
|
||
|
cb(oil_well.is_employee(Player.PlayerData.citizenid))
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilwell:server:employees_list', function(source, cb, oilrig_hash)
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
local oil_well = GlobalScirptData:getByHash(oilrig_hash)
|
||
|
if not oil_well then cb(false) return end
|
||
|
local is_employee, is_owner = oil_well.is_employee(Player.PlayerData.citizenid)
|
||
|
if not is_employee and not is_owner then
|
||
|
TriggerClientEvent('QBCore:Notify', source, "Du kan ikke se denne liste!", 'error')
|
||
|
cb(false)
|
||
|
return
|
||
|
end
|
||
|
local list = deepcopy(oil_well.employees_list())
|
||
|
for index, value in ipairs(list) do
|
||
|
value.id = nil
|
||
|
local Player = QBCore.Functions.GetPlayerByCitizenId(value.citizenid)
|
||
|
if Player then
|
||
|
value.charinfo = Player.PlayerData.charinfo
|
||
|
value.online = true
|
||
|
else
|
||
|
Player = QBCore.Player.GetOfflinePlayer(value.citizenid)
|
||
|
if not Player then
|
||
|
value.charinfo = {
|
||
|
firstname = 'Slettet',
|
||
|
lastname = ''
|
||
|
}
|
||
|
value.online = false
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
cb(list)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('keep-oilwell:server:add_employee', function(oilrig_hash, state_id)
|
||
|
state_id = tonumber(state_id)
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local oil_well = GlobalScirptData:getByHash(oilrig_hash)
|
||
|
if not oil_well then return end
|
||
|
local _, is_owner = oil_well.is_employee(Player.PlayerData.citizenid)
|
||
|
if not is_owner then
|
||
|
TriggerClientEvent('QBCore:Notify', src, "Du skal være ejer af denne oliebrønd!", 'error')
|
||
|
return
|
||
|
end
|
||
|
local new_employee = QBCore.Functions.GetPlayer(state_id)
|
||
|
if not new_employee then
|
||
|
TriggerClientEvent('QBCore:Notify', src, "Forkert stats ID!", 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if new_employee.PlayerData.citizenid == oil_well.citizenid then
|
||
|
TriggerClientEvent('QBCore:Notify', src, "Du kan ikke tilføje ejeren som medarbejder", 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local sqlQuery = 'INSERT INTO oilcompany_employees (citizenid, oilrig_hash) VALUES (:citizenid, :oilrig_hash)'
|
||
|
local QueryData = {
|
||
|
['citizenid'] = new_employee.PlayerData.citizenid,
|
||
|
['oilrig_hash'] = oilrig_hash,
|
||
|
}
|
||
|
MySQL.Async.execute(sqlQuery, QueryData, function()
|
||
|
local e_sql = 'SELECT * FROM oilcompany_employees WHERE oilrig_hash = ?'
|
||
|
oil_well.employees = MySQL.Sync.fetchAll(e_sql, { oilrig_hash })
|
||
|
local id = #oil_well.employees + 1
|
||
|
oil_well.employees[id] = {
|
||
|
id = id,
|
||
|
oilrig_hash = oil_well.oilrig_hash,
|
||
|
citizenid = oil_well.citizenid
|
||
|
}
|
||
|
TriggerClientEvent('QBCore:Notify', src, "Ny medarbejder tilføjet til listen", 'success')
|
||
|
end)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('keep-oilwell:server:remove_employee', function(oilrig_hash, citizenid)
|
||
|
if type(oilrig_hash) ~= 'string' or type(citizenid) ~= 'string' then
|
||
|
-- print('wrong type')
|
||
|
return
|
||
|
end
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local oil_well = GlobalScirptData:getByHash(oilrig_hash)
|
||
|
if not oil_well then return end
|
||
|
if not citizenid then return end
|
||
|
local _, is_owner = oil_well.is_employee(Player.PlayerData.citizenid)
|
||
|
if not is_owner then
|
||
|
TriggerClientEvent('QBCore:Notify', src, "Du skal være ejer af denne oliebrønd!", 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if citizenid == oil_well.citizenid then
|
||
|
TriggerClientEvent('QBCore:Notify', src, "Du kan ikke fyre dig selv", 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local sqlQuery = 'DELETE FROM oilcompany_employees WHERE citizenid = ?'
|
||
|
local QueryData = {
|
||
|
citizenid
|
||
|
}
|
||
|
MySQL.Async.execute(sqlQuery, QueryData, function()
|
||
|
local e_sql = 'SELECT * FROM oilcompany_employees WHERE oilrig_hash = ?'
|
||
|
oil_well.employees = MySQL.Sync.fetchAll(e_sql, { oilrig_hash })
|
||
|
local id = #oil_well.employees + 1
|
||
|
oil_well.employees[id] = {
|
||
|
id = id,
|
||
|
oilrig_hash = oil_well.oilrig_hash,
|
||
|
citizenid = oil_well.citizenid
|
||
|
}
|
||
|
TriggerClientEvent('QBCore:Notify', src, "Medarbejder fyret!", 'success')
|
||
|
end)
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateCallback('keep-oilwell:server:oilwell_metadata', function(source, cb, oilrig_hash)
|
||
|
local oil_well = GlobalScirptData:getByHash(oilrig_hash)
|
||
|
if not oil_well then cb(false) return end
|
||
|
cb(oil_well.metadata)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('keep-oilwell:server:remove_oilwell', function(oilrig_hash)
|
||
|
-- flag a oilwell as deleted
|
||
|
local src = source
|
||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||
|
local oil_well = GlobalScirptData:getByHash(oilrig_hash)
|
||
|
if not oil_well then
|
||
|
return --print('oilwell not found', src, oilrig_hash)
|
||
|
end
|
||
|
if not Player.PlayerData.job.isboss then
|
||
|
-- DropPlayer(src, 'you are not CEO')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local sqlQuery = 'UPDATE oilrig_position SET deleted = ? WHERE oilrig_hash = ?'
|
||
|
MySQL.Async.execute(sqlQuery, { 1, oil_well.oilrig_hash }, function()
|
||
|
TriggerClientEvent('QBCore:Notify', src,
|
||
|
"Destruktions-anmodning modtaget! Oliebrønden vil forsvinde efter næste tsunami!",
|
||
|
'success'
|
||
|
)
|
||
|
end)
|
||
|
end)
|
||
|
-- ===========================
|
||
|
-- Commands
|
||
|
-- ===========================
|
||
|
|
||
|
QBCore.Commands.Add('create', 'Lav oliebrønd', {}, false, function(source, args)
|
||
|
if args[1] == 'oilwell' then
|
||
|
TriggerClientEvent('keep-oilrig:client:spawn', source, args[1])
|
||
|
end
|
||
|
end, 'admin')
|
||
|
|
||
|
QBCore.Commands.Add('togglejob', 'togglejob', {}, false, function(source, args)
|
||
|
local PlayerJob = QBCore.Functions.GetPlayer(source).PlayerData.job
|
||
|
TriggerClientEvent('keep-oilrig:client:goOnDuty', source, PlayerJob)
|
||
|
end, 'admin')
|