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

408 lines
15 KiB
Lua
Raw Permalink Normal View History

2024-12-29 20:06:22 +00:00
local QBCore = exports['qb-core']:GetCoreObject()
PlayerJob = {}
OnDuty = nil
OBJECT = nil
local rigmodel = GetHashKey('p_oil_pjack_03_s')
function CheckJob()
return (PlayerJob.name == 'oilwell')
end
function CheckOnduty()
return (PlayerJob.name == 'oilwell' and PlayerJob.onduty)
end
-- class
OilRigs = {
dynamicSpawner_state = false,
data_table = {}, -- this table holds oilwells data and defined by server
core_entities = {} -- this table holds objects that has some functions to them and filled by dynamic spawner
}
function OilRigs:add(s_res, id)
if self.data_table[id] ~= nil then
return
end
self.data_table[id] = {}
self.data_table[id] = s_res
if self.data_table[id].isOwner == true then
local blip_settings = Oilwell_config.Settings.oil_well.blip
blip_settings.type = 'oil_well'
blip_settings.id = id
self.data_table[id].blip_handle = createCustom(self.data_table[id].position.coord, blip_settings)
end
end
function OilRigs:update(s_res, id)
if self.data_table[id] == nil then return end
s_res.entity = self.data_table[id].entity
s_res.Qbtarget = self.data_table[id].Qbtarget
self.data_table[id] = s_res
QBCore.Functions.TriggerCallback('keep-oilwell:server:oilwell_metadata', function(metadata)
self:syncSpeed(self.data_table[id].entity, metadata.speed)
end, self.data_table[id].oilrig_hash)
end
function OilRigs:startUpdate(cb)
QBCore.Functions.TriggerCallback('keep-oilrig:server:getNetIDs', function(result)
for key, value in pairs(result) do
self:update(value, key)
Wait(15)
end
cb(true)
end)
end
function OilRigs:syncSpeed(entity, speed)
local anim_speed = Round((speed / Oilwell_config.AnimationSpeedDivider), 2)
SetEntityAnimSpeed(entity, 'p_v_lev_des_skin', 'p_oil_pjack_03_s', anim_speed + .0)
end
function OilRigs:getById(id)
for key, value in pairs(self.data_table) do
if value.id == id then
return value
end
end
return false
end
function OilRigs:getByEntityHandle(handle)
for key, value in pairs(self.data_table) do
if value.entity == handle then
return value
end
end
return false
end
function OilRigs:readAll()
return self.data_table
end
function OilRigs:DynamicSpawner()
self.dynamicSpawner_state = true
local object_spawn_distance = 125.0
CreateThread(function()
-- create core blips
Wait(50)
for index, value in pairs(Oilwell_config.locations) do
value.blip.type = index
if not value.blip.handle and PlayerJob.name == 'oilwell' then
value.blip.handle = createCustom(value.position, value.blip)
end
if not value.qbtarget then
Add_3rd_eye(value.position, index)
value.qbtarget = true
end
end
for _, oilwell in pairs(self.data_table) do
if not oilwell.qbtarget then
local c = oilwell.position.coord
local coord = vector3(c.x, c.y, c.z)
createOwnerQbTarget(oilwell.oilrig_hash, coord)
oilwell.qbtarget = true
end
end
while self.dynamicSpawner_state do
local pedCoord = GetEntityCoords(PlayerPedId())
-- oilwells/pumps
for index, value in pairs(self.data_table) do
local c = value.position.coord
c = vector3(c.x, c.y, c.z)
local distance = #(c - pedCoord)
if distance < object_spawn_distance and self.data_table[index].entity == nil then
self.data_table[index].entity = spawnObjects(rigmodel, self.data_table[index].position)
QBCore.Functions.TriggerCallback('keep-oilwell:server:oilwell_metadata', function(metadata)
self:syncSpeed(self.data_table[index].entity, metadata.speed)
end, self.data_table[index].oilrig_hash)
elseif distance > object_spawn_distance and self.data_table[index].entity ~= nil then
DeleteEntity(self.data_table[index].entity)
self.data_table[index].entity = nil
end
end
for index, value in pairs(Oilwell_config.locations) do
local position = vector3(value.position.x, value.position.y, value.position.z)
local distance = #(position - pedCoord)
if self.core_entities[index] == nil then
self.core_entities[index] = {}
end
if distance < object_spawn_distance and self.core_entities[index].entity == nil then
self.core_entities[index].entity = spawnObjects(value.model, {
coord = { x = position.x, y = position.y, z = position.z, },
rotation = { x = value.rotation.x, y = value.rotation.y, z = value.rotation.z, }
})
elseif distance > object_spawn_distance and self.core_entities[index].entity ~= nil then
DeleteEntity(self.core_entities[index].entity)
self.core_entities[index].entity = nil
end
end
Wait(1250)
end
end)
end
function OilRigs:Flush_Entities()
for _, oilwell in pairs(self.data_table) do
if oilwell.entity then
DeleteObject(oilwell.entity)
end
RemoveBlip(oilwell.blip_handle)
end
self.dynamicSpawner_state = false
Wait(5)
self.data_table = {}
end
--
RegisterNetEvent('keep-oilrig:client:changeRigSpeed', function(qbtarget)
if not CheckJob() then
QBCore.Functions.Notify('Du er ikke hyret af et oliefirma', "error")
return false
end
if not CheckOnduty() then
QBCore.Functions.Notify('Du skal være på job!', "error")
return false
end
local rig = OilRigs:getByEntityHandle(qbtarget.entity)
if not rig then
return --print('oilwell not found')
end
QBCore.Functions.TriggerCallback('keep-oilwell:server:oilwell_metadata', function(metadata)
OilRigs:startUpdate(function()
local inputData = exports['qb-input']:ShowInput({
header = "Skift hastighed",
submitText = "change",
inputs = {
{
type = 'text',
isRequired = true,
name = 'Hastighed',
text = 'Nuværrende hastighed ' .. metadata.speed
},
}
})
if inputData then
local speed = tonumber(inputData.speed)
if not inputData.speed then
return
end
if not (0 <= speed and speed <= 100) then
QBCore.Functions.Notify('Hastighed skal være mellem 0-100', "error")
return
end
QBCore.Functions.Notify('Hanstighed er nu ' .. speed, "success")
TriggerServerEvent('keep-oilrig:server:updateSpeed', inputData, rig.id)
end
end)
end, rig.oilrig_hash)
end)
local function loadData()
OilRigs:Flush_Entities()
QBCore.Functions.GetPlayerData(function(PlayerData)
PlayerJob = PlayerData.job
OnDuty = PlayerData.job.onduty
QBCore.Functions.TriggerCallback('keep-oilrig:server:getNetIDs', function(result)
for key, value in pairs(result) do
OilRigs:add(value, key)
end
OilRigs:DynamicSpawner()
end)
end)
end
RegisterNetEvent('keep-oilrig:client:syncSpeed', function(id, speed)
local rig = OilRigs:getById(id)
if rig then
OilRigs:syncSpeed(rig.entity, speed)
end
end)
function spawnObjects(model, position)
TriggerEvent('keep-oilrig:client:clearArea', position.coord)
-- every oilwell exist only on client side!
local entity = CreateObject(model, position.coord.x, position.coord.y, position.coord.z, 0, 0, 0)
while not DoesEntityExist(entity) do Wait(10) end
SetEntityRotation(entity, position.rotation.x, position.rotation.y, position.rotation.z, 0.0, true)
FreezeEntityPosition(entity, true)
SetEntityProofs(entity, 1, 1, 1, 1, 1, 1, 1, 1)
return entity
end
-- --------------------------------------------------------------
RegisterNetEvent('keep-oilrig:client:spawn')
AddEventHandler('keep-oilrig:client:spawn', function()
local coords = ChooseSpawnLocation()
QBCore.Functions.TriggerCallback('keep-oilrig:server:createNewOilrig', function(NetId)
if NetId ~= nil then
local entity = NetworkGetEntityFromNetworkId(NetId)
OBJECT = entity
exports['qb-target']:AddEntityZone("oil-rig-" .. entity, entity, {
name = "oil-rig-" .. entity,
heading = GetEntityHeading(entity),
debugPoly = false,
}, {
options = {
{
type = "client",
event = "keep-oilrig:client:enterInformation",
icon = "fa-regular fa-file-lines",
label = "Tildel personel",
canInteract = function(entity)
if not CheckJob() then return false end
if not (PlayerJob.grade.level == 4) then
TriggerEvent('QBCore:Notify', 'Du skal være på job!', "error")
Wait(2000)
return false
end
if not CheckOnduty() then
TriggerEvent('QBCore:Notify', 'Du skal være på job!', "error")
Wait(2000)
return false
end
return true
end,
},
{
type = "client",
event = "keep-oilwell:menu:OPENMENU",
icon = "fa-regular fa-file-lines",
label = "Adjust position",
canInteract = function(entity)
if not CheckJob() then
TriggerEvent('QBCore:Notify', 'Kun chefen kan dette', "error")
Wait(2000)
return false
end
if not (PlayerJob.grade.level == 4) then
TriggerEvent('QBCore:Notify', 'Kun chefen kan dette', "error")
Wait(2000)
return false
end
if not CheckOnduty() then
TriggerEvent('QBCore:Notify', 'Du skal være på job!', "error")
Wait(2000)
return false
end
return true
end,
},
},
distance = 2.5
})
end
end, coords)
end)
RegisterNetEvent('keep-oilrig:client:enterInformation', function(qbtarget)
local inputData = exports['qb-input']:ShowInput({
header = "Tildel oliebrønd: ",
submitText = "Tildel",
inputs = { {
type = 'text',
isRequired = true,
name = 'Navn',
text = "Navn på oliebrønd"
},
{
type = 'number',
isRequired = true,
name = 'BorgerID',
text = "Borgerens ID"
},
}
})
if inputData then
if not inputData.name and not inputData.cid then
return
end
local netId = NetworkGetNetworkIdFromEntity(qbtarget.entity)
inputData.netId = netId
QBCore.Functions.TriggerCallback('keep-oilrig:server:regiserOilrig', function(result)
DeleteEntity(qbtarget.entity)
if result == true then
Wait(1500)
QBCore.Functions.Notify('Registrerer oliebrønd til: ' .. inputData.cid, "success")
loadData()
end
end, inputData)
end
end)
RegisterNetEvent('keep-oilwell:client:force_reload', function()
Wait(25)
loadData()
end)
AddEventHandler('onResourceStart', function(resourceName)
if (GetCurrentResourceName() ~= resourceName) then
return
end
Wait(500)
QBCore.Functions.GetPlayerData(function(PlayerData)
PlayerJob = PlayerData.job
OnDuty = PlayerData.job.onduty
loadData()
end)
StartBarellAnimation()
end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
Wait(3000)
QBCore.Functions.GetPlayerData(function(PlayerData)
PlayerJob = PlayerData.job
OnDuty = PlayerData.job.onduty
loadData()
end)
StartBarellAnimation()
end)
RegisterNetEvent('QBCore:Client:OnPlayerUnload', function()
OilRigs.dynamicSpawner_state = false
end)
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo)
PlayerJob = JobInfo
OnDuty = PlayerJob.onduty
loadData()
end)
RegisterNetEvent('QBCore:Client:SetDuty', function(duty)
OnDuty = duty
loadData()
end)
RegisterNetEvent('keep-oilrig:client:local_mail_sender', function(data)
local Lang = Oilwell_config.Locale
Lang.mail.message = string.format(Lang.mail.message, data.gender, data.charinfo.lastname, data.money, data.amount,
data.refund)
TriggerServerEvent('qb-phone:server:sendNewMail', {
sender = Lang.mail.sender,
subject = Lang.mail.subject,
message = Lang.mail.message,
button = {}
})
end)
RegisterNetEvent('keep-oilwell:server_lib:AddExplosion', function(bullding_type)
local c = Oilwell_config.locations[bullding_type].position
local t = 0
for i = 1, 5, 1 do
AddExplosion(c.x, c.y, c.z + 0.5, 9, 10.0, true, false, true)
t = t + 1000
Wait(t)
end
end)