mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 16:38:42 +01:00
Core/Battleground: Get rid of dinamic casts BattlegroundXX outside Battleground scope by implementing generic functions (2/2)
- CheckAchievementCriteriaMeet
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 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;
|
||||
|
||||
if (!m_CaptainAlive[1])
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
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;
|
||||
|
||||
if (!m_CaptainAlive[1])
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return Battleground::CheckAchievementCriteriaMeet(criteriaId, source, target, miscValue);
|
||||
}
|
||||
|
||||
uint32 BattlegroundAV::GetPrematureWinner()
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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 (Battleground* bg = source->GetBattleground())
|
||||
return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_RESILIENT_VICTORY, source, target);
|
||||
|
||||
if (bg->GetTypeID(true) != BATTLEGROUND_AB)
|
||||
return false;
|
||||
|
||||
if (!static_cast<BattlegroundAB*>(bg)->IsTeamScores500Disadvantage(source->GetTeam()))
|
||||
return false;
|
||||
|
||||
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 (Battleground* bg = source->GetBattleground())
|
||||
return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_SAVE_THE_DAY, source, target);
|
||||
|
||||
if (Player const* player = target->ToPlayer())
|
||||
{
|
||||
Battleground* bg = source->GetBattleground();
|
||||
if (!bg)
|
||||
return false;
|
||||
|
||||
if (bg->GetTypeID(true) != BATTLEGROUND_WS)
|
||||
return false;
|
||||
|
||||
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* source, Unit* target) OVERRIDE
|
||||
{
|
||||
}
|
||||
|
||||
bool OnCheck(Player* player, 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user