From 2834b543f44dec318a87e2f9ba29bd1655e49704 Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Mon, 28 Jul 2025 00:43:39 +0200 Subject: [PATCH] Update client.lua --- resources/[standalone]/nordi_tdm/client.lua | 177 +++++++------------- 1 file changed, 65 insertions(+), 112 deletions(-) diff --git a/resources/[standalone]/nordi_tdm/client.lua b/resources/[standalone]/nordi_tdm/client.lua index 195f6cc11..f06467bc0 100644 --- a/resources/[standalone]/nordi_tdm/client.lua +++ b/resources/[standalone]/nordi_tdm/client.lua @@ -9,9 +9,6 @@ local teamZoneBlips = {} local isHit = false local activeGames = {} local spawnedNPCs = {} -local lastDamager = nil -local lastDamageTime = 0 -local lastDamageWeapon = 0 -- Spieler Statistiken local playerStats = { @@ -25,31 +22,14 @@ local function debugPrint(message) print("^2[TDM DEBUG]^7 " .. message) end --- Helper function to dump tables for debugging -function dumpTable(table, indent) - if not indent then indent = 0 end - for k, v in pairs(table) do - local formatting = string.rep(" ", indent) .. k .. ": " - if type(v) == "table" then - print(formatting) - dumpTable(v, indent+1) - else - print(formatting .. tostring(v)) - end - end -end - -- Funktion zum Prüfen, ob eine Waffe eine Airsoft-Waffe ist function isAirsoftWeapon(weaponHash) return Config.airsoftWeapons[weaponHash] or Config.treatAllWeaponsAsAirsoft end --- Enhanced function to check if a player is in ragdoll state +-- Funktion zum Prüfen, ob der Spieler im Ragdoll-Zustand ist function isPedInRagdoll(ped) - return IsPedRagdoll(ped) or - IsPedFalling(ped) or - IsPedDiving(ped) or - (not IsPedStill(ped) and IsPedOnFoot(ped) and not IsPedWalking(ped) and not IsPedRunning(ped) and not IsPedSprinting(ped)) + return IsPedRagdoll(ped) or IsPedFalling(ped) or IsPedDiving(ped) end -- Events @@ -100,9 +80,6 @@ RegisterNetEvent('tdm:leaveGame', function() currentGameId = nil currentField = nil isHit = false - lastDamager = nil - lastDamageTime = 0 - lastDamageWeapon = 0 -- Sichere Rückkehr zur Lobby local lobbyPos = nil @@ -265,28 +242,15 @@ RegisterNetEvent('tdm:playerHit', function() end) RegisterNetEvent('tdm:updateScore', function(team1Score, team2Score, gameStats) - -- Enhanced debug output + -- Debug-Ausgabe debugPrint("Score Update empfangen: Team1=" .. team1Score .. ", Team2=" .. team2Score) if gameStats then - debugPrint("GameStats received: ") - dumpTable(gameStats) - else - debugPrint("WARNING: No gameStats received from server!") + debugPrint("GameStats: Hits=" .. (gameStats.hits or "nil") .. ", Deaths=" .. (gameStats.deaths or "nil")) end - -- More robust handling of stats - local myHits = 0 - local myDeaths = 0 - - if gameStats and type(gameStats) == "table" then - myHits = gameStats.hits or 0 - myDeaths = gameStats.deaths or 0 - debugPrint("Using server stats: Hits=" .. myHits .. ", Deaths=" .. myDeaths) - else - myHits = playerStats.hits - myDeaths = playerStats.deaths - debugPrint("Using local stats: Hits=" .. myHits .. ", Deaths=" .. myDeaths) - end + -- Verwende gameStats falls verfügbar, sonst lokale Stats + local myHits = gameStats and gameStats.hits or playerStats.hits + local myDeaths = gameStats and gameStats.deaths or playerStats.deaths local displayText = string.format( '[Team 1: %d] VS [Team 2: %d] | Deine Treffer: %d | Tode: %d', @@ -694,12 +658,6 @@ CreateThread(function() -- Versuche die Waffe zu ermitteln weaponHash = GetSelectedPedWeapon(playerPed) debugPrint("Angreifer identifiziert: " .. damagerPlayer .. " mit Waffe: " .. weaponHash) - - -- Update last damager info - lastDamager = damagerPlayer - lastDamageTime = GetGameTimer() - lastDamageWeapon = weaponHash - break end end @@ -738,7 +696,7 @@ CreateThread(function() end end) --- Enhanced damage detection for ragdoll kills +-- Zusätzlicher Event-Handler für zuverlässigere Treffer-Erkennung AddEventHandler('gameEventTriggered', function(name, args) if name == "CEventNetworkEntityDamage" then local victimId = args[1] @@ -760,14 +718,6 @@ AddEventHandler('gameEventTriggered', function(name, args) debugPrint("Schaden-Event erkannt: Angreifer=" .. (attackerServerId or "NPC/Unbekannt") .. ", Waffe=" .. weaponHash) - -- Update last damager info - if attackerServerId then - lastDamager = attackerServerId - lastDamageTime = GetGameTimer() - lastDamageWeapon = weaponHash - debugPrint("Last damager updated to " .. attackerServerId .. " with weapon " .. weaponHash) - end - -- Prüfe, ob es eine Airsoft-Waffe ist oder alle Waffen als Airsoft behandelt werden if isAirsoftWeapon(weaponHash) and attackerServerId then -- Lokale Stats sofort updaten @@ -784,48 +734,6 @@ AddEventHandler('gameEventTriggered', function(name, args) end end) --- Improved Ragdoll-Erkennung Thread -CreateThread(function() - while true do - Wait(50) -- Check more frequently - if inTDM and not isHit then - local ped = PlayerPedId() - - -- Prüfe, ob der Spieler im Ragdoll-Zustand ist - if isPedInRagdoll(ped) then - -- Bestimme den Angreifer - -- Prüfe, ob der Spieler im Ragdoll-Zustand ist - if isPedInRagdoll(ped) then - -- Bestimme den Angreifer (verwende den letzten Angreifer, wenn innerhalb von 3 Sekunden) - if lastDamager and (GetGameTimer() - lastDamageTime) < 3000 then - local attacker = lastDamager - - -- Prüfe ob die Waffe eine Airsoft-Waffe ist - if isAirsoftWeapon(lastDamageWeapon) then - debugPrint("Ragdoll durch Airsoft-Waffe - Zählt als Tod durch: " .. attacker) - - -- Lokale Stats sofort updaten - playerStats.deaths = playerStats.deaths + 1 - - -- Treffer-Events auslösen - TriggerEvent('tdm:playerHit') - TriggerServerEvent('tdm:playerWasHit', currentGameId, currentTeam, attacker) - - -- Zurücksetzen des letzten Angreifers - lastDamager = nil - lastDamageWeapon = 0 - - -- Warten um mehrfache Auslösung zu verhindern - Wait(1000) - end - end - end - else - Wait(500) - end - end -end) - -- Direkter Waffen-Schaden Monitor für zusätzliche Zuverlässigkeit CreateThread(function() while true do @@ -847,7 +755,63 @@ CreateThread(function() -- Treffer-Events auslösen TriggerEvent('tdm:playerHit') - TriggerServerEvent('tdm:playerWasHit', currentGameId, currentTeam, lastDamager) + TriggerServerEvent('tdm:playerWasHit', currentGameId, currentTeam) + + -- Warten um mehrfache Auslösung zu verhindern + Wait(500) + end + else + Wait(500) + end + end +end) + +-- Ragdoll-Erkennung Thread +CreateThread(function() + local lastDamager = nil + local lastDamageTime = 0 + + while true do + Wait(100) + if inTDM and not isHit then + local ped = PlayerPedId() + + -- Speichere den letzten Angreifer, wenn Schaden genommen wurde + if HasEntityBeenDamagedByAnyPed(ped) then + for _, player in ipairs(GetActivePlayers()) do + local playerPed = GetPlayerPed(player) + if HasPedBeenDamagedBy(ped, playerPed) then + lastDamager = GetPlayerServerId(player) + lastDamageTime = GetGameTimer() + debugPrint("Letzter Angreifer gespeichert: " .. lastDamager) + break + end + end + ClearEntityLastDamageEntity(ped) + end + + -- Prüfe, ob der Spieler im Ragdoll-Zustand ist + if isPedInRagdoll(ped) then + debugPrint("Ragdoll-Zustand erkannt - Zählt als Tod") + + -- Lokale Stats sofort updaten + playerStats.deaths = playerStats.deaths + 1 + + -- Bestimme den Angreifer (verwende den letzten Angreifer, wenn innerhalb von 3 Sekunden) + local attacker = nil + if lastDamager and (GetGameTimer() - lastDamageTime) < 3000 then + attacker = lastDamager + debugPrint("Ragdoll-Tod zugeordnet an Angreifer: " .. attacker) + else + debugPrint("Kein Angreifer für Ragdoll-Tod gefunden") + end + + -- Treffer-Events auslösen + TriggerEvent('tdm:playerHit') + TriggerServerEvent('tdm:playerWasHit', currentGameId, currentTeam, attacker) + + -- Zurücksetzen des letzten Angreifers + lastDamager = nil -- Warten um mehrfache Auslösung zu verhindern Wait(500) @@ -966,14 +930,3 @@ AddEventHandler('onResourceStop', function(resourceName) cleanupResources() end end) - --- Helper function for table.count -if not table.count then - table.count = function(tbl) - local count = 0 - for _, _ in pairs(tbl) do - count = count + 1 - end - return count - end -end