forked from Simnation/Main
ed
This commit is contained in:
parent
2de2cef0c9
commit
5efa0fcf34
1 changed files with 35 additions and 117 deletions
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue