From f2b9b3fc299dd3c96033b70b82d3e605180c910f Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Wed, 6 Aug 2025 17:49:33 +0200 Subject: [PATCH] Update main.lua --- .../nordi_antidespawn/client/main.lua | 242 ++++++++++++------ 1 file changed, 163 insertions(+), 79 deletions(-) diff --git a/resources/[carscripts]/nordi_antidespawn/client/main.lua b/resources/[carscripts]/nordi_antidespawn/client/main.lua index 5dd7125c4..08fc9e1d7 100644 --- a/resources/[carscripts]/nordi_antidespawn/client/main.lua +++ b/resources/[carscripts]/nordi_antidespawn/client/main.lua @@ -1,6 +1,6 @@ local QBCore = exports['qb-core']:GetCoreObject() local trackedVehicles = {} -local playerVehicles = {} +local spawnedVehicles = {} -- Funktion um zu prüfen ob Fahrzeugklasse erlaubt ist local function IsVehicleClassAllowed(vehicle) @@ -94,27 +94,21 @@ local function SetVehicleMods(vehicle, mods) end end --- Prüfe ob Fahrzeug einem Spieler gehört (vereinfachte Version) -local function DoesVehicleBelongToPlayer(plate) - -- Da der Export nicht existiert, prüfen wir über QB-Core - local Player = QBCore.Functions.GetPlayerData() - if not Player or not Player.citizenid then return false end - - -- Hier könntest du eine eigene Logik implementieren oder - -- einfach alle Fahrzeuge tracken die nicht NPC Fahrzeuge sind - local vehicle = GetVehicleByPlate(plate) - if vehicle then - -- Prüfe ob es ein NPC Fahrzeug ist - local driver = GetPedInVehicleSeat(vehicle, -1) - if driver and IsPedAPlayer(driver) then - return true - elseif not driver then - -- Kein Fahrer = wahrscheinlich Spielerfahrzeug - return true - 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 - - return false end -- Hauptloop für Fahrzeugtracking @@ -125,47 +119,77 @@ CreateThread(function() local playerPed = PlayerPedId() local playerCoords = GetEntityCoords(playerPed) - -- Finde alle Fahrzeuge in der Nähe + -- 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) local vehicleCoords = GetEntityCoords(vehicle) - local distance = #(playerCoords - vehicleCoords) - -- Prüfe ob Fahrzeug einem Spieler gehört - if DoesVehicleBelongToPlayer(plate) then + -- Prüfe ob es ein Spielerfahrzeug ist (nicht NPC) + local isPlayerVehicle = false + local driver = GetPedInVehicleSeat(vehicle, -1) + + if driver == 0 or IsPedAPlayer(driver) then + isPlayerVehicle = true + elseif trackedVehicles[plate] or spawnedVehicles[plate] then + -- Bereits getrackt = Spielerfahrzeug + isPlayerVehicle = true + end + + if isPlayerVehicle then + -- Verhindere Despawn + PreventVehicleDespawn(vehicle) + -- Speichere Fahrzeugdaten local vehicleData = { plate = plate, - model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)), + 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 = exports['LegacyFuel']:GetFuel(vehicle) or 100, -- Anpassen je nach Fuel System + 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 - -- Verhindere Despawn - SetEntityAsMissionEntity(vehicle, true, true) - SetVehicleHasBeenOwnedByPlayer(vehicle, true) - if Config.Debug then - print(string.format("Tracking vehicle: %s at distance: %.2f", plate, distance)) + local distance = #(playerCoords - vehicleCoords) + print(string.format("Tracking vehicle: %s (Model: %s) at distance: %.2f", plate, GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)), distance)) end 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("Vehicle no longer exists, removed from tracking: %s", plate)) + end + end + end end end) -- Spawne gespeicherte Fahrzeuge RegisterNetEvent('vehicle-persistence:client:spawnSavedVehicles', function(vehicles) + if Config.Debug then + print(string.format("Attempting to spawn %d saved vehicles", #vehicles)) + end + for _, vehicleData in pairs(vehicles) do local position = json.decode(vehicleData.position) local rotation = json.decode(vehicleData.rotation) @@ -173,45 +197,73 @@ RegisterNetEvent('vehicle-persistence:client:spawnSavedVehicles', function(vehic -- Prüfe ob Fahrzeug bereits existiert local existingVehicle = GetVehicleByPlate(vehicleData.plate) if not existingVehicle then - -- Spawne Fahrzeug - local modelHash = GetHashKey(vehicleData.model) - - RequestModel(modelHash) - while not HasModelLoaded(modelHash) do - Wait(100) + CreateThread(function() + local modelHash = vehicleData.model + if type(modelHash) == "string" then + modelHash = GetHashKey(modelHash) + end + + RequestModel(modelHash) + local timeout = 0 + while not HasModelLoaded(modelHash) and timeout < 50 do + Wait(100) + timeout = timeout + 1 + end + + if HasModelLoaded(modelHash) then + 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 + SetVehicleNumberPlateText(vehicle, vehicleData.plate) + SetVehicleEngineHealth(vehicle, vehicleData.engine_health or 1000.0) + SetVehicleBodyHealth(vehicle, vehicleData.body_health or 1000.0) + + -- Setze Fuel + if GetResourceState('LegacyFuel') == 'started' then + exports['LegacyFuel']:SetFuel(vehicle, vehicleData.fuel or 100) + elseif GetResourceState('ps-fuel') == 'started' then + exports['ps-fuel']:SetFuel(vehicle, vehicleData.fuel or 100) + end + + -- Setze Mods + if vehicleData.mods then + local mods = json.decode(vehicleData.mods) + SetVehicleMods(vehicle, mods) + end + + -- Verhindere Despawn + PreventVehicleDespawn(vehicle) + + spawnedVehicles[vehicleData.plate] = vehicle + trackedVehicles[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 + PreventVehicleDespawn(existingVehicle) + if Config.Debug then + print(string.format("Vehicle already exists, added to tracking: %s", vehicleData.plate)) end - - local vehicle = CreateVehicle(modelHash, position.x, position.y, position.z, rotation.z, true, false) - - if DoesEntityExist(vehicle) then - -- Setze Fahrzeugdaten - SetVehicleNumberPlateText(vehicle, vehicleData.plate) - SetVehicleEngineHealth(vehicle, vehicleData.engine_health) - SetVehicleBodyHealth(vehicle, vehicleData.body_health) - - -- Setze Fuel (anpassen je nach System) - if exports['LegacyFuel'] then - exports['LegacyFuel']:SetFuel(vehicle, vehicleData.fuel) - end - - -- Setze Mods - if vehicleData.mods then - local mods = json.decode(vehicleData.mods) - SetVehicleMods(vehicle, mods) - end - - -- Verhindere Despawn - SetEntityAsMissionEntity(vehicle, true, true) - SetVehicleHasBeenOwnedByPlayer(vehicle, true) - - trackedVehicles[vehicleData.plate] = vehicle - - if Config.Debug then - print(string.format("Spawned saved vehicle: %s", vehicleData.plate)) - end - end - - SetModelAsNoLongerNeeded(modelHash) end end end) @@ -229,35 +281,67 @@ end -- Lade Fahrzeuge beim Spawn RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() - Wait(5000) -- Warte bis alles geladen ist + Wait(10000) -- Längere Wartezeit bis alles geladen ist 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) - -- Entferne aus Tracking wenn Fahrzeug gespeichert wird - if data and data.plate and trackedVehicles[data.plate] then - trackedVehicles[data.plate] = nil + 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 Config.Debug then - print(string.format("Vehicle stored, removed from tracking: %s", data.plate)) + print(string.format("Vehicle stored in garage, removed from tracking: %s", data.plate)) end end end) RegisterNetEvent('jg-advancedgarages:client:vehicle-spawned', function(data) - -- Entferne aus Tracking da Fahrzeug jetzt über Garage gespawnt wurde - if data and data.plate and trackedVehicles[data.plate] then - trackedVehicles[data.plate] = nil + 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 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 + end + end + end +end) + -- Cleanup beim Disconnect AddEventHandler('onResourceStop', function(resourceName) if resourceName == GetCurrentResourceName() then - -- Cleanup Code hier falls nötig trackedVehicles = {} + spawnedVehicles = {} end end)