aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSpp <spp@jorge.gr>2013-08-07 11:13:53 +0200
committerSpp <spp@jorge.gr>2013-08-07 11:13:53 +0200
commit33f8c3ead4da07ff024a94b5e8cf0d05c2ebc23a (patch)
treed53e38ab3e13e9989eb9cfed45dd4c30660f6ee3 /src
parentb05665660a2d47e8e0f75835fa3a09a49b8c4993 (diff)
Core/Battleground: Get rid of dinamic casts BattlegroundXX outside Battleground scope by implementing generic functions (2/2)
- CheckAchievementCriteriaMeet
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp6
-rw-r--r--src/server/game/Battlegrounds/Battleground.h11
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp11
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.h2
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp92
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.h5
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp20
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.h4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp13
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.h4
-rw-r--r--src/server/scripts/World/achievement_scripts.cpp104
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;
}