From 1e7893c322e0412501a959588bb9929609956bc4 Mon Sep 17 00:00:00 2001 From: "Felipe A." <73603452+imfelipedev@users.noreply.github.com> Date: Wed, 29 Jan 2025 22:53:38 -0300 Subject: [PATCH] Fix false positive in `onPlayerTeleport` event when using `spawnPlayer` (PR #3990) --- Server/mods/deathmatch/logic/CMapManager.cpp | 1 + .../logic/packets/CPlayerPuresyncPacket.cpp | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Server/mods/deathmatch/logic/CMapManager.cpp b/Server/mods/deathmatch/logic/CMapManager.cpp index 0af22ff885..eb161ceb8e 100644 --- a/Server/mods/deathmatch/logic/CMapManager.cpp +++ b/Server/mods/deathmatch/logic/CMapManager.cpp @@ -593,6 +593,7 @@ void CMapManager::SpawnPlayer(CPlayer& Player, const CVector& vecPosition, float // Update the player data Player.SetSpawned(true); + Player.SetTeleported(true); Player.SetHealth(Player.GetMaxHealth()); Player.SetIsDead(false); Player.SetWearingGoggles(false); diff --git a/Server/mods/deathmatch/logic/packets/CPlayerPuresyncPacket.cpp b/Server/mods/deathmatch/logic/packets/CPlayerPuresyncPacket.cpp index 8fee7a61fb..5aef18566f 100644 --- a/Server/mods/deathmatch/logic/packets/CPlayerPuresyncPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CPlayerPuresyncPacket.cpp @@ -132,15 +132,20 @@ bool CPlayerPuresyncPacket::Read(NetBitStreamInterface& BitStream) position.data.vecPosition += vecTempPos; } - CVector playerPosition = pSourcePlayer->GetPosition(); - float playerDistancePosition = DistanceBetweenPoints3D(playerPosition, position.data.vecPosition); - if (playerDistancePosition >= g_TickRateSettings.playerTeleportAlert) { - if (!pSourcePlayer->GetTeleported()) { - CLuaArguments arguments; - pSourcePlayer->CallEvent("onPlayerTeleport", arguments, nullptr); - } + if (position.data.vecPosition.fX != 0.0f && position.data.vecPosition.fY != 0.0f && position.data.vecPosition.fZ != 0.0f) + { + CVector playerPosition = pSourcePlayer->GetPosition(); + float playerDistancePosition = DistanceBetweenPoints3D(playerPosition, position.data.vecPosition); + if (playerDistancePosition >= g_TickRateSettings.playerTeleportAlert) + { + if (!pSourcePlayer->GetTeleported()) + { + CLuaArguments arguments; + pSourcePlayer->CallEvent("onPlayerTeleport", arguments, nullptr); + } - pSourcePlayer->SetTeleported(false); + pSourcePlayer->SetTeleported(false); + } } pSourcePlayer->SetPosition(position.data.vecPosition);