mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/Battlegrounds: Add methods for determining the winner of a BG if it has ended due to not enough players.
Implemented for Arathi Basin, Alterac Valley, Warsong Gulch and Eye Of The Storm. All other BGs winner are currently decided based on the number of players of each side, they will be implemented later.
This commit is contained in:
@@ -404,6 +404,17 @@ inline void Battleground::_ProcessRessurect(uint32 diff)
|
||||
}
|
||||
}
|
||||
|
||||
uint32 Battleground::GetPrematureWinner()
|
||||
{
|
||||
uint32 winner = 0;
|
||||
if (GetPlayersCountByTeam(ALLIANCE) >= GetMinPlayersPerTeam())
|
||||
winner = ALLIANCE;
|
||||
else if (GetPlayersCountByTeam(HORDE) >= GetMinPlayersPerTeam())
|
||||
winner = HORDE;
|
||||
|
||||
return winner;
|
||||
}
|
||||
|
||||
inline void Battleground::_ProcessProgress(uint32 diff)
|
||||
{
|
||||
// *********************************************************
|
||||
@@ -418,13 +429,7 @@ inline void Battleground::_ProcessProgress(uint32 diff)
|
||||
else if (m_PrematureCountDownTimer < diff)
|
||||
{
|
||||
// time's up!
|
||||
uint32 winner = 0;
|
||||
if (GetPlayersCountByTeam(ALLIANCE) >= GetMinPlayersPerTeam())
|
||||
winner = ALLIANCE;
|
||||
else if (GetPlayersCountByTeam(HORDE) >= GetMinPlayersPerTeam())
|
||||
winner = HORDE;
|
||||
|
||||
EndBattleground(winner);
|
||||
EndBattleground(GetPrematureWinner());
|
||||
m_PrematureCountDown = false;
|
||||
}
|
||||
else if (!sBattlegroundMgr->isTesting())
|
||||
|
||||
@@ -528,6 +528,8 @@ class Battleground
|
||||
virtual uint64 GetFlagPickerGUID(int32 /*team*/ = -1) const { return 0; }
|
||||
virtual void SetDroppedFlagGUID(uint64 /*guid*/, int32 /*team*/ = -1) {}
|
||||
uint32 GetTeamScore(uint32 TeamID) const;
|
||||
|
||||
virtual uint32 GetPrematureWinner();
|
||||
|
||||
protected:
|
||||
// this method is called, when BG cannot spawn its own spirit guide, or something is wrong, It correctly ends Battleground
|
||||
|
||||
@@ -548,6 +548,25 @@ void BattlegroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* /*targ
|
||||
PlaySoundToAll(sound);
|
||||
}
|
||||
|
||||
uint32 BattlegroundAB::GetPrematureWinner()
|
||||
{
|
||||
// How many bases each team owns
|
||||
uint8 ally = 0, horde = 0;
|
||||
for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i)
|
||||
if (m_Nodes[i] == BG_AB_NODE_STATUS_ALLY_OCCUPIED)
|
||||
++ally;
|
||||
else if (m_Nodes[i] == BG_AB_NODE_STATUS_HORDE_OCCUPIED)
|
||||
++horde;
|
||||
|
||||
if (ally > horde)
|
||||
return ALLIANCE;
|
||||
else if (horde > ally)
|
||||
return HORDE;
|
||||
|
||||
// If the values are equal, fall back to the original result (based on number of players on each team)
|
||||
return Battleground::GetPrematureWinner();
|
||||
}
|
||||
|
||||
bool BattlegroundAB::SetupBattleground()
|
||||
{
|
||||
for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i)
|
||||
|
||||
@@ -272,6 +272,8 @@ class BattlegroundAB : public Battleground
|
||||
/* achievement req. */
|
||||
bool IsAllNodesConrolledByTeam(uint32 team) const; // overwrited
|
||||
bool IsTeamScores500Disadvantage(uint32 team) const { return m_TeamScores500Disadvantage[GetTeamIndexByTeamId(team)]; }
|
||||
|
||||
uint32 GetPrematureWinner();
|
||||
private:
|
||||
void PostUpdateImpl(uint32 diff);
|
||||
/* Gameobject spawning/despawning */
|
||||
|
||||
@@ -1695,3 +1695,16 @@ bool BattlegroundAV::IsAllTowersControlledAndCaptainAlive(uint32 team) const
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 BattlegroundAV::GetPrematureWinner()
|
||||
{
|
||||
uint32 allianceScore = m_Team_Scores[GetTeamIndexByTeamId(ALLIANCE)];
|
||||
uint32 hordeScore = m_Team_Scores[GetTeamIndexByTeamId(HORDE)];
|
||||
|
||||
if (allianceScore > hordeScore)
|
||||
return ALLIANCE;
|
||||
else if (hordeScore > allianceScore)
|
||||
return HORDE;
|
||||
|
||||
return Battleground::GetPrematureWinner();
|
||||
}
|
||||
@@ -1556,7 +1556,7 @@ class BattlegroundAV : public Battleground
|
||||
|
||||
/*general stuff*/
|
||||
void UpdateScore(uint16 team, int16 points);
|
||||
void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
|
||||
void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
|
||||
|
||||
/*handlestuff*/ //these are functions which get called from extern
|
||||
void EventPlayerClickedOnFlag(Player* source, GameObject* target_obj);
|
||||
@@ -1572,6 +1572,8 @@ class BattlegroundAV : public Battleground
|
||||
/* achievement req. */
|
||||
bool IsBothMinesControlledByTeam(uint32 team) const;
|
||||
bool IsAllTowersControlledAndCaptainAlive(uint32 team) const;
|
||||
|
||||
uint32 GetPrematureWinner();
|
||||
|
||||
private:
|
||||
void PostUpdateImpl(uint32 diff);
|
||||
|
||||
@@ -937,3 +937,13 @@ bool BattlegroundEY::IsAllNodesConrolledByTeam(uint32 team) const
|
||||
|
||||
return count == EY_POINTS_MAX;
|
||||
}
|
||||
|
||||
uint32 BattlegroundEY::GetPrematureWinner()
|
||||
{
|
||||
if (GetTeamScore(TEAM_ALLIANCE) > GetTeamScore(TEAM_HORDE))
|
||||
return ALLIANCE;
|
||||
else if (GetTeamScore(TEAM_HORDE) > GetTeamScore(TEAM_ALLIANCE))
|
||||
return HORDE;
|
||||
|
||||
return Battleground::GetPrematureWinner();
|
||||
}
|
||||
@@ -369,6 +369,8 @@ class BattlegroundEY : public Battleground
|
||||
|
||||
/* achievement req. */
|
||||
bool IsAllNodesConrolledByTeam(uint32 team) const;
|
||||
|
||||
uint32 GetPrematureWinner();
|
||||
private:
|
||||
void PostUpdateImpl(uint32 diff);
|
||||
|
||||
|
||||
@@ -858,3 +858,12 @@ void BattlegroundWS::FillInitialWorldStates(WorldPacket& data)
|
||||
data << uint32(BG_WS_FLAG_STATE_ALLIANCE) << uint32(1);
|
||||
}
|
||||
|
||||
uint32 BattlegroundWS::GetPrematureWinner()
|
||||
{
|
||||
if (GetTeamScore(TEAM_ALLIANCE) > GetTeamScore(TEAM_HORDE))
|
||||
return ALLIANCE;
|
||||
else if (GetTeamScore(TEAM_HORDE) > GetTeamScore(TEAM_ALLIANCE))
|
||||
return HORDE;
|
||||
|
||||
return Battleground::GetPrematureWinner();
|
||||
}
|
||||
@@ -211,6 +211,8 @@ class BattlegroundWS : public Battleground
|
||||
void AddPoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] += Points; }
|
||||
void SetTeamPoint(uint32 TeamID, uint32 Points = 0) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] = Points; }
|
||||
void RemovePoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] -= Points; }
|
||||
|
||||
uint32 GetPrematureWinner();
|
||||
private:
|
||||
uint64 m_FlagKeepers[2]; // 0 - alliance, 1 - horde
|
||||
uint64 m_DroppedFlagGUID[2];
|
||||
|
||||
Reference in New Issue
Block a user