2025-06-17 17:17:59 +02:00
-- 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 = { }
2025-06-07 08:51:21 +02:00
end