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);