From 002d47a43f12d709514f0cc789bcd2136761df88 Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Sat, 26 Jul 2025 22:43:27 +0200 Subject: [PATCH] Update server.lua --- resources/[standalone]/nordi_tdm/server.lua | 163 ++++++++++++++++++-- 1 file changed, 146 insertions(+), 17 deletions(-) diff --git a/resources/[standalone]/nordi_tdm/server.lua b/resources/[standalone]/nordi_tdm/server.lua index e404ab179..ee9f605aa 100644 --- a/resources/[standalone]/nordi_tdm/server.lua +++ b/resources/[standalone]/nordi_tdm/server.lua @@ -14,11 +14,15 @@ RegisterNetEvent('tdm:createGame', function(gameName, fieldId, gameType, passwor local src = source local Player = QBCore.Functions.GetPlayer(src) - if not Player then return end + if not Player then + debugPrint("Spielerstellung fehlgeschlagen - Spieler nicht gefunden: " .. src) + return + end -- Prüfen ob Spielfeld bereits belegt for gameId, gameData in pairs(activeGames) do if gameData.fieldId == fieldId then + debugPrint("Spielerstellung abgelehnt - Feld bereits belegt: " .. fieldId) TriggerClientEvent('QBCore:Notify', src, 'Dieses Spielfeld ist bereits belegt!', 'error') return end @@ -50,11 +54,12 @@ RegisterNetEvent('tdm:createGame', function(gameName, fieldId, gameType, passwor TriggerClientEvent('QBCore:Notify', src, 'Dein ' .. typeText .. ' Spiel "' .. gameName .. '" wurde erstellt!', 'success') updateGamesListForAll() - debugPrint("Spiel erstellt: " .. gameId .. " von " .. Player.PlayerData.name) + debugPrint("Spiel erstellt: " .. gameId .. " von " .. Player.PlayerData.name .. " (Feld: " .. fieldId .. ")") end) RegisterNetEvent('tdm:requestGamesList', function() local src = source + debugPrint("Spiele-Liste angefordert von: " .. src) TriggerClientEvent('tdm:updateGamesList', src, activeGames) end) @@ -62,13 +67,19 @@ RegisterNetEvent('tdm:requestJoinGame', function(gameId, password) local src = source local Player = QBCore.Functions.GetPlayer(src) - if not Player or not activeGames[gameId] then return end + if not Player or not activeGames[gameId] then + debugPrint("Spielbeitritt fehlgeschlagen - Spieler oder Spiel nicht gefunden: " .. src .. ", " .. gameId) + return + end local game = activeGames[gameId] local playerName = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + debugPrint("Beitrittsanfrage von " .. playerName .. " (ID: " .. src .. ") für Spiel " .. gameId) + -- Passwort prüfen falls vorhanden if game.hasPassword and game.password ~= password then + debugPrint("Beitritt abgelehnt - Falsches Passwort") TriggerClientEvent('QBCore:Notify', src, 'Falsches Passwort!', 'error') return end @@ -76,12 +87,14 @@ RegisterNetEvent('tdm:requestJoinGame', function(gameId, password) -- Spieler bereits im Spiel? for _, playerId in ipairs(game.team1) do if playerId == src then + debugPrint("Beitritt abgelehnt - Spieler bereits in Team 1") TriggerClientEvent('QBCore:Notify', src, 'Du bist bereits in diesem Spiel!', 'error') return end end for _, playerId in ipairs(game.team2) do if playerId == src then + debugPrint("Beitritt abgelehnt - Spieler bereits in Team 2") TriggerClientEvent('QBCore:Notify', src, 'Du bist bereits in diesem Spiel!', 'error') return end @@ -92,6 +105,7 @@ RegisterNetEvent('tdm:requestJoinGame', function(gameId, password) local maxPlayers = Config.gameFields[game.fieldId].maxPlayers if currentPlayers >= maxPlayers then + debugPrint("Beitritt abgelehnt - Spiel ist voll") TriggerClientEvent('QBCore:Notify', src, 'Spiel ist voll!', 'error') return end @@ -100,6 +114,7 @@ RegisterNetEvent('tdm:requestJoinGame', function(gameId, password) if game.gameType == 'private' then local AdminPlayer = QBCore.Functions.GetPlayer(game.admin) if not AdminPlayer then + debugPrint("Beitritt abgelehnt - Admin nicht online") TriggerClientEvent('QBCore:Notify', src, 'Der Spiel-Admin ist nicht online!', 'error') return end @@ -107,9 +122,11 @@ RegisterNetEvent('tdm:requestJoinGame', function(gameId, password) -- Join Logic basierend auf Spiel Typ if game.gameType == 'public' then + debugPrint("Öffentliches Spiel - Direkter Beitritt") joinPlayerToGame(src, gameId) TriggerClientEvent('QBCore:Notify', src, 'Du bist dem öffentlichen Spiel beigetreten!', 'success') else + debugPrint("Privates Spiel - Sende Anfrage an Admin") TriggerClientEvent('tdm:joinRequest', game.admin, gameId, playerName, src) TriggerClientEvent('QBCore:Notify', src, 'Join-Anfrage gesendet an ' .. game.adminName, 'info') end @@ -119,18 +136,24 @@ RegisterNetEvent('tdm:approveJoinRequest', function(gameId, playerId, approved) local src = source local game = activeGames[gameId] - if not game or game.admin ~= src then return end + if not game or game.admin ~= src then + debugPrint("Join-Anfrage Bearbeitung fehlgeschlagen - Ungültiges Spiel oder nicht Admin") + return + end if approved then + debugPrint("Join-Anfrage genehmigt für Spieler " .. playerId .. " in Spiel " .. gameId) joinPlayerToGame(playerId, gameId) TriggerClientEvent('tdm:joinRequestResult', playerId, true, game.name) else + debugPrint("Join-Anfrage abgelehnt für Spieler " .. playerId .. " in Spiel " .. gameId) TriggerClientEvent('tdm:joinRequestResult', playerId, false, game.name) end end) RegisterNetEvent('tdm:leaveGame', function() local src = source + debugPrint("Spieler " .. src .. " möchte alle Spiele verlassen") for gameId, game in pairs(activeGames) do removePlayerFromGame(src, gameId) @@ -149,6 +172,8 @@ RegisterNetEvent('tdm:playerWasHit', function(gameId, victimTeam, attackerId) local game = activeGames[gameId] + debugPrint("Hit registriert - Opfer: " .. victim .. " (Team: " .. victimTeam .. "), Angreifer: " .. (attackerId or "Unbekannt")) + -- Spieler Stats initialisieren falls nicht vorhanden if not game.playerStats then game.playerStats = {} @@ -168,16 +193,18 @@ RegisterNetEvent('tdm:playerWasHit', function(gameId, victimTeam, attackerId) if attackerId then game.playerStats[attackerId].hits = (game.playerStats[attackerId].hits or 0) + 1 TriggerClientEvent('tdm:hitRegistered', attackerId) - debugPrint("Treffer von " .. attackerId .. " gegen " .. victim) + debugPrint("Treffer von " .. attackerId .. " gegen " .. victim .. " registriert") else - debugPrint("Treffer gegen " .. victim .. " von unbekanntem Angreifer") + debugPrint("Treffer gegen " .. victim .. " von unbekanntem Angreifer registriert") end -- Team Score erhöhen if victimTeam == 'team1' then game.score.team2 = game.score.team2 + 1 + debugPrint("Punkt für Team 2 - Neuer Score: " .. game.score.team2) else game.score.team1 = game.score.team1 + 1 + debugPrint("Punkt für Team 1 - Neuer Score: " .. game.score.team1) end TriggerClientEvent('tdm:deathRegistered', victim) @@ -188,12 +215,14 @@ RegisterNetEvent('tdm:playerWasHit', function(gameId, victimTeam, attackerId) -- Spiel beenden prüfen if game.score.team1 >= game.maxHits or game.score.team2 >= game.maxHits then local winnerTeam = game.score.team1 >= game.maxHits and 'team1' or 'team2' + debugPrint("Max Punkte erreicht - Beende Spiel. Gewinner: " .. winnerTeam) endGame(gameId, winnerTeam) end end) RegisterNetEvent('tdm:playerDied', function(gameId) local src = source + debugPrint("Spieler " .. src .. " ist gestorben in Spiel " .. gameId) removePlayerFromGame(src, gameId) end) @@ -201,7 +230,10 @@ RegisterNetEvent('tdm:requestScoreUpdate', function(gameId) local src = source if activeGames[gameId] then + debugPrint("Score-Update angefordert von " .. src .. " für Spiel " .. gameId) updateScoreForGame(gameId) + else + debugPrint("Score-Update fehlgeschlagen - Spiel " .. gameId .. " nicht gefunden") end end) @@ -209,18 +241,21 @@ RegisterNetEvent('tdm:debugPlayerStats', function(gameId) local src = source if activeGames[gameId] and activeGames[gameId].playerStats and activeGames[gameId].playerStats[src] then local stats = activeGames[gameId].playerStats[src] - TriggerClientEvent('QBCore:Notify', src, 'Server Stats - Hits: ' .. (stats.hits or 0) .. ', Deaths: ' .. (stats.deaths or 0), 'info') debugPrint("Stats für Spieler " .. src .. ": Hits=" .. (stats.hits or 0) .. ", Deaths=" .. (stats.deaths or 0)) + TriggerClientEvent('QBCore:Notify', src, 'Server Stats - Hits: ' .. (stats.hits or 0) .. ', Deaths: ' .. (stats.deaths or 0), 'info') else + debugPrint("Keine Stats gefunden für Spieler " .. src .. " in Spiel " .. gameId) TriggerClientEvent('QBCore:Notify', src, 'Keine Stats gefunden!', 'error') - debugPrint("Keine Stats für Spieler " .. src .. " in Spiel " .. gameId) end end) -- Funktionen function joinPlayerToGame(playerId, gameId) local game = activeGames[gameId] - if not game then return end + if not game then + debugPrint("Spielbeitritt fehlgeschlagen - Spiel nicht gefunden: " .. gameId) + return + end -- Team mit weniger Spielern wählen local team = #game.team1 <= #game.team2 and 'team1' or 'team2' @@ -238,6 +273,7 @@ function joinPlayerToGame(playerId, gameId) if #game.team1 + #game.team2 >= 2 and game.status == 'waiting' then game.status = 'active' game.startTime = os.time() + debugPrint("Spiel " .. gameId .. " gestartet - Mindestens 2 Spieler erreicht") -- Game Timer starten startGameTimer(gameId) @@ -255,24 +291,36 @@ function removePlayerFromGame(playerId, gameId) if not game then return end -- Spieler aus Teams entfernen + local removed = false + for i, id in ipairs(game.team1) do if id == playerId then table.remove(game.team1, i) debugPrint("Spieler " .. playerId .. " aus Team 1 entfernt") + removed = true break end end - for i, id in ipairs(game.team2) do - if id == playerId then - table.remove(game.team2, i) - debugPrint("Spieler " .. playerId .. " aus Team 2 entfernt") - break + if not removed then + for i, id in ipairs(game.team2) do + if id == playerId then + table.remove(game.team2, i) + debugPrint("Spieler " .. playerId .. " aus Team 2 entfernt") + removed = true + break + end end end + if not removed then + debugPrint("Spieler " .. playerId .. " nicht in Spiel " .. gameId .. " gefunden") + return + end + -- Wenn Admin das Spiel verlässt, Spiel beenden if game.admin == playerId then + debugPrint("Admin hat das Spiel verlassen - Beende Spiel " .. gameId) endGame(gameId, nil, 'Admin hat das Spiel verlassen') return end @@ -283,7 +331,10 @@ end function endGame(gameId, winnerTeam, reason) local game = activeGames[gameId] - if not game then return end + if not game then + debugPrint("Spielende fehlgeschlagen - Spiel nicht gefunden: " .. gameId) + return + end game.status = 'finished' @@ -297,6 +348,7 @@ function endGame(gameId, winnerTeam, reason) -- Game End Event an alle Spieler for _, playerId in ipairs(allPlayers) do + debugPrint("Sende Spielende-Event an Spieler " .. playerId) TriggerClientEvent('tdm:gameEnded', playerId, winnerTeam, game.score.team1, game.score.team2) end @@ -304,6 +356,7 @@ function endGame(gameId, winnerTeam, reason) SetTimeout(10000, function() activeGames[gameId] = nil updateGamesListForAll() + debugPrint("Spiel " .. gameId .. " aus der Liste entfernt") end) if reason then @@ -337,6 +390,7 @@ function startGameTimer(gameId) if game and game.status == 'active' then local winnerTeam = game.score.team1 > game.score.team2 and 'team1' or game.score.team2 > game.score.team1 and 'team2' or nil + debugPrint("Spielzeit abgelaufen - Beende Spiel " .. gameId) endGame(gameId, winnerTeam, 'Zeit abgelaufen') end end) @@ -349,6 +403,7 @@ function checkGameEnd(gameId) local totalPlayers = #game.team1 + #game.team2 if totalPlayers < 2 and game.status == 'active' then + debugPrint("Zu wenig Spieler - Beende Spiel " .. gameId) endGame(gameId, nil, 'Zu wenig Spieler') elseif totalPlayers == 0 then activeGames[gameId] = nil @@ -359,16 +414,23 @@ end function updateScoreForGame(gameId) local game = activeGames[gameId] - if not game then return end + if not game then + debugPrint("Score-Update fehlgeschlagen - Spiel nicht gefunden: " .. gameId) + return + end debugPrint("Score Update für Spiel " .. gameId .. ": Team1=" .. game.score.team1 .. ", Team2=" .. game.score.team2) + for _, playerId in ipairs(game.team1) do + local playerStats = game.playerStats[playerId] or {hits = 0, deaths = 0} + TriggerClientEvent('tdm:updateScore', playerId, game.score.team1, for _, playerId in ipairs(game.team1) do local playerStats = game.playerStats[playerId] or {hits = 0, deaths = 0} TriggerClientEvent('tdm:updateScore', playerId, game.score.team1, game.score.team2, { hits = playerStats.hits or 0, deaths = playerStats.deaths or 0 }) + debugPrint("Score-Update an Team 1 Spieler " .. playerId .. " gesendet") end for _, playerId in ipairs(game.team2) do @@ -377,11 +439,14 @@ function updateScoreForGame(gameId) hits = playerStats.hits or 0, deaths = playerStats.deaths or 0 }) + debugPrint("Score-Update an Team 2 Spieler " .. playerId .. " gesendet") end end function updateGamesListForAll() local players = QBCore.Functions.GetPlayers() + debugPrint("Aktualisiere Spieleliste für alle Spieler - Aktive Spiele: " .. #activeGames) + for _, playerId in pairs(players) do TriggerClientEvent('tdm:updateGamesList', playerId, activeGames) end @@ -403,7 +468,7 @@ AddEventHandler('onResourceStart', function(resourceName) if GetCurrentResourceName() == resourceName then activeGames = {} gameIdCounter = 1 - debugPrint("TeamDeathmatch System gestartet!") + debugPrint("TeamDeathmatch System gestartet! Version 1.0.1") end end) @@ -420,6 +485,7 @@ AddEventHandler('onResourceStop', function(resourceName) end for _, playerId in ipairs(allPlayers) do + debugPrint("Resource wird gestoppt - Entferne Spieler " .. playerId .. " aus Spiel " .. gameId) TriggerClientEvent('tdm:leaveGame', playerId) end end @@ -428,3 +494,66 @@ AddEventHandler('onResourceStop', function(resourceName) debugPrint("TeamDeathmatch System gestoppt!") end end) + +-- Neuer Debug-Command für Server +RegisterCommand('tdmserverdebug', function(source, args) + local src = source + if src > 0 then -- Spieler + local Player = QBCore.Functions.GetPlayer(src) + if not Player or not Player.PlayerData.job or Player.PlayerData.job.name ~= 'admin' then + TriggerClientEvent('QBCore:Notify', src, 'Du hast keine Berechtigung!', 'error') + return + end + end + + debugPrint("=== TDM SERVER DEBUG ===") + debugPrint("Aktive Spiele: " .. #activeGames) + + for gameId, game in pairs(activeGames) do + debugPrint("Spiel: " .. gameId .. " - " .. game.name) + debugPrint(" Status: " .. game.status) + debugPrint(" Feld: " .. game.fieldId) + debugPrint(" Team 1: " .. #game.team1 .. " Spieler, Score: " .. game.score.team1) + debugPrint(" Team 2: " .. #game.team2 .. " Spieler, Score: " .. game.score.team2) + + if src > 0 then + TriggerClientEvent('QBCore:Notify', src, 'Debug-Info in Server-Konsole', 'info') + end + end +end, true) + +-- Neuer Command zum Zurücksetzen aller Spiele (nur für Admins) +RegisterCommand('tdmreset', function(source, args) + local src = source + if src > 0 then -- Spieler + local Player = QBCore.Functions.GetPlayer(src) + if not Player or not Player.PlayerData.job or Player.PlayerData.job.name ~= 'admin' then + TriggerClientEvent('QBCore:Notify', src, 'Du hast keine Berechtigung!', 'error') + return + end + end + + -- Alle Spieler aus TDM entfernen + for gameId, game in pairs(activeGames) do + local allPlayers = {} + for _, playerId in ipairs(game.team1) do + table.insert(allPlayers, playerId) + end + for _, playerId in ipairs(game.team2) do + table.insert(allPlayers, playerId) + end + + for _, playerId in ipairs(allPlayers) do + TriggerClientEvent('tdm:leaveGame', playerId) + end + end + + activeGames = {} + gameIdCounter = 1 + + debugPrint("TeamDeathmatch System zurückgesetzt!") + + if src > 0 then + TriggerClientEvent('QBCore:Notify', src, 'TDM System zurückgesetzt!', 'success') + end +end, true)