diff options
author | megamage <none@none> | 2009-03-02 17:07:18 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-03-02 17:07:18 -0600 |
commit | 0b32a2c7510ada90e7e1f8a91229fc73e9aa7753 (patch) | |
tree | 4b736b05b074537616ba037c7bcaa79705928257 /src | |
parent | d9d77939ba0dc542622235197cd3a9bfed066573 (diff) |
[7370] Fixed crash in CheckSkirmishForSameFaction() function, when we erased iterator which shouldn't be erased
Fixed crash in BattleGroundQueue::Update() by changing BGFreeSlotQueueType from deque to list. Author: Triply
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/BattleGroundMgr.cpp | 12 | ||||
-rw-r--r-- | src/game/BattleGroundMgr.h | 3 | ||||
-rw-r--r-- | src/shared/revision_nr.h | 2 |
3 files changed, 9 insertions, 8 deletions
diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp index 94a5d607ae6..9911f4190ca 100644 --- a/src/game/BattleGroundMgr.cpp +++ b/src/game/BattleGroundMgr.cpp @@ -653,7 +653,8 @@ bool BattleGroundQueue::CheckSkirmishForSameFaction(BGQueueIdBasedOnLevel queue_ break; if( itr_team == m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].end() ) return false; - GroupsQueueType::iterator itr_team2 = ++itr_team; + GroupsQueueType::iterator itr_team2 = itr_team; + ++itr_team2; //invite players to other selection pool for(; itr_team2 != m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].end(); ++itr_team2) { @@ -675,7 +676,9 @@ bool BattleGroundQueue::CheckSkirmishForSameFaction(BGQueueIdBasedOnLevel queue_ //add team to other queue m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_ALLIANCE + otherTeam].push_front(*itr); //remove team from old queue - for(GroupsQueueType::iterator itr2 = itr_team; itr2 != m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].end(); ++itr2) + GroupsQueueType::iterator itr2 = itr_team; + ++itr2; + for(; itr2 != m_QueuedGroups[queue_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].end(); ++itr2) { if( *itr2 == *itr ) { @@ -705,9 +708,8 @@ void BattleGroundQueue::Update(BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLeve //battleground with free slot for player should be always in the beggining of the queue // maybe it would be better to create bgfreeslotqueue for each queue_id_based_on_level - bool continueAdding = true; BGFreeSlotQueueType::iterator itr, next; - for (itr = sBattleGroundMgr.BGFreeSlotQueue[bgTypeId].begin(); continueAdding && itr != sBattleGroundMgr.BGFreeSlotQueue[bgTypeId].end(); itr = next) + for (itr = sBattleGroundMgr.BGFreeSlotQueue[bgTypeId].begin(); itr != sBattleGroundMgr.BGFreeSlotQueue[bgTypeId].end(); itr = next) { next = itr; ++next; @@ -733,8 +735,6 @@ void BattleGroundQueue::Update(BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLeve if( !bg->HasFreeSlots() ) { - if( next == sBattleGroundMgr.BGFreeSlotQueue[bgTypeId].end() ) - continueAdding = false; // remove BG from BGFreeSlotQueue bg->RemoveFromBGFreeSlotQueue(); } diff --git a/src/game/BattleGroundMgr.h b/src/game/BattleGroundMgr.h index 0ac52b23de3..1bd3a7110eb 100644 --- a/src/game/BattleGroundMgr.h +++ b/src/game/BattleGroundMgr.h @@ -26,7 +26,8 @@ typedef std::map<uint32, BattleGround*> BattleGroundSet; -typedef std::deque<BattleGround*> BGFreeSlotQueueType; +//this container can't be deque, because deque doesn't like removing the last element - if you remove it, it invalidates next iterator and crash appears +typedef std::list<BattleGround*> BGFreeSlotQueueType; typedef UNORDERED_MAP<uint32, BattleGroundTypeId> BattleMastersMap; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index f13bf1ca3af..bd0712af763 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7369" + #define REVISION_NR "7370" #endif // __REVISION_NR_H__ |