diff --git a/resources/[carscripts]/nordi_antidespawn/client/main.lua b/resources/[carscripts]/nordi_antidespawn/client/main.lua index 08fc9e1d7..ff0d2c40a 100644 --- a/resources/[carscripts]/nordi_antidespawn/client/main.lua +++ b/resources/[carscripts]/nordi_antidespawn/client/main.lua @@ -1,6 +1,7 @@ local QBCore = exports['qb-core']:GetCoreObject() local trackedVehicles = {} local spawnedVehicles = {} +local playerEnteredVehicles = {} -- Fahrzeuge in die sich der Spieler gesetzt hat -- Funktion um zu prüfen ob Fahrzeugklasse erlaubt ist local function IsVehicleClassAllowed(vehicle) @@ -111,7 +112,33 @@ local function PreventVehicleDespawn(vehicle) end end --- Hauptloop für Fahrzeugtracking +-- Event Handler für Fahrzeug betreten +CreateThread(function() + local lastVehicle = 0 + + while true do + Wait(1000) + + local playerPed = PlayerPedId() + local currentVehicle = GetVehiclePedIsIn(playerPed, false) + + -- Spieler ist in ein Fahrzeug eingestiegen + if currentVehicle ~= 0 and currentVehicle ~= lastVehicle then + if IsVehicleClassAllowed(currentVehicle) then + local plate = QBCore.Functions.GetPlate(currentVehicle) + playerEnteredVehicles[plate] = currentVehicle + + if Config.Debug then + print(string.format("Player entered vehicle: %s", plate)) + end + end + end + + lastVehicle = currentVehicle + end +end) + +-- Hauptloop für Fahrzeugtracking (nur für Fahrzeuge in die sich Spieler gesetzt haben) CreateThread(function() while true do Wait(Config.SaveInterval) @@ -119,55 +146,45 @@ CreateThread(function() local playerPed = PlayerPedId() local playerCoords = GetEntityCoords(playerPed) - -- Finde alle Fahrzeuge - local vehicles = GetGamePool('CVehicle') - - for _, vehicle in pairs(vehicles) do - if DoesEntityExist(vehicle) and IsVehicleClassAllowed(vehicle) then - local plate = QBCore.Functions.GetPlate(vehicle) + -- Tracke nur Fahrzeuge in die sich der Spieler gesetzt hat + for plate, vehicle in pairs(playerEnteredVehicles) do + if DoesEntityExist(vehicle) then local vehicleCoords = GetEntityCoords(vehicle) - -- Prüfe ob es ein Spielerfahrzeug ist (nicht NPC) - local isPlayerVehicle = false - local driver = GetPedInVehicleSeat(vehicle, -1) + -- Verhindere Despawn + PreventVehicleDespawn(vehicle) - if driver == 0 or IsPedAPlayer(driver) then - isPlayerVehicle = true - elseif trackedVehicles[plate] or spawnedVehicles[plate] then - -- Bereits getrackt = Spielerfahrzeug - isPlayerVehicle = true + -- Speichere Fahrzeugdaten + local vehicleData = { + plate = plate, + model = GetEntityModel(vehicle), + position = {x = vehicleCoords.x, y = vehicleCoords.y, z = vehicleCoords.z}, + rotation = {x = 0.0, y = 0.0, z = GetEntityHeading(vehicle)}, + engineHealth = GetVehicleEngineHealth(vehicle), + bodyHealth = GetVehicleBodyHealth(vehicle), + fuel = 100, -- Standardwert, anpassen je nach Fuel System + mods = GetVehicleMods(vehicle) + } + + -- Versuche Fuel zu bekommen + if GetResourceState('LegacyFuel') == 'started' then + vehicleData.fuel = exports['LegacyFuel']:GetFuel(vehicle) or 100 + elseif GetResourceState('ps-fuel') == 'started' then + vehicleData.fuel = exports['ps-fuel']:GetFuel(vehicle) or 100 end - if isPlayerVehicle then - -- Verhindere Despawn - PreventVehicleDespawn(vehicle) - - -- Speichere Fahrzeugdaten - local vehicleData = { - plate = plate, - model = GetEntityModel(vehicle), - position = {x = vehicleCoords.x, y = vehicleCoords.y, z = vehicleCoords.z}, - rotation = {x = 0.0, y = 0.0, z = GetEntityHeading(vehicle)}, - engineHealth = GetVehicleEngineHealth(vehicle), - bodyHealth = GetVehicleBodyHealth(vehicle), - fuel = 100, -- Standardwert, anpassen je nach Fuel System - mods = GetVehicleMods(vehicle) - } - - -- Versuche Fuel zu bekommen - if GetResourceState('LegacyFuel') == 'started' then - vehicleData.fuel = exports['LegacyFuel']:GetFuel(vehicle) or 100 - elseif GetResourceState('ps-fuel') == 'started' then - vehicleData.fuel = exports['ps-fuel']:GetFuel(vehicle) or 100 - end - - TriggerServerEvent('vehicle-persistence:server:saveVehiclePosition', vehicleData) - trackedVehicles[plate] = vehicle - - if Config.Debug then - local distance = #(playerCoords - vehicleCoords) - print(string.format("Tracking vehicle: %s (Model: %s) at distance: %.2f", plate, GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)), distance)) - end + TriggerServerEvent('vehicle-persistence:server:saveVehiclePosition', vehicleData) + trackedVehicles[plate] = vehicle + + if Config.Debug then + local distance = #(playerCoords - vehicleCoords) + print(string.format("Tracking player vehicle: %s at distance: %.2f", plate, distance)) + end + else + -- Fahrzeug existiert nicht mehr, entferne aus Liste + playerEnteredVehicles[plate] = nil + if Config.Debug then + print(string.format("Player vehicle no longer exists: %s", plate)) end end end @@ -177,7 +194,7 @@ CreateThread(function() if not DoesEntityExist(vehicle) then trackedVehicles[plate] = nil if Config.Debug then - print(string.format("Vehicle no longer exists, removed from tracking: %s", plate)) + print(string.format("Tracked vehicle no longer exists: %s", plate)) end end end @@ -240,6 +257,7 @@ RegisterNetEvent('vehicle-persistence:client:spawnSavedVehicles', function(vehic spawnedVehicles[vehicleData.plate] = vehicle trackedVehicles[vehicleData.plate] = vehicle + playerEnteredVehicles[vehicleData.plate] = vehicle -- Markiere als Spielerfahrzeug if Config.Debug then print(string.format("Successfully spawned saved vehicle: %s", vehicleData.plate)) @@ -260,6 +278,7 @@ RegisterNetEvent('vehicle-persistence:client:spawnSavedVehicles', function(vehic else -- Fahrzeug existiert bereits, füge zu Tracking hinzu trackedVehicles[vehicleData.plate] = existingVehicle + playerEnteredVehicles[vehicleData.plate] = existingVehicle PreventVehicleDespawn(existingVehicle) if Config.Debug then print(string.format("Vehicle already exists, added to tracking: %s", vehicleData.plate)) @@ -302,6 +321,9 @@ RegisterNetEvent('jg-advancedgarages:client:vehicle-stored', function(data) if spawnedVehicles[data.plate] then spawnedVehicles[data.plate] = nil end + if playerEnteredVehicles[data.plate] then + playerEnteredVehicles[data.plate] = nil + end if Config.Debug then print(string.format("Vehicle stored in garage, removed from tracking: %s", data.plate)) end @@ -316,6 +338,9 @@ RegisterNetEvent('jg-advancedgarages:client:vehicle-spawned', function(data) if spawnedVehicles[data.plate] then spawnedVehicles[data.plate] = nil end + if playerEnteredVehicles[data.plate] then + playerEnteredVehicles[data.plate] = nil + end if Config.Debug then print(string.format("Vehicle spawned from garage, removed from tracking: %s", data.plate)) end @@ -333,6 +358,7 @@ CreateThread(function() else trackedVehicles[plate] = nil spawnedVehicles[plate] = nil + playerEnteredVehicles[plate] = nil end end end @@ -343,5 +369,6 @@ AddEventHandler('onResourceStop', function(resourceName) if resourceName == GetCurrentResourceName() then trackedVehicles = {} spawnedVehicles = {} + playerEnteredVehicles = {} end end) diff --git a/resources/[carscripts]/nordi_antidespawn/config.lua b/resources/[carscripts]/nordi_antidespawn/config.lua index d5c75e687..b20c01d05 100644 --- a/resources/[carscripts]/nordi_antidespawn/config.lua +++ b/resources/[carscripts]/nordi_antidespawn/config.lua @@ -1,7 +1,7 @@ Config = {} -- Speicherintervall in Millisekunden (5000 = 5 Sekunden) -Config.SaveInterval = 2000 +Config.SaveInterval = 5000 -- Maximale Distanz zum Fahrzeug bevor es als "verlassen" gilt Config.MaxDistance = 1.0