diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index decb8093e..a63851069 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -758,7 +758,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui { if (bg->GetTypeID() != BATTLEGROUND_AB) continue; - if(!((BattleGroundAB*)bg)->IsTeamScores500disadvantage(GetPlayer()->GetTeam())) + if(!((BattleGroundAB*)bg)->IsTeamScores500Disadvantage(GetPlayer()->GetTeam())) continue; break; } diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp index d40078c5a..5b1c6d89d 100644 --- a/src/game/BattleGround.cpp +++ b/src/game/BattleGround.cpp @@ -231,9 +231,22 @@ BattleGround::~BattleGround() void BattleGround::Update(uint32 diff) { - if (!GetPlayersSize() && !GetReviveQueueSize()) - //BG is empty + if (!GetPlayersSize()) + { + // BG is empty + // if there are no players invited, delete BG + // this will delete arena or bg object, where any player entered + // [[ but if you use battleground object again (more battles possible to be played on 1 instance) + // then this condition should be removed and code: + // if (!GetInvitedCount(HORDE) && !GetInvitedCount(ALLIANCE)) + // this->AddToFreeBGObjectsQueue(); // not yet implemented + // should be used instead of current + // ]] + // BattleGround Template instance cannot be updated, because it would be deleted + if (!GetInvitedCount(HORDE) && !GetInvitedCount(ALLIANCE)) + m_SetDeleteThis = true; return; + } // remove offline players from bg after 5 minutes if (!m_OfflineQueue.empty()) @@ -1028,7 +1041,12 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac DecreaseInvitedCount(team); //we should update battleground queue, but only if bg isn't ending if (isBattleGround() && GetStatus() < STATUS_WAIT_LEAVE) + { + // a player has left the battleground, so there are free slots -> add to queue + AddToBGFreeSlotQueue(); sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, GetQueueId()); + } + // Let others know WorldPacket data; sBattleGroundMgr.BuildPlayerLeftBattleGroundPacket(&data, guid); @@ -1048,17 +1066,7 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac sLog.outDetail("BATTLEGROUND: Removed player %s from BattleGround.", plr->GetName()); } - if (!GetPlayersSize() && !GetInvitedCount(HORDE) && !GetInvitedCount(ALLIANCE)) - { - // if no players left AND no invitees left, set this bg to delete in next update - // direct deletion could cause crashes - m_SetDeleteThis = true; - // return to prevent addition to freeslotqueue - return; - } - - // a player exited the battleground, so there are free slots. add to queue - this->AddToBGFreeSlotQueue(); + //battleground object will be deleted next BattleGround::Update() call } // this method is called when no players remains in battleground @@ -1091,10 +1099,16 @@ void BattleGround::Reset() void BattleGround::StartBattleGround() { - ///this method should spawn spirit guides and so on SetStartTime(0); - SetLastResurrectTime(0); + + // add BG to free slot queue + AddToBGFreeSlotQueue(); + + // add bg to update list + // This must be done here, because we need to have already invited some players when first BG::Update() method is executed + // and it doesn't matter if we call StartBattleGround() more times, because m_BattleGrounds is a map and instance id never changes + sBattleGroundMgr.AddBattleGround(GetInstanceID(), GetTypeID(), this); } void BattleGround::AddPlayer(Player *plr) diff --git a/src/game/BattleGroundAB.cpp b/src/game/BattleGroundAB.cpp index 7e27972ff..8aee3ddfb 100644 --- a/src/game/BattleGroundAB.cpp +++ b/src/game/BattleGroundAB.cpp @@ -143,19 +143,14 @@ void BattleGroundAB::Update(uint32 diff) UpdateWorldState(BG_AB_OP_RESOURCES_ALLY, m_TeamScores[team]); if (team == BG_TEAM_HORDE) UpdateWorldState(BG_AB_OP_RESOURCES_HORDE, m_TeamScores[team]); - } - } - // achievements flags - if (m_TeamScores[BG_TEAM_ALLIANCE] > m_TeamScores[BG_TEAM_HORDE]) - { - if (m_TeamScores[BG_TEAM_ALLIANCE] - m_TeamScores[BG_TEAM_HORDE] >= 500) - m_TeamScores500disadvantage[BG_TEAM_HORDE] = true; - } - else - { - if (m_TeamScores[BG_TEAM_HORDE] - m_TeamScores[BG_TEAM_ALLIANCE] >= 500) - m_TeamScores500disadvantage[BG_TEAM_ALLIANCE] = true; + // update achievement flags + // we increased m_TeamScores[team] so we just need to check if it is 500 more than other teams resources + // horde will be a bit disadvantaged, but we can assume that points aren't updated for both team in same Update() call + uint8 otherTeam = (team + 1) % BG_TEAMS_COUNT; + if (m_TeamScores[team] > m_TeamScores[otherTeam] + 500) + m_TeamScores500Disadvantage[otherTeam] = true; + } } // Test win condition @@ -588,8 +583,8 @@ void BattleGroundAB::Reset() bool isBGWeekend = false; //TODO FIXME - call sBattleGroundMgr.IsBGWeekend(m_TypeID); - you must also implement that call! m_HonorTics = (isBGWeekend) ? BG_AB_ABBGWeekendHonorTicks : BG_AB_NotABBGWeekendHonorTicks; m_ReputationTics = (isBGWeekend) ? BG_AB_ABBGWeekendReputationTicks : BG_AB_NotABBGWeekendReputationTicks; - m_TeamScores500disadvantage[BG_TEAM_ALLIANCE] = false; - m_TeamScores500disadvantage[BG_TEAM_HORDE] = false; + m_TeamScores500Disadvantage[BG_TEAM_ALLIANCE] = false; + m_TeamScores500Disadvantage[BG_TEAM_HORDE] = false; for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) { diff --git a/src/game/BattleGroundAB.h b/src/game/BattleGroundAB.h index b907298b0..e01e78f66 100644 --- a/src/game/BattleGroundAB.h +++ b/src/game/BattleGroundAB.h @@ -262,7 +262,7 @@ class BattleGroundAB : public BattleGround /* achievement req. */ bool IsAllNodesConrolledByTeam(uint32 team) const; // overwrited - bool IsTeamScores500disadvantage(uint32 team) const { return m_TeamScores500disadvantage[GetTeamIndexByTeamId(team)]; } + bool IsTeamScores500Disadvantage(uint32 team) const { return m_TeamScores500Disadvantage[GetTeamIndexByTeamId(team)]; } private: /* Gameobject spawning/despawning */ void _CreateBanner(uint8 node, uint8 type, uint8 teamIndex, bool delay); @@ -293,6 +293,6 @@ class BattleGroundAB : public BattleGround uint32 m_HonorTics; uint32 m_ReputationTics; // need for achievements - bool m_TeamScores500disadvantage[BG_TEAMS_COUNT]; + bool m_TeamScores500Disadvantage[BG_TEAMS_COUNT]; }; #endif diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp index 3c4be95b6..f0a30dbd3 100644 --- a/src/game/BattleGroundMgr.cpp +++ b/src/game/BattleGroundMgr.cpp @@ -1166,13 +1166,16 @@ void BattleGroundMgr::Update(uint32 diff) if (!m_QueueUpdateScheduler.empty()) { //copy vector and clear the other + // TODO add lock + // TODO maybe std::list would be better and then unlock after end of cycle std::vector scheduled(m_QueueUpdateScheduler); m_QueueUpdateScheduler.clear(); + // TODO drop lock for (uint8 i = 0; i < scheduled.size(); i++) { - BattleGroundQueueTypeId bgQueueTypeId = BattleGroundQueueTypeId(scheduled[i] / 65536); - BattleGroundTypeId bgTypeId = BattleGroundTypeId((scheduled[i] % 65536) / 256); - BGQueueIdBasedOnLevel queue_id = BGQueueIdBasedOnLevel(scheduled[i] % 256); + BattleGroundQueueTypeId bgQueueTypeId = BattleGroundQueueTypeId(scheduled[i] >> 16); + BattleGroundTypeId bgTypeId = BattleGroundTypeId((scheduled[i] >> 8) & 255); + BGQueueIdBasedOnLevel queue_id = BGQueueIdBasedOnLevel(scheduled[i] & 255); m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, queue_id); } } @@ -1596,12 +1599,6 @@ BattleGround * BattleGroundMgr::CreateNewBattleGround(BattleGroundTypeId bgTypeI bg->SetArenaType(arenaType); bg->SetRated(isRated); - // add BG to free slot queue - bg->AddToBGFreeSlotQueue(); - - // add bg to update list - AddBattleGround(bg->GetInstanceID(), bg->GetTypeID(), bg); - return bg; } @@ -2005,9 +2002,9 @@ void BattleGroundMgr::ToggleArenaTesting() void BattleGroundMgr::ScheduleQueueUpdate(BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id) { - //This method must be atomic! + //This method must be atomic, TODO add mutex //we will use only 1 number created of bgTypeId and queue_id - uint32 schedule_id = (bgQueueTypeId * 65536) + (bgTypeId * 256) + queue_id; + uint32 schedule_id = (bgQueueTypeId << 16) | (bgTypeId << 8) | queue_id; bool found = false; for (uint8 i = 0; i < m_QueueUpdateScheduler.size(); i++) { diff --git a/src/game/PoolHandler.h b/src/game/PoolHandler.h index 35e18c2d5..8b6c82d11 100644 --- a/src/game/PoolHandler.h +++ b/src/game/PoolHandler.h @@ -43,7 +43,7 @@ class PoolGroup public: PoolGroup(); ~PoolGroup() {}; - bool isEmpty() { return ExplicitlyChanced.size()==0 && EqualChanced.size()==0; } + bool isEmpty() { return ExplicitlyChanced.empty() && EqualChanced.empty(); } void AddEntry(PoolObject& poolitem, uint32 maxentries); bool CheckPool(void); uint32 RollOne(void); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 73b7934ec..31ae0d921 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 "8473" + #define REVISION_NR "8474" #endif // __REVISION_NR_H__