diff --git a/resources/[carscripts]/nordi_antidespawn/client/main.lua b/resources/[carscripts]/nordi_antidespawn/client/main.lua index ff0d2c40a..fedec65c0 100644 --- a/resources/[carscripts]/nordi_antidespawn/client/main.lua +++ b/resources/[carscripts]/nordi_antidespawn/client/main.lua @@ -1,7 +1,5 @@ local QBCore = exports['qb-core']:GetCoreObject() -local trackedVehicles = {} -local spawnedVehicles = {} -local playerEnteredVehicles = {} -- Fahrzeuge in die sich der Spieler gesetzt hat +local playerDrivenVehicles = {} -- Nur Fahrzeuge die der Spieler gefahren hat -- Funktion um zu prüfen ob Fahrzeugklasse erlaubt ist local function IsVehicleClassAllowed(vehicle) @@ -95,24 +93,7 @@ local function SetVehicleMods(vehicle, mods) end end --- Verhindere Despawn für alle getrackten Fahrzeuge -local function PreventVehicleDespawn(vehicle) - if DoesEntityExist(vehicle) then - SetEntityAsMissionEntity(vehicle, true, true) - SetVehicleHasBeenOwnedByPlayer(vehicle, true) - SetVehicleNeedsToBeHotwired(vehicle, false) - SetVehicleOnGroundProperly(vehicle) - FreezeEntityPosition(vehicle, false) - - -- Verhindere dass das Fahrzeug als "abandoned" markiert wird - DecorSetBool(vehicle, "IgnoredByQuickSave", false) - - -- Setze Vehicle als persistent - SetEntityLoadCollisionFlag(vehicle, true) - end -end - --- Event Handler für Fahrzeug betreten +-- Event Handler für Fahrzeug betreten (nur Fahrersitz) CreateThread(function() local lastVehicle = 0 @@ -122,14 +103,21 @@ CreateThread(function() local playerPed = PlayerPedId() local currentVehicle = GetVehiclePedIsIn(playerPed, false) - -- Spieler ist in ein Fahrzeug eingestiegen + -- Spieler ist als Fahrer in ein Fahrzeug eingestiegen if currentVehicle ~= 0 and currentVehicle ~= lastVehicle then - if IsVehicleClassAllowed(currentVehicle) then + local seat = GetPedVehicleSeat(playerPed) + + -- Nur wenn Spieler auf Fahrersitz ist (Seat -1) + if seat == -1 and IsVehicleClassAllowed(currentVehicle) then local plate = QBCore.Functions.GetPlate(currentVehicle) - playerEnteredVehicles[plate] = currentVehicle + playerDrivenVehicles[plate] = currentVehicle + + -- Verhindere sofort Despawn + SetEntityAsMissionEntity(currentVehicle, true, true) + SetVehicleHasBeenOwnedByPlayer(currentVehicle, true) if Config.Debug then - print(string.format("Player entered vehicle: %s", plate)) + print(string.format("Player started driving vehicle: %s", plate)) end end end @@ -138,21 +126,19 @@ CreateThread(function() end end) --- Hauptloop für Fahrzeugtracking (nur für Fahrzeuge in die sich Spieler gesetzt haben) +-- Hauptloop für Fahrzeugtracking (nur für vom Spieler gefahrene Fahrzeuge) CreateThread(function() while true do Wait(Config.SaveInterval) - local playerPed = PlayerPedId() - local playerCoords = GetEntityCoords(playerPed) - - -- Tracke nur Fahrzeuge in die sich der Spieler gesetzt hat - for plate, vehicle in pairs(playerEnteredVehicles) do + -- Tracke nur Fahrzeuge die der Spieler gefahren hat + for plate, vehicle in pairs(playerDrivenVehicles) do if DoesEntityExist(vehicle) then local vehicleCoords = GetEntityCoords(vehicle) -- Verhindere Despawn - PreventVehicleDespawn(vehicle) + SetEntityAsMissionEntity(vehicle, true, true) + SetVehicleHasBeenOwnedByPlayer(vehicle, true) -- Speichere Fahrzeugdaten local vehicleData = { @@ -162,7 +148,7 @@ CreateThread(function() rotation = {x = 0.0, y = 0.0, z = GetEntityHeading(vehicle)}, engineHealth = GetVehicleEngineHealth(vehicle), bodyHealth = GetVehicleBodyHealth(vehicle), - fuel = 100, -- Standardwert, anpassen je nach Fuel System + fuel = 100, mods = GetVehicleMods(vehicle) } @@ -174,27 +160,15 @@ CreateThread(function() 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)) + print(string.format("Saving player driven vehicle: %s", plate)) end else -- Fahrzeug existiert nicht mehr, entferne aus Liste - playerEnteredVehicles[plate] = nil + playerDrivenVehicles[plate] = nil if Config.Debug then - print(string.format("Player vehicle no longer exists: %s", plate)) - end - end - end - - -- Prüfe ob getrackte Fahrzeuge noch existieren - for plate, vehicle in pairs(trackedVehicles) do - if not DoesEntityExist(vehicle) then - trackedVehicles[plate] = nil - if Config.Debug then - print(string.format("Tracked vehicle no longer exists: %s", plate)) + print(string.format("Player driven vehicle no longer exists: %s", plate)) end end end @@ -231,7 +205,6 @@ RegisterNetEvent('vehicle-persistence:client:spawnSavedVehicles', function(vehic local vehicle = CreateVehicle(modelHash, position.x, position.y, position.z, rotation.z, true, false) if DoesEntityExist(vehicle) then - -- Warte bis Fahrzeug vollständig geladen ist Wait(500) -- Setze Fahrzeugdaten @@ -253,36 +226,24 @@ RegisterNetEvent('vehicle-persistence:client:spawnSavedVehicles', function(vehic end -- Verhindere Despawn - PreventVehicleDespawn(vehicle) + SetEntityAsMissionEntity(vehicle, true, true) + SetVehicleHasBeenOwnedByPlayer(vehicle, true) - spawnedVehicles[vehicleData.plate] = vehicle - trackedVehicles[vehicleData.plate] = vehicle - playerEnteredVehicles[vehicleData.plate] = vehicle -- Markiere als Spielerfahrzeug + playerDrivenVehicles[vehicleData.plate] = vehicle if Config.Debug then print(string.format("Successfully spawned saved vehicle: %s", vehicleData.plate)) end - else - if Config.Debug then - print(string.format("Failed to create vehicle: %s", vehicleData.plate)) - end end SetModelAsNoLongerNeeded(modelHash) - else - if Config.Debug then - print(string.format("Failed to load model for vehicle: %s", vehicleData.plate)) - end end end) 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)) - end + -- Fahrzeug existiert bereits, füge zu Liste hinzu + playerDrivenVehicles[vehicleData.plate] = existingVehicle + SetEntityAsMissionEntity(existingVehicle, true, true) + SetVehicleHasBeenOwnedByPlayer(existingVehicle, true) end end end) @@ -300,30 +261,14 @@ end -- Lade Fahrzeuge beim Spawn RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() - Wait(10000) -- Längere Wartezeit bis alles geladen ist + Wait(10000) TriggerServerEvent('vehicle-persistence:server:loadVehicles') end) --- Lade Fahrzeuge auch beim Resource Start -CreateThread(function() - Wait(15000) -- Warte bis Server vollständig geladen ist - if QBCore.Functions.GetPlayerData().citizenid then - TriggerServerEvent('vehicle-persistence:server:loadVehicles') - end -end) - -- jg-advanced-garage Events RegisterNetEvent('jg-advancedgarages:client:vehicle-stored', function(data) - if data and data.plate then - if trackedVehicles[data.plate] then - trackedVehicles[data.plate] = nil - end - if spawnedVehicles[data.plate] then - spawnedVehicles[data.plate] = nil - end - if playerEnteredVehicles[data.plate] then - playerEnteredVehicles[data.plate] = nil - end + if data and data.plate and playerDrivenVehicles[data.plate] then + playerDrivenVehicles[data.plate] = nil if Config.Debug then print(string.format("Vehicle stored in garage, removed from tracking: %s", data.plate)) end @@ -331,44 +276,17 @@ RegisterNetEvent('jg-advancedgarages:client:vehicle-stored', function(data) end) RegisterNetEvent('jg-advancedgarages:client:vehicle-spawned', function(data) - if data and data.plate then - if trackedVehicles[data.plate] then - trackedVehicles[data.plate] = nil - end - if spawnedVehicles[data.plate] then - spawnedVehicles[data.plate] = nil - end - if playerEnteredVehicles[data.plate] then - playerEnteredVehicles[data.plate] = nil - end + if data and data.plate and playerDrivenVehicles[data.plate] then + playerDrivenVehicles[data.plate] = nil if Config.Debug then print(string.format("Vehicle spawned from garage, removed from tracking: %s", data.plate)) end end end) --- Kontinuierliche Despawn-Verhinderung -CreateThread(function() - while true do - Wait(30000) -- Alle 30 Sekunden - - for plate, vehicle in pairs(trackedVehicles) do - if DoesEntityExist(vehicle) then - PreventVehicleDespawn(vehicle) - else - trackedVehicles[plate] = nil - spawnedVehicles[plate] = nil - playerEnteredVehicles[plate] = nil - end - end - end -end) - -- Cleanup beim Disconnect AddEventHandler('onResourceStop', function(resourceName) if resourceName == GetCurrentResourceName() then - trackedVehicles = {} - spawnedVehicles = {} - playerEnteredVehicles = {} + playerDrivenVehicles = {} end end)