forked from Simnation/Main
153 lines
No EOL
5.7 KiB
Lua
153 lines
No EOL
5.7 KiB
Lua
-- Do not load anything here if electric is disabled
|
|
if not Config.Electric.enabled then
|
|
return
|
|
end
|
|
|
|
local electricChargers = {}
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Threads
|
|
-----------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
-- Create sphere zones for each station, hooking up onEnter/onExit
|
|
function createElectricZones()
|
|
assert(Utils.Zones, "You are using an outdated version of lc_utils. Please update your 'lc_utils' script to the latest version: https://github.com/LeonardoSoares98/lc_utils/releases/latest/download/lc_utils.zip")
|
|
|
|
local stations = groupChargersByStation()
|
|
|
|
for _, station in pairs(stations) do
|
|
Utils.Zones.createZone({
|
|
coords = station.center,
|
|
radius = 50.0,
|
|
onEnter = function()
|
|
for _, charger in pairs(station.chargers) do
|
|
loadElectricCharger(charger)
|
|
end
|
|
end,
|
|
onExit = function()
|
|
for _, charger in pairs(station.chargers) do
|
|
unloadElectricCharger(charger)
|
|
end
|
|
end
|
|
})
|
|
end
|
|
end
|
|
|
|
-- Thread to detect near electric chargers
|
|
function createElectricMarkersThread()
|
|
CreateThread(function()
|
|
while true do
|
|
local ped = PlayerPedId()
|
|
local playerCoords = GetEntityCoords(ped)
|
|
local pump, pumpModel = GetClosestPump(playerCoords, true)
|
|
|
|
while pump and pump > 0 and #(playerCoords - GetEntityCoords(pump)) < 2.0 do
|
|
playerCoords = GetEntityCoords(ped)
|
|
if not mainUiOpen and not DoesEntityExist(fuelNozzle) then
|
|
Utils.Markers.showHelpNotification(cachedTranslations.open_recharge, true)
|
|
if IsControlJustPressed(0,38) then
|
|
clientOpenUI(pump, pumpModel, true)
|
|
end
|
|
end
|
|
Wait(2)
|
|
end
|
|
Wait(1000)
|
|
end
|
|
end)
|
|
end
|
|
|
|
function createElectricTargetsThread()
|
|
local pumpModels = {} -- This will be the final list without duplicates
|
|
local seenModels = {} -- This acts as a set to track unique values
|
|
|
|
for _, chargerData in pairs(Config.Electric.chargersLocation) do
|
|
local model = chargerData.prop
|
|
if not seenModels[model] then
|
|
seenModels[model] = true -- Mark model as seen
|
|
table.insert(pumpModels, model) -- Insert only if it's not a duplicate
|
|
end
|
|
end
|
|
|
|
-- Pass unique models to the target creation function
|
|
Utils.Target.createTargetForModel(pumpModels, openElectricUICallback, Utils.translate('target.open_recharge'), "fas fa-plug", "#00a413",nil,nil,canOpenPumpUiTargetCallback)
|
|
|
|
Utils.Target.createTargetForModel(pumpModels,returnNozzle,Utils.translate('target.return_nozzle'),"fas fa-plug","#a42100",nil,nil,canReturnNozzleTargetCallback)
|
|
end
|
|
|
|
function openElectricUICallback()
|
|
local ped = PlayerPedId()
|
|
local playerCoords = GetEntityCoords(ped)
|
|
local pump, pumpModel = GetClosestPump(playerCoords, true)
|
|
if pump then
|
|
clientOpenUI(pump, pumpModel, true)
|
|
else
|
|
exports['lc_utils']:notify("error", Utils.translate("pump_not_found"))
|
|
end
|
|
end
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Utils
|
|
-----------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
function loadElectricCharger(chargerData)
|
|
if not electricChargers[chargerData.location] then
|
|
RequestModel(chargerData.prop)
|
|
while not HasModelLoaded(chargerData.prop) do
|
|
Wait(10)
|
|
end
|
|
|
|
local heading = chargerData.location.w + 180.0
|
|
local electricCharger = CreateObject(chargerData.prop, chargerData.location.x, chargerData.location.y, chargerData.location.z, false, true, true)
|
|
SetEntityHeading(electricCharger, heading)
|
|
FreezeEntityPosition(electricCharger, true)
|
|
|
|
electricChargers[chargerData.location] = electricCharger
|
|
end
|
|
end
|
|
|
|
function unloadElectricCharger(chargerData)
|
|
local charger = electricChargers[chargerData.location]
|
|
if charger and DoesEntityExist(charger) then
|
|
DeleteEntity(charger)
|
|
electricChargers[chargerData.location] = nil
|
|
end
|
|
end
|
|
|
|
-- Utility to group chargers by their station
|
|
function groupChargersByStation()
|
|
local stations = {}
|
|
for _, charger in pairs(Config.Electric.chargersLocation) do
|
|
local assigned = false
|
|
for _, station in pairs(stations) do
|
|
local dist = #(station.center - vector3(charger.location.x, charger.location.y, charger.location.z))
|
|
if dist < 20.0 then
|
|
table.insert(station.chargers, charger)
|
|
station.center = (station.center + vector3(charger.location.x, charger.location.y, charger.location.z)) / 2
|
|
assigned = true
|
|
break
|
|
end
|
|
end
|
|
if not assigned then
|
|
table.insert(stations, {
|
|
center = vector3(charger.location.x, charger.location.y, charger.location.z),
|
|
chargers = { charger }
|
|
})
|
|
end
|
|
end
|
|
return stations
|
|
end
|
|
|
|
AddEventHandler('onResourceStop', function(resourceName)
|
|
if GetCurrentResourceName() ~= resourceName then return end
|
|
|
|
deleteAllElectricChargers()
|
|
end)
|
|
|
|
function deleteAllElectricChargers()
|
|
for _, charger in pairs(electricChargers) do
|
|
if DoesEntityExist(charger) then
|
|
DeleteEntity(charger)
|
|
end
|
|
end
|
|
electricChargers = {}
|
|
end |