diff --git a/resources/[qb]/Duck_relogextra/client.lua b/resources/[qb]/Duck_relogextra/client.lua index aa28c631d..5d0186868 100644 --- a/resources/[qb]/Duck_relogextra/client.lua +++ b/resources/[qb]/Duck_relogextra/client.lua @@ -1,38 +1,131 @@ local QBCore = exports['qb-core']:GetCoreObject() local savedLocation = nil + +local function DebugPrint(msg) + print("^3[RELOG-CLIENT] ^7" .. msg) +end + + RegisterCommand("relog", function() local ped = PlayerPedId() local coords = GetEntityCoords(ped) local heading = GetEntityHeading(ped) - local cid = QBCore.Functions.GetPlayerData().citizenid - - -- Speicher Ort vor Relog - TriggerServerEvent("qb-relogsave:server:saveLocation", cid, { + local playerData = QBCore.Functions.GetPlayerData() + + if not playerData or not playerData.citizenid then + QBCore.Functions.Notify("Fehler beim Abrufen der Spielerdaten", "error") + DebugPrint("Fehler: Keine Spielerdaten verfügbar") + return + end + + local cid = playerData.citizenid + DebugPrint("Relog gestartet für CID: " .. cid) + + + if IsPedInAnyVehicle(ped, false) then + QBCore.Functions.Notify("Du kannst nicht im Fahrzeug relogen", "error") + return + end + + + local posData = { x = coords.x, y = coords.y, z = coords.z - }, heading) - - TriggerEvent("qb-multicharacter:client:chooseChar") + } + + DebugPrint("Position wird gespeichert: X=" .. posData.x .. ", Y=" .. posData.y .. ", Z=" .. posData.z) + TriggerServerEvent("qb-relogsave:server:saveLocation", cid, posData, heading) + + + Wait(500) + + + DebugPrint("Trigger um-multicharacter:client:chooseChar") + TriggerEvent("um-multicharacter:client:chooseChar") end, false) + RegisterNetEvent("qb-relogsave:client:restoreLocation", function(pos, heading) + if not pos or not pos.x or not pos.y or not pos.z then + DebugPrint("Ungültige Position empfangen") + return + end + + DebugPrint("Position empfangen: X=" .. pos.x .. ", Y=" .. pos.y .. ", Z=" .. pos.z) savedLocation = { pos = pos, heading = heading } end) -RegisterNetEvent("qb-spawn:client:spawned", function() + +local function CheckEvents() + + RegisterNetEvent("um-multicharacter:client:spawned", function() + DebugPrint("Event 'um-multicharacter:client:spawned' ausgelöst") + RestorePosition() + end) + + + RegisterNetEvent("um-multicharacter:client:playerSpawned", function() + DebugPrint("Event 'um-multicharacter:client:playerSpawned' ausgelöst") + RestorePosition() + end) + + RegisterNetEvent("QBCore:Client:OnPlayerLoaded", function() + DebugPrint("Event 'QBCore:Client:OnPlayerLoaded' ausgelöst") + Wait(1000) + RestorePosition() + end) + + + RegisterNetEvent("playerSpawned", function() + DebugPrint("Event 'playerSpawned' ausgelöst") + RestorePosition() + end) +end + + +function RestorePosition() if savedLocation then + DebugPrint("Versuche Position wiederherzustellen...") + + + Wait(1000) DoScreenFadeOut(500) - Wait(500) - SetEntityCoords(PlayerPedId(), savedLocation.pos.x, savedLocation.pos.y, savedLocation.pos.z) - SetEntityHeading(PlayerPedId(), savedLocation.heading) + Wait(600) + + + if savedLocation.pos and savedLocation.pos.x and savedLocation.pos.y and savedLocation.pos.z then + DebugPrint("Teleportiere zu X=" .. savedLocation.pos.x .. ", Y=" .. savedLocation.pos.y .. ", Z=" .. savedLocation.pos.z) + SetEntityCoords(PlayerPedId(), savedLocation.pos.x, savedLocation.pos.y, savedLocation.pos.z) + SetEntityHeading(PlayerPedId(), savedLocation.heading) + + + local ground, groundZ = GetGroundZFor_3dCoord(savedLocation.pos.x, savedLocation.pos.y, savedLocation.pos.z) + if ground then + SetEntityCoordsNoOffset(PlayerPedId(), savedLocation.pos.x, savedLocation.pos.y, groundZ + 1.0, false, false, false) + end + else + DebugPrint("Fehler: Ungültige Position beim Wiederherstellen") + end + Wait(500) DoScreenFadeIn(500) - + + savedLocation = nil + DebugPrint("Position wiederhergestellt und gelöscht") + else + DebugPrint("Keine gespeicherte Position zum Wiederherstellen") end +end + + +Citizen.CreateThread(function() + DebugPrint("Relog-System initialisiert") + CheckEvents() end) + diff --git a/resources/[qb]/Duck_relogextra/server.lua b/resources/[qb]/Duck_relogextra/server.lua index 04c578ed4..a16f42e78 100644 --- a/resources/[qb]/Duck_relogextra/server.lua +++ b/resources/[qb]/Duck_relogextra/server.lua @@ -1,34 +1,99 @@ local savedLocations = {} local QBCore = exports['qb-core']:GetCoreObject() + +local function DebugPrint(msg) + print("^2[RELOG-DEBUG] ^7" .. msg) +end + + RegisterNetEvent("qb-relogsave:server:saveLocation", function(cid, coords, heading) - if not cid or not coords then return end + local src = source + local playerName = GetPlayerName(src) or "Unbekannt" + + if not cid or not coords then + DebugPrint("Fehler: Ungültige Daten von " .. playerName .. " (ID: " .. src .. ")") + return + end savedLocations[cid] = { pos = coords, heading = heading, - timestamp = os.time() + timestamp = os.time(), + playerName = playerName } - print("Position für " .. cid .. " gespeichert: " .. json.encode(coords)) + DebugPrint("Position für " .. playerName .. " (CID: " .. cid .. ") gespeichert: X=" .. + coords.x .. ", Y=" .. coords.y .. ", Z=" .. coords.z) end) -AddEventHandler('QBCore:Server:PlayerLoaded', function(Player) - if not Player or not Player.PlayerData then return end + +RegisterNetEvent('QBCore:Server:OnPlayerLoaded', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then + DebugPrint("Fehler: Spieler nicht gefunden (ID: " .. src .. ")") + return + end local cid = Player.PlayerData.citizenid + DebugPrint("Spieler geladen: " .. Player.PlayerData.name .. " (CID: " .. cid .. ")") if savedLocations[cid] then local pos = savedLocations[cid].pos local heading = savedLocations[cid].heading + local timestamp = savedLocations[cid].timestamp + local timeAgo = os.time() - timestamp + + DebugPrint("Gespeicherte Position gefunden für " .. cid .. " (vor " .. timeAgo .. " Sekunden)") + if pos and pos.x and pos.y and pos.z then - TriggerClientEvent("qb-relogsave:client:restoreLocation", Player.PlayerData.source, pos, heading) - print("Position für " .. cid .. " wiederhergestellt") + DebugPrint("Position wird wiederhergestellt: X=" .. pos.x .. ", Y=" .. pos.y .. ", Z=" .. pos.z) + TriggerClientEvent("qb-relogsave:client:restoreLocation", src, pos, heading) else - print("Ungültige Position für " .. cid .. " gefunden") + DebugPrint("Ungültige Position für " .. cid) end + + savedLocations[cid] = nil + else + DebugPrint("Keine gespeicherte Position für " .. cid .. " gefunden") + end +end) + + +RegisterNetEvent('um-multicharacter:server:CharacterLoaded', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then return end + + local cid = Player.PlayerData.citizenid + DebugPrint("um-multicharacter: Charakter geladen für " .. cid) + + if savedLocations[cid] then + TriggerClientEvent("qb-relogsave:client:restoreLocation", src, savedLocations[cid].pos, savedLocations[cid].heading) savedLocations[cid] = nil end end) + + +QBCore.Commands.Add('relogpositions', 'Zeigt alle gespeicherten Relog-Positionen', {}, false, function(source) + local count = 0 + for cid, data in pairs(savedLocations) do + count = count + 1 + local timeAgo = os.time() - (data.timestamp or 0) + TriggerClientEvent('QBCore:Notify', source, cid .. ": " .. + "X=" .. math.floor(data.pos.x) .. + " Y=" .. math.floor(data.pos.y) .. + " Z=" .. math.floor(data.pos.z) .. + " (vor " .. timeAgo .. "s)") + end + + if count == 0 then + TriggerClientEvent('QBCore:Notify', source, "Keine gespeicherten Positionen") + end +end, 'admin') +