aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2016-06-05 21:53:38 +0200
committerjackpoz <giacomopoz@gmail.com>2016-06-05 21:53:38 +0200
commit7ff0f3c65fd0c068560351eac92e96a8527c96a7 (patch)
tree01cbd0f4d1e1bd73e9176acb32edab049f1de776 /src
parent2f0f30b9f76307e9bb781502d593480af0f4cbbd (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.
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 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