Update main.lua
This commit is contained in:
		
							parent
							
								
									40b090bfb8
								
							
						
					
					
						commit
						f2b9b3fc29
					
				
					 1 changed files with 163 additions and 79 deletions
				
			
		|  | @ -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) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nordi98
						Nordi98