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)