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 | 
