Scripts/resources/[qb]/[qb_jobs]/keep-oilwell/server/server_main.lua

1035 lines
39 KiB
Lua
Raw Permalink Normal View History

2024-12-29 20:06:22 +00:00
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')