aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2016-06-05 21:53:38 +0200
committerjoschiwald <joschiwald.trinity@gmail.com>2017-01-12 03:13:55 +0100
commit98d16d82be38128498709fd56811147e7c202ec0 (patch)
tree91c4177382581df421a8850ba3754ee4fbe7d8e3 /src
parent21168e853d02c20ccb2234a421d594e5b9d4ac3a (diff)
Core/Player: Fix duel edge case crash
Fix a crash that could be triggered if an aura removed after duel finished would have caused damage to one of the players. (cherry picked from commit 7ff0f3c65fd0c068560351eac92e96a8527c96a7)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp7
-rw-r--r--src/server/game/Entities/Player/Player.h3
2 files changed, 9 insertions, 1 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 5c7008d75d1..0b6e19f90b0 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7018,6 +7018,13 @@ void Player::DuelComplete(DuelCompleteType type)
if (!duel)
return;
+ // Check if DuelComplete() has been called already up in the stack and in that case don't do anything else here
+ if (duel->isCompleted || ASSERT_NOTNULL(duel->opponent->duel)->isCompleted)
+ return;
+
+ duel->isCompleted = true;
+ duel->opponent->duel->isCompleted = true;
+
TC_LOG_DEBUG("entities.unit", "Player::DuelComplete: Player '%s' (%s), Opponent: '%s' (%s)",
GetName().c_str(), GetGUID().ToString().c_str(), duel->opponent->GetName().c_str(), duel->opponent->GetGUID().ToString().c_str());
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 3c2248058b5..0209dc46385 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -429,7 +429,7 @@ struct PvPInfo
struct DuelInfo
{
- DuelInfo() : initiator(nullptr), opponent(nullptr), startTimer(0), startTime(0), outOfBound(0), isMounted(false) { }
+ DuelInfo() : initiator(nullptr), opponent(nullptr), startTimer(0), startTime(0), outOfBound(0), isMounted(false), isCompleted(false) { }
Player* initiator;
Player* opponent;
@@ -437,6 +437,7 @@ struct DuelInfo
time_t startTime;
time_t outOfBound;
bool isMounted;
+ bool isCompleted;
};
struct Areas