1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-08-06 17:59:00 +02:00
parent 2de2cef0c9
commit 5efa0fcf34

View file

@ -1,7 +1,5 @@
local QBCore = exports['qb-core']:GetCoreObject() local QBCore = exports['qb-core']:GetCoreObject()
local trackedVehicles = {} local playerDrivenVehicles = {} -- Nur Fahrzeuge die der Spieler gefahren hat
local spawnedVehicles = {}
local playerEnteredVehicles = {} -- Fahrzeuge in die sich der Spieler gesetzt hat
-- Funktion um zu prüfen ob Fahrzeugklasse erlaubt ist -- Funktion um zu prüfen ob Fahrzeugklasse erlaubt ist
local function IsVehicleClassAllowed(vehicle) local function IsVehicleClassAllowed(vehicle)
@ -95,24 +93,7 @@ local function SetVehicleMods(vehicle, mods)
end end
end end
-- Verhindere Despawn für alle getrackten Fahrzeuge -- Event Handler für Fahrzeug betreten (nur Fahrersitz)
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
CreateThread(function() CreateThread(function()
local lastVehicle = 0 local lastVehicle = 0
@ -122,14 +103,21 @@ CreateThread(function()
local playerPed = PlayerPedId() local playerPed = PlayerPedId()
local currentVehicle = GetVehiclePedIsIn(playerPed, false) 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 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) 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 if Config.Debug then
print(string.format("Player entered vehicle: %s", plate)) print(string.format("Player started driving vehicle: %s", plate))
end end
end end
end end
@ -138,21 +126,19 @@ CreateThread(function()
end end
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() CreateThread(function()
while true do while true do
Wait(Config.SaveInterval) Wait(Config.SaveInterval)
local playerPed = PlayerPedId() -- Tracke nur Fahrzeuge die der Spieler gefahren hat
local playerCoords = GetEntityCoords(playerPed) for plate, vehicle in pairs(playerDrivenVehicles) do
-- Tracke nur Fahrzeuge in die sich der Spieler gesetzt hat
for plate, vehicle in pairs(playerEnteredVehicles) do
if DoesEntityExist(vehicle) then if DoesEntityExist(vehicle) then
local vehicleCoords = GetEntityCoords(vehicle) local vehicleCoords = GetEntityCoords(vehicle)
-- Verhindere Despawn -- Verhindere Despawn
PreventVehicleDespawn(vehicle) SetEntityAsMissionEntity(vehicle, true, true)
SetVehicleHasBeenOwnedByPlayer(vehicle, true)
-- Speichere Fahrzeugdaten -- Speichere Fahrzeugdaten
local vehicleData = { local vehicleData = {
@ -162,7 +148,7 @@ CreateThread(function()
rotation = {x = 0.0, y = 0.0, z = GetEntityHeading(vehicle)}, rotation = {x = 0.0, y = 0.0, z = GetEntityHeading(vehicle)},
engineHealth = GetVehicleEngineHealth(vehicle), engineHealth = GetVehicleEngineHealth(vehicle),
bodyHealth = GetVehicleBodyHealth(vehicle), bodyHealth = GetVehicleBodyHealth(vehicle),
fuel = 100, -- Standardwert, anpassen je nach Fuel System fuel = 100,
mods = GetVehicleMods(vehicle) mods = GetVehicleMods(vehicle)
} }
@ -174,27 +160,15 @@ CreateThread(function()
end end
TriggerServerEvent('vehicle-persistence:server:saveVehiclePosition', vehicleData) TriggerServerEvent('vehicle-persistence:server:saveVehiclePosition', vehicleData)
trackedVehicles[plate] = vehicle
if Config.Debug then if Config.Debug then
local distance = #(playerCoords - vehicleCoords) print(string.format("Saving player driven vehicle: %s", plate))
print(string.format("Tracking player vehicle: %s at distance: %.2f", plate, distance))
end end
else else
-- Fahrzeug existiert nicht mehr, entferne aus Liste -- Fahrzeug existiert nicht mehr, entferne aus Liste
playerEnteredVehicles[plate] = nil playerDrivenVehicles[plate] = nil
if Config.Debug then if Config.Debug then
print(string.format("Player vehicle no longer exists: %s", plate)) print(string.format("Player driven 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))
end end
end 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) local vehicle = CreateVehicle(modelHash, position.x, position.y, position.z, rotation.z, true, false)
if DoesEntityExist(vehicle) then if DoesEntityExist(vehicle) then
-- Warte bis Fahrzeug vollständig geladen ist
Wait(500) Wait(500)
-- Setze Fahrzeugdaten -- Setze Fahrzeugdaten
@ -253,36 +226,24 @@ RegisterNetEvent('vehicle-persistence:client:spawnSavedVehicles', function(vehic
end end
-- Verhindere Despawn -- Verhindere Despawn
PreventVehicleDespawn(vehicle) SetEntityAsMissionEntity(vehicle, true, true)
SetVehicleHasBeenOwnedByPlayer(vehicle, true)
spawnedVehicles[vehicleData.plate] = vehicle playerDrivenVehicles[vehicleData.plate] = vehicle
trackedVehicles[vehicleData.plate] = vehicle
playerEnteredVehicles[vehicleData.plate] = vehicle -- Markiere als Spielerfahrzeug
if Config.Debug then if Config.Debug then
print(string.format("Successfully spawned saved vehicle: %s", vehicleData.plate)) print(string.format("Successfully spawned saved vehicle: %s", vehicleData.plate))
end end
else
if Config.Debug then
print(string.format("Failed to create vehicle: %s", vehicleData.plate))
end
end end
SetModelAsNoLongerNeeded(modelHash) SetModelAsNoLongerNeeded(modelHash)
else
if Config.Debug then
print(string.format("Failed to load model for vehicle: %s", vehicleData.plate))
end
end end
end) end)
else else
-- Fahrzeug existiert bereits, füge zu Tracking hinzu -- Fahrzeug existiert bereits, füge zu Liste hinzu
trackedVehicles[vehicleData.plate] = existingVehicle playerDrivenVehicles[vehicleData.plate] = existingVehicle
playerEnteredVehicles[vehicleData.plate] = existingVehicle SetEntityAsMissionEntity(existingVehicle, true, true)
PreventVehicleDespawn(existingVehicle) SetVehicleHasBeenOwnedByPlayer(existingVehicle, true)
if Config.Debug then
print(string.format("Vehicle already exists, added to tracking: %s", vehicleData.plate))
end
end end
end end
end) end)
@ -300,30 +261,14 @@ end
-- Lade Fahrzeuge beim Spawn -- Lade Fahrzeuge beim Spawn
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
Wait(10000) -- Längere Wartezeit bis alles geladen ist Wait(10000)
TriggerServerEvent('vehicle-persistence:server:loadVehicles') TriggerServerEvent('vehicle-persistence:server:loadVehicles')
end) 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 -- jg-advanced-garage Events
RegisterNetEvent('jg-advancedgarages:client:vehicle-stored', function(data) RegisterNetEvent('jg-advancedgarages:client:vehicle-stored', function(data)
if data and data.plate then if data and data.plate and playerDrivenVehicles[data.plate] then
if trackedVehicles[data.plate] then playerDrivenVehicles[data.plate] = nil
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 Config.Debug then if Config.Debug then
print(string.format("Vehicle stored in garage, removed from tracking: %s", data.plate)) print(string.format("Vehicle stored in garage, removed from tracking: %s", data.plate))
end end
@ -331,44 +276,17 @@ RegisterNetEvent('jg-advancedgarages:client:vehicle-stored', function(data)
end) end)
RegisterNetEvent('jg-advancedgarages:client:vehicle-spawned', function(data) RegisterNetEvent('jg-advancedgarages:client:vehicle-spawned', function(data)
if data and data.plate then if data and data.plate and playerDrivenVehicles[data.plate] then
if trackedVehicles[data.plate] then playerDrivenVehicles[data.plate] = nil
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 Config.Debug then if Config.Debug then
print(string.format("Vehicle spawned from garage, removed from tracking: %s", data.plate)) print(string.format("Vehicle spawned from garage, removed from tracking: %s", data.plate))
end end
end 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 -- Cleanup beim Disconnect
AddEventHandler('onResourceStop', function(resourceName) AddEventHandler('onResourceStop', function(resourceName)
if resourceName == GetCurrentResourceName() then if resourceName == GetCurrentResourceName() then
trackedVehicles = {} playerDrivenVehicles = {}
spawnedVehicles = {}
playerEnteredVehicles = {}
end end
end) end)