153 lines
		
	
	
		
			No EOL
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			No EOL
		
	
	
		
			5.8 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 |