diff options
| author | jackpoz <giacomopoz@gmail.com> | 2016-06-05 21:53:38 +0200 |
|---|---|---|
| committer | jackpoz <giacomopoz@gmail.com> | 2016-06-05 21:53:38 +0200 |
| commit | 7ff0f3c65fd0c068560351eac92e96a8527c96a7 (patch) | |
| tree | 01cbd0f4d1e1bd73e9176acb32edab049f1de776 | |
| parent | 2f0f30b9f76307e9bb781502d593480af0f4cbbd (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.
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 |
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 ec86e8fe4c3..60e482d9093 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7210,6 +7210,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 a31f074e65d..4b11ca29db4 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -289,7 +289,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; @@ -297,6 +297,7 @@ struct DuelInfo time_t startTime; time_t outOfBound; bool isMounted; + bool isCompleted; }; struct Areas |
