diff --git a/src/game/BattleGround/BattleGround.cpp b/src/game/BattleGround/BattleGround.cpp
index a0029863a..a926ee252 100644
--- a/src/game/BattleGround/BattleGround.cpp
+++ b/src/game/BattleGround/BattleGround.cpp
@@ -767,6 +767,57 @@ void BattleGround::RewardReputationToTeam(uint32 faction_id, uint32 Reputation,
}
}
+///
+/// Rewards the XP to team.
+///
+/// The battleground event.
+/// The team id.
+void BattleGround::RewardXPToTeam(uint8 event, Team teamId)
+{
+ enum BGEvent
+ {
+ WS_FLAG_CAPTURE = 1,
+ WS_WIN = 2,
+ };
+
+ for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
+ {
+ if (itr->second.OfflineRemoveTime)
+ {
+ continue;
+ }
+
+ Player* plr = sObjectMgr.GetPlayer(itr->first);
+
+ if (!plr)
+ {
+ sLog.outError("BattleGround:RewardXPToTeam: %s not found!", itr->first.GetString().c_str());
+ continue;
+ }
+
+ Team team = itr->second.PlayerTeam;
+ if (!team)
+ {
+ team = plr->GetTeam();
+ }
+
+ if (team == teamId)
+ {
+ uint32 xp;
+ switch (event)
+ {
+ case WS_FLAG_CAPTURE:
+ xp = 74 + (4.01 * plr->getLevel()) + (1.19 * pow(plr->getLevel(),2)); // This XP curve is a WIP, was established with a limited dataset pulled from various videos. -fyre
+ break;
+ case WS_WIN:
+ xp = (74 + (4.01 * plr->getLevel()) + (1.19 * pow(plr->getLevel(),2)))/2; // Half of a flag capture. Complete guess. -fyre
+ break;
+ }
+ plr->GiveXP(xp, nullptr);
+ }
+ }
+}
+
///
/// Updates the state of the world.
///
diff --git a/src/game/BattleGround/BattleGround.h b/src/game/BattleGround/BattleGround.h
index 951ca6a7b..a48d0a2ac 100644
--- a/src/game/BattleGround/BattleGround.h
+++ b/src/game/BattleGround/BattleGround.h
@@ -870,6 +870,13 @@ class BattleGround
* @param team
*/
void RewardReputationToTeam(uint32 faction_id, uint32 Reputation, Team team);
+ /**
+ * @brief
+ *
+ * @param event
+ * @param team
+ */
+ void RewardXPToTeam(uint8 event, Team team);
/**
* @brief
*
diff --git a/src/game/BattleGround/BattleGroundWS.cpp b/src/game/BattleGround/BattleGroundWS.cpp
index 18c2aea7b..f748d7e5d 100644
--- a/src/game/BattleGround/BattleGroundWS.cpp
+++ b/src/game/BattleGround/BattleGroundWS.cpp
@@ -226,6 +226,7 @@ void BattleGroundWS::EventPlayerCapturedFlag(Player* source)
}
PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE);
RewardReputationToTeam(890, m_ReputationCapture, ALLIANCE);
+ RewardXPToTeam(1, ALLIANCE); // event = WS_FLAG_CAPTURE
}
else
{
@@ -244,6 +245,7 @@ void BattleGroundWS::EventPlayerCapturedFlag(Player* source)
}
PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE);
RewardReputationToTeam(889, m_ReputationCapture, HORDE);
+ RewardXPToTeam(1, HORDE); // event = WS_FLAG_CAPTURE
}
// for flag capture is reward 2 honorable kills
RewardHonorToTeam(GetBonusHonorFromKill(2), source->GetTeam());
@@ -606,10 +608,25 @@ void BattleGroundWS::EndBattleGround(Team winner)
if (winner == ALLIANCE)
{
RewardHonorToTeam(GetBonusHonorFromKill(m_HonorWinKills), ALLIANCE);
+
+ // Earn XP for any remaining flags not captured by the Horde.
+ for (uint8 i = 0; i < (3 - m_TeamScores[TEAM_INDEX_HORDE]); ++i)
+ {
+ RewardXPToTeam(1, ALLIANCE); // event = WS_FLAG_CAPTURE
+ }
+ RewardXPToTeam(2, ALLIANCE); // event = WS_WIN
}
if (winner == HORDE)
{
RewardHonorToTeam(GetBonusHonorFromKill(m_HonorWinKills), HORDE);
+
+ // Earn XP for any remaining flags not captured by the Horde.
+ for (uint8 i = 0; i < (3 - m_TeamScores[TEAM_INDEX_ALLIANCE]); ++i)
+ {
+ RewardXPToTeam(1, HORDE); // event = WS_FLAG_CAPTURE
+ }
+ RewardXPToTeam(2, HORDE); // event = WS_WIN
+
}
// complete map_end rewards (even if no team wins)
RewardHonorToTeam(GetBonusHonorFromKill(m_HonorEndKills), ALLIANCE);