aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-03-02 17:07:18 -0600
committermegamage <none@none>2009-03-02 17:07:18 -0600
commit0b32a2c7510ada90e7e1f8a91229fc73e9aa7753 (patch)
tree4b736b05b074537616ba037c7bcaa79705928257 /src
parentd9d77939ba0dc542622235197cd3a9bfed066573 (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.cpp12
-rw-r--r--src/game/BattleGroundMgr.h3
-rw-r--r--src/shared/revision_nr.h2
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__