diff options
Diffstat (limited to 'src/game/BattleGroundMgr.h')
-rw-r--r-- | src/game/BattleGroundMgr.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/game/BattleGroundMgr.h b/src/game/BattleGroundMgr.h index 2de067d3639..9100142ebd0 100644 --- a/src/game/BattleGroundMgr.h +++ b/src/game/BattleGroundMgr.h @@ -17,23 +17,32 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #ifndef __BATTLEGROUNDMGR_H #define __BATTLEGROUNDMGR_H + #include "Common.h" #include "Policies/Singleton.h" + #include "BattleGround.h" + typedef std::map<uint32, BattleGround*> BattleGroundSet; + //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; + #define BATTLEGROUND_ARENA_POINT_DISTRIBUTION_DAY 86400 // seconds in a day #define COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME 10 + struct GroupQueueInfo; // type predefinition struct PlayerQueueInfo // stores information for players in queue { uint32 LastOnlineTime; // for tracking and removing offline players from queue after 5 minutes GroupQueueInfo * GroupInfo; // pointer to the associated groupqueueinfo }; + struct GroupQueueInfo // stores information about the group in queue (also used when joined as solo!) { std::map<uint64, PlayerQueueInfo*> Players; // player queue info map @@ -48,6 +57,7 @@ struct GroupQueueInfo // stores informatio uint32 ArenaTeamRating; // if rated match, inited to the rating of the team uint32 OpponentsTeamRating; // for rated arena matches }; + enum BattleGroundQueueGroupTypes { BG_QUEUE_PREMADE_ALLIANCE = 0, @@ -56,13 +66,16 @@ enum BattleGroundQueueGroupTypes BG_QUEUE_NORMAL_HORDE = 3 }; #define BG_QUEUE_GROUP_TYPES_COUNT 4 + class BattleGround; class BattleGroundQueue { public: BattleGroundQueue(); ~BattleGroundQueue(); + void Update(BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id, uint8 arenaType = 0, bool isRated = false, uint32 minRating = 0); + void FillPlayersToBG(BattleGround* bg, BGQueueIdBasedOnLevel queue_id); bool CheckPremadeMatch(BGQueueIdBasedOnLevel queue_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam); bool CheckNormalMatch(BattleGround* bg_template, BGQueueIdBasedOnLevel queue_id, uint32 minPlayers, uint32 maxPlayers); @@ -72,12 +85,16 @@ class BattleGroundQueue void RemovePlayer(const uint64& guid, bool decreaseInvitedCount); void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id); uint32 GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id); + void DecreaseGroupLength(uint32 queueId, uint32 AsGroup); void AnnounceWorld(GroupQueueInfo *ginfo, const uint64& playerGUID, bool isAddedToQueue); + typedef std::map<uint64, PlayerQueueInfo> QueuedPlayersMap; QueuedPlayersMap m_QueuedPlayers; + //we need constant add to begin and constant remove / add from the end, therefore deque suits our problem well typedef std::list<GroupQueueInfo*> GroupsQueueType; + /* This two dimensional array is used to store All queued groups First dimension specifies the bgTypeId @@ -88,6 +105,7 @@ class BattleGroundQueue BG_QUEUE_NORMAL_HORDE is used for normal (or small) horde groups or non-rated arena matches */ GroupsQueueType m_QueuedGroups[MAX_BATTLEGROUND_QUEUES][BG_QUEUE_GROUP_TYPES_COUNT]; + // class to select and invite groups to bg class SelectionPool { @@ -101,14 +119,18 @@ class BattleGroundQueue private: uint32 PlayerCount; }; + //one selection pool for horde, other one for alliance SelectionPool m_SelectionPools[BG_TEAMS_COUNT]; + private: + bool InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * bg, uint32 side); uint32 m_WaitTimes[BG_TEAMS_COUNT][MAX_BATTLEGROUND_QUEUES][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME]; uint32 m_WaitTimeLastPlayer[BG_TEAMS_COUNT][MAX_BATTLEGROUND_QUEUES]; uint32 m_SumOfWaitTimes[BG_TEAMS_COUNT][MAX_BATTLEGROUND_QUEUES]; }; + /* This class is used to invite player to BG again, when minute lasts from his first invitation it is capable to solve all possibilities @@ -121,6 +143,7 @@ class BGQueueInviteEvent : public BasicEvent { }; virtual ~BGQueueInviteEvent() {}; + virtual bool Execute(uint64 e_time, uint32 p_time); virtual void Abort(uint64 e_time); private: @@ -129,6 +152,7 @@ class BGQueueInviteEvent : public BasicEvent BattleGroundTypeId m_BgTypeId; uint32 m_RemoveTime; }; + /* This class is used to remove player from BG queue after 1 minute 20 seconds from first invitation We must store removeInvite time in case player left queue and joined and is invited again @@ -140,7 +164,9 @@ class BGQueueRemoveEvent : public BasicEvent BGQueueRemoveEvent(const uint64& pl_guid, uint32 bgInstanceGUID, BattleGroundTypeId BgTypeId, BattleGroundQueueTypeId bgQueueTypeId, uint32 removeTime) : m_PlayerGuid(pl_guid), m_BgInstanceGUID(bgInstanceGUID), m_RemoveTime(removeTime), m_BgTypeId(BgTypeId), m_BgQueueTypeId(bgQueueTypeId) {} + virtual ~BGQueueRemoveEvent() {} + virtual bool Execute(uint64 e_time, uint32 p_time); virtual void Abort(uint64 e_time); private: @@ -150,6 +176,7 @@ class BGQueueRemoveEvent : public BasicEvent BattleGroundTypeId m_BgTypeId; BattleGroundQueueTypeId m_BgQueueTypeId; }; + class BattleGroundMgr { public: @@ -157,6 +184,7 @@ class BattleGroundMgr BattleGroundMgr(); ~BattleGroundMgr(); void Update(uint32 diff); + /* Packet Building */ void BuildPlayerJoinedBattleGroundPacket(WorldPacket *data, Player *plr); void BuildPlayerLeftBattleGroundPacket(WorldPacket *data, const uint64& guid); @@ -167,30 +195,41 @@ class BattleGroundMgr void BuildBattleGroundStatusPacket(WorldPacket *data, BattleGround *bg, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype); void BuildPlaySoundPacket(WorldPacket *data, uint32 soundid); void SendAreaSpiritHealerQueryOpcode(Player *pl, BattleGround *bg, const uint64& guid); + /* Battlegrounds */ BattleGround* GetBattleGroundThroughClientInstance(uint32 instanceId, BattleGroundTypeId bgTypeId); BattleGround* GetBattleGround(uint32 InstanceID, BattleGroundTypeId bgTypeId); //there must be uint32 because MAX_BATTLEGROUND_TYPE_ID means unknown + BattleGround* GetBattleGroundTemplate(BattleGroundTypeId bgTypeId); BattleGround* CreateNewBattleGround(BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id, uint8 arenaType, bool isRated); + uint32 CreateBattleGround(BattleGroundTypeId bgTypeId, bool IsArena, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char* BattleGroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO); + void AddBattleGround(uint32 InstanceID, BattleGroundTypeId bgTypeId, BattleGround* BG) { m_BattleGrounds[bgTypeId][InstanceID] = BG; }; void RemoveBattleGround(uint32 instanceID, BattleGroundTypeId bgTypeId) { m_BattleGrounds[bgTypeId].erase(instanceID); } uint32 CreateClientVisibleInstanceId(BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id); + void CreateInitialBattleGrounds(); void DeleteAllBattleGrounds(); + void SendToBattleGround(Player *pl, uint32 InstanceID, BattleGroundTypeId bgTypeId); + /* Battleground queues */ //these queues are instantiated when creating BattlegroundMrg BattleGroundQueue m_BattleGroundQueues[MAX_BATTLEGROUND_QUEUE_TYPES]; // public, because we need to access them in BG handler code + BGFreeSlotQueueType BGFreeSlotQueue[MAX_BATTLEGROUND_TYPE_ID]; + void ScheduleQueueUpdate(BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id); uint32 GetMaxRatingDifference() const; uint32 GetRatingDiscardTimer() const; uint32 GetPrematureFinishTime() const; + void InitAutomaticArenaPointDistribution(); void DistributeArenaPoints(); void ToggleArenaTesting(); void ToggleTesting(); + void SetHolidayWeekends(uint32 mask); void LoadBattleMastersEntry(); BattleGroundTypeId GetBattleMasterBG(uint32 entry) const @@ -200,16 +239,20 @@ class BattleGroundMgr return itr->second; return BATTLEGROUND_WS; } + bool isArenaTesting() const { return m_ArenaTesting; } bool isTesting() const { return m_Testing; } + static bool IsArenaType(BattleGroundTypeId bgTypeId); static bool IsBattleGroundType(BattleGroundTypeId bgTypeId) { return !BattleGroundMgr::IsArenaType(bgTypeId); } static BattleGroundQueueTypeId BGQueueTypeId(BattleGroundTypeId bgTypeId, uint8 arenaType); static BattleGroundTypeId BGTemplateId(BattleGroundQueueTypeId bgQueueTypeId); static uint8 BGArenaType(BattleGroundQueueTypeId bgQueueTypeId); + static bool IsBGWeekend(BattleGroundTypeId bgTypeId); private: BattleMastersMap mBattleMastersMap; + /* Battlegrounds */ BattleGroundSet m_BattleGrounds[MAX_BATTLEGROUND_TYPE_ID]; std::vector<uint32>m_QueueUpdateScheduler; @@ -220,6 +263,7 @@ class BattleGroundMgr bool m_ArenaTesting; bool m_Testing; }; + #define sBattleGroundMgr Trinity::Singleton<BattleGroundMgr>::Instance() #endif |