diff options
author | Spp <spp@jorge.gr> | 2013-08-07 11:13:53 +0200 |
---|---|---|
committer | Spp <spp@jorge.gr> | 2013-08-07 11:13:53 +0200 |
commit | 33f8c3ead4da07ff024a94b5e8cf0d05c2ebc23a (patch) | |
tree | d53e38ab3e13e9989eb9cfed45dd4c30660f6ee3 | |
parent | b05665660a2d47e8e0f75835fa3a09a49b8c4993 (diff) |
Core/Battleground: Get rid of dinamic casts BattlegroundXX outside Battleground scope by implementing generic functions (2/2)
- CheckAchievementCriteriaMeet
11 files changed, 135 insertions, 137 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 282ee96dfcf..21c054c8793 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1965,3 +1965,9 @@ void Battleground::HandleAreaTrigger(Player* player, uint32 trigger) TC_LOG_DEBUG(LOG_FILTER_BATTLEGROUND, "Unhandled AreaTrigger %u in Battleground %u. Player coords (x: %f, y: %f, z: %f)", trigger, player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); } + +bool Battleground::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) +{ + TC_LOG_ERROR(LOG_FILTER_BATTLEGROUND, "Battleground::CheckAchievementCriteriaMeet: No implementation for criteria %u", criteriaId); + return false; +} diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 458db8d4952..b0ada0fe24f 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -33,6 +33,16 @@ class BattlegroundMap; struct PvPDifficultyEntry; struct WorldSafeLocsEntry; +enum BattlegroundCriteriaId +{ + BG_CRITERIA_CHECK_RESILIENT_VICTORY, + BG_CRITERIA_CHECK_SAVE_THE_DAY, + BG_CRITERIA_CHECK_EVERYTHING_COUNTS, + BG_CRITERIA_CHECK_AV_PERFECTION, + BG_CRITERIA_CHECK_DEFENSE_OF_THE_ANCIENTS, + BG_CRITERIA_CHECK_NOT_EVEN_A_SCRATCH, +}; + enum BattlegroundSounds { SOUND_HORDE_WINS = 8454, @@ -291,6 +301,7 @@ class Battleground /* achievement req. */ virtual bool IsAllNodesControlledByTeam(uint32 /*team*/) const { return false; } void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); + virtual bool CheckAchievementCriteriaMeet(uint32 /*criteriaId*/, Player const* /*player*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0); /* Battleground */ // Get methods: diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index f52f292c41c..da292d050e9 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -711,3 +711,14 @@ bool BattlegroundAB::IsAllNodesControlledByTeam(uint32 team) const return count == BG_AB_DYNAMIC_NODES_COUNT; } + +bool BattlegroundAB::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* player, Unit const* target, uint32 miscvalue) +{ + switch (criteriaId) + { + case BG_CRITERIA_CHECK_RESILIENT_VICTORY: + return m_TeamScores500Disadvantage[GetTeamIndexByTeamId(player->GetTeam())]; + } + + return Battleground::CheckAchievementCriteriaMeet(criteriaId, player, target, miscvalue); +} diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h index ec7277f30f2..81a2e899634 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h @@ -271,7 +271,7 @@ class BattlegroundAB : public Battleground /* achievement req. */ bool IsAllNodesControlledByTeam(uint32 team) const; - bool IsTeamScores500Disadvantage(uint32 team) const { return m_TeamScores500Disadvantage[GetTeamIndexByTeamId(team)]; } + bool CheckAchievementCriteriaMeet(uint32 /*criteriaId*/, Player const* /*player*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0); uint32 GetPrematureWinner(); private: diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index ea9ccec9152..3be95a86ca8 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -1621,63 +1621,67 @@ void BattlegroundAV::ResetBGSubclass() DelCreature(i); } -bool BattlegroundAV::IsBothMinesControlledByTeam(uint32 team) const +bool BattlegroundAV::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target, uint32 miscValue) { - for (uint8 mine = 0; mine < 2; mine++) - if (m_Mine_Owner[mine] != team) - return false; - - return true; -} - -bool BattlegroundAV::IsAllTowersControlledAndCaptainAlive(uint32 team) const -{ - if (team == ALLIANCE) + uint8 team = source->GetTeam(); + switch (criteriaId) { - for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) // alliance towers controlled - { - if (m_Nodes[i].State == POINT_CONTROLED) - { - if (m_Nodes[i].Owner != ALLIANCE) + case BG_CRITERIA_CHECK_EVERYTHING_COUNTS: + for (uint8 mine = 0; mine < 2; mine++) + if (m_Mine_Owner[mine] != team) return false; - } - else - return false; - } - - for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) // horde towers destroyed - if (m_Nodes[i].State != POINT_DESTROYED) - return false; - if (!m_CaptainAlive[0]) - return false; - - return true; - } - else if (team == HORDE) - { - for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) // horde towers controlled + return true; + case BG_CRITERIA_CHECK_AV_PERFECTION: { - if (m_Nodes[i].State == POINT_CONTROLED) + if (team == ALLIANCE) { - if (m_Nodes[i].Owner != HORDE) + for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) // alliance towers controlled + { + if (m_Nodes[i].State == POINT_CONTROLED) + { + if (m_Nodes[i].Owner != ALLIANCE) + return false; + } + else + return false; + } + + for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) // horde towers destroyed + if (m_Nodes[i].State != POINT_DESTROYED) + return false; + + if (!m_CaptainAlive[0]) return false; + + return true; } - else - return false; - } + else if (team == HORDE) + { + for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) // horde towers controlled + { + if (m_Nodes[i].State == POINT_CONTROLED) + { + if (m_Nodes[i].Owner != HORDE) + return false; + } + else + return false; + } - for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) // alliance towers destroyed - if (m_Nodes[i].State != POINT_DESTROYED) - return false; + for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) // alliance towers destroyed + if (m_Nodes[i].State != POINT_DESTROYED) + return false; - if (!m_CaptainAlive[1]) - return false; + if (!m_CaptainAlive[1]) + return false; - return true; + return true; + } + } } - return false; + return Battleground::CheckAchievementCriteriaMeet(criteriaId, source, target, miscValue); } uint32 BattlegroundAV::GetPrematureWinner() diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h index 610af307258..439fc656925 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h @@ -1570,9 +1570,8 @@ class BattlegroundAV : public Battleground WorldSafeLocsEntry const* GetClosestGraveYard(Player* player); - /* achievement req. */ - bool IsBothMinesControlledByTeam(uint32 team) const; - bool IsAllTowersControlledAndCaptainAlive(uint32 team) const; + // Achievement: Av perfection and Everything counts + bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0); uint32 GetPrematureWinner(); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index 78a8b47acab..d13fc6d697b 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -56,8 +56,8 @@ void BattlegroundSA::Reset() GateStatus[i] = BG_SA_GATE_OK; ShipsStarted = false; gateDestroyed = false; - _notEvenAScratch[TEAM_ALLIANCE] = true; - _notEvenAScratch[TEAM_HORDE] = true; + _allVehiclesAlive[TEAM_ALLIANCE] = true; + _allVehiclesAlive[TEAM_HORDE] = true; Status = BG_SA_WARMUP; } @@ -566,7 +566,7 @@ void BattlegroundSA::HandleKillUnit(Creature* creature, Player* killer) if (creature->GetEntry() == NPC_DEMOLISHER_SA) { UpdatePlayerScore(killer, SCORE_DESTROYED_DEMOLISHER, 1); - _notEvenAScratch[Attackers] = false; + _allVehiclesAlive[Attackers] = false; } } @@ -965,3 +965,17 @@ void BattlegroundSA::SendTransportsRemove(Player* player) player->SendDirectMessage(&packet); } } + +bool BattlegroundSA::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target, uint32 miscValue) +{ + switch (criteriaId) + { + case BG_CRITERIA_CHECK_NOT_EVEN_A_SCRATCH: + return _allVehiclesAlive[GetTeamIndexByTeamId(source->GetTeam())]; + case BG_CRITERIA_CHECK_DEFENSE_OF_THE_ANCIENTS: + if (source->GetTeamId() != Attackers && !gateDestroyed) + return true; + } + + return Battleground::CheckAchievementCriteriaMeet(criteriaId, source, target, miscValue); +} diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h index aa3106d237f..c50721c4591 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h @@ -543,7 +543,7 @@ class BattlegroundSA : public Battleground bool gateDestroyed; // Achievement: Not Even a Scratch - bool notEvenAScratch(uint32 team) const { return _notEvenAScratch[GetTeamIndexByTeamId(team)]; } + bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0); /// Id of attacker team TeamId Attackers; @@ -627,6 +627,6 @@ class BattlegroundSA : public Battleground std::map<uint32/*id*/, uint32/*timer*/> DemoliserRespawnList; // Achievement: Not Even a Scratch - bool _notEvenAScratch[BG_TEAMS_COUNT]; + bool _allVehiclesAlive[BG_TEAMS_COUNT]; }; #endif diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 4747d61813b..419a4eff84c 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -871,3 +871,16 @@ uint32 BattlegroundWS::GetPrematureWinner() return Battleground::GetPrematureWinner(); } + +bool BattlegroundWS::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* player, Unit const* target, uint32 miscValue) +{ + switch (criteriaId) + { + case BG_CRITERIA_CHECK_SAVE_THE_DAY: + if (GetFlagState(player->GetTeam()) == BG_WS_FLAG_STATE_ON_BASE) + return true; + break; + } + + return Battleground::CheckAchievementCriteriaMeet(criteriaId, player, target, miscValue); +} diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index 18807da88a5..4b95fcf6afd 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -213,6 +213,10 @@ class BattlegroundWS : public Battleground void RemovePoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] -= Points; } uint32 GetPrematureWinner(); + + /* Achievements*/ + bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0); + private: uint64 m_FlagKeepers[2]; // 0 - alliance, 1 - horde uint64 m_DroppedFlagGUID[2]; diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp index 068333e347b..94e448bd9bc 100644 --- a/src/server/scripts/World/achievement_scripts.cpp +++ b/src/server/scripts/World/achievement_scripts.cpp @@ -16,12 +16,8 @@ */ #include "ScriptMgr.h" - -#include "BattlegroundAB.h" -#include "BattlegroundWS.h" -#include "BattlegroundIC.h" #include "BattlegroundSA.h" -#include "BattlegroundAV.h" +#include "BattlegroundIC.h" #include "Vehicle.h" #include "Player.h" #include "Creature.h" @@ -31,19 +27,12 @@ class achievement_resilient_victory : public AchievementCriteriaScript public: achievement_resilient_victory() : AchievementCriteriaScript("achievement_resilient_victory") { } - bool OnCheck(Player* source, Unit* /*target*/) OVERRIDE + bool OnCheck(Player* source, Unit* target) OVERRIDE { - Battleground* bg = source->GetBattleground(); - if (!bg) - return false; - - if (bg->GetTypeID(true) != BATTLEGROUND_AB) - return false; - - if (!static_cast<BattlegroundAB*>(bg)->IsTeamScores500Disadvantage(source->GetTeam())) - return false; + if (Battleground* bg = source->GetBattleground()) + return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_RESILIENT_VICTORY, source, target); - return true; + return false; } }; @@ -68,21 +57,9 @@ class achievement_save_the_day : public AchievementCriteriaScript bool OnCheck(Player* source, Unit* target) OVERRIDE { - if (!target) - return false; - - if (Player const* player = target->ToPlayer()) - { - Battleground* bg = source->GetBattleground(); - if (!bg) - return false; - - if (bg->GetTypeID(true) != BATTLEGROUND_WS) - return false; + if (Battleground* bg = source->GetBattleground()) + return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_SAVE_THE_DAY, source, target); - if (static_cast<BattlegroundWS*>(bg)->GetFlagState(player->GetTeam()) == BG_WS_FLAG_STATE_ON_BASE) - return true; - } return false; } }; @@ -196,17 +173,10 @@ class achievement_everything_counts : public AchievementCriteriaScript public: achievement_everything_counts() : AchievementCriteriaScript("achievement_everything_counts") { } - bool OnCheck(Player* source, Unit* /*target*/) OVERRIDE + bool OnCheck(Player* source, Unit* target) OVERRIDE { - Battleground* bg = source->GetBattleground(); - if (!bg) - return false; - - if (bg->GetTypeID(true) != BATTLEGROUND_AV) - return false; - - if (static_cast<BattlegroundAV*>(bg)->IsBothMinesControlledByTeam(source->GetTeam())) - return true; + if (Battleground* bg = source->GetBattleground()) + return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_EVERYTHING_COUNTS, source, target); return false; } @@ -217,17 +187,10 @@ class achievement_bg_av_perfection : public AchievementCriteriaScript public: achievement_bg_av_perfection() : AchievementCriteriaScript("achievement_bg_av_perfection") { } - bool OnCheck(Player* source, Unit* /*target*/) OVERRIDE + bool OnCheck(Player* source, Unit* target) OVERRIDE { - Battleground* bg = source->GetBattleground(); - if (!bg) - return false; - - if (bg->GetTypeID(true) != BATTLEGROUND_AV) - return false; - - if (static_cast<BattlegroundAV*>(bg)->IsAllTowersControlledAndCaptainAlive(source->GetTeam())) - return true; + if (Battleground* bg = source->GetBattleground()) + return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_AV_PERFECTION, source, target); return false; } @@ -236,28 +199,12 @@ class achievement_bg_av_perfection : public AchievementCriteriaScript class achievement_bg_sa_defense_of_ancients : public AchievementCriteriaScript { public: - achievement_bg_sa_defense_of_ancients() : AchievementCriteriaScript("achievement_bg_sa_defense_of_ancients") - { - } + achievement_bg_sa_defense_of_ancients() : AchievementCriteriaScript("achievement_bg_sa_defense_of_ancients") { } - bool OnCheck(Player* player, Unit* /*target*/) OVERRIDE + bool OnCheck(Player* source, Unit* target) OVERRIDE { - if (!player) - return false; - - Battleground* battleground = player->GetBattleground(); - if (!battleground) - return false; - - BattlegroundSA* bg = static_cast<BattlegroundSA*>(battleground); - if (!bg) - return false; - - if (player->GetTeamId() == bg->Attackers) - return false; - - if (!bg->gateDestroyed) - return true; + if (Battleground* bg = source->GetBattleground()) + return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_DEFENSE_OF_THE_ANCIENTS, source, target); return false; } @@ -299,21 +246,10 @@ class achievement_not_even_a_scratch : public AchievementCriteriaScript public: achievement_not_even_a_scratch() : AchievementCriteriaScript("achievement_not_even_a_scratch") { } - bool OnCheck(Player* source, Unit* /*target*/) OVERRIDE + bool OnCheck(Player* source, Unit* target) OVERRIDE { - if (!source) - return false; - - Battleground* battleground = source->GetBattleground(); - if (!battleground) - return false; - - BattlegroundSA* bg = static_cast<BattlegroundSA*>(battleground); - if (!bg) - return false; - - if (bg->notEvenAScratch(source->GetTeam())) - return true; + if (Battleground* bg = source->GetBattleground()) + return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_NOT_EVEN_A_SCRATCH, source, target); return false; } |