diff options
Diffstat (limited to 'src/server/scripts')
4 files changed, 113 insertions, 1 deletions
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index 91cd8dee55c..7566d9bc410 100755 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -85,7 +85,6 @@ class instance_trial_of_the_crusader : public InstanceMapScript EventStage = 0; TributeChestGUID = 0; - DataDamageTwin = 0; MainGateDoorGUID = 0; EastPortcullisGUID = 0; diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp index 904566e13a4..8d668011f9a 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp @@ -41,6 +41,9 @@ class instance_archavon : public InstanceMapScript { EmalonGUID = 0; ToravonGUID = 0; + ArchavonDeath = 0; + EmalonDeath = 0; + KoralonDeath = 0; } void OnCreatureCreate(Creature* creature) @@ -73,9 +76,63 @@ class instance_archavon : public InstanceMapScript return 0; } + bool SetBossState(uint32 type, EncounterState state) + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + if (state != DONE) + return true; + + switch (type) + { + case DATA_ARCHAVON: + ArchavonDeath = time(NULL); + break; + case DATA_EMALON: + EmalonDeath = time(NULL); + break; + case DATA_KORALON: + KoralonDeath = time(NULL); + break; + default: + return true; + } + + // on every death of Archavon, Emalon and Koralon check our achievement + DoCastSpellOnPlayers(SPELL_EARTH_WIND_FIRE_ACHIEVEMENT_CHECK); + + return true; + } + + bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) + { + switch (criteria_id) + { + case CRITERIA_EARTH_WIND_FIRE_10: + case CRITERIA_EARTH_WIND_FIRE_25: + if (ArchavonDeath && EmalonDeath && KoralonDeath) + { + // instance difficulty check is already done in db (achievement_criteria_data) + // int() for Visual Studio, compile errors with abs(time_t) + return (abs(int(ArchavonDeath-EmalonDeath)) < MINUTE && \ + abs(int(EmalonDeath-KoralonDeath)) < MINUTE && \ + abs(int(KoralonDeath-ArchavonDeath)) < MINUTE); + } + break; + default: + break; + } + + return false; + } + private: uint64 EmalonGUID; uint64 ToravonGUID; + time_t ArchavonDeath; + time_t EmalonDeath; + time_t KoralonDeath; }; InstanceScript* GetInstanceScript(InstanceMap* map) const diff --git a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h index 4aa01e58f5f..04f50d3adeb 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h +++ b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h @@ -36,4 +36,15 @@ enum Data #define MAX_ENCOUNTER 4 +enum AchievementCriteriaIds +{ + CRITERIA_EARTH_WIND_FIRE_10 = 12018, + CRITERIA_EARTH_WIND_FIRE_25 = 12019, +}; + +enum AchievementSpells +{ + SPELL_EARTH_WIND_FIRE_ACHIEVEMENT_CHECK = 68308, +}; + #endif diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp index db09c12da0b..af966e3e22e 100755 --- a/src/server/scripts/World/achievement_scripts.cpp +++ b/src/server/scripts/World/achievement_scripts.cpp @@ -21,6 +21,7 @@ #include "BattlegroundWS.h" #include "BattlegroundIC.h" #include "BattlegroundSA.h" +#include "BattlegroundAV.h" #include "Vehicle.h" class achievement_storm_glory : public AchievementCriteriaScript @@ -207,6 +208,48 @@ public: } }; +class achievement_everything_counts : public AchievementCriteriaScript +{ + public: + achievement_everything_counts() : AchievementCriteriaScript("achievement_everything_counts") { } + + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + if (!bg) + return false; + + if (source->GetBattlegroundTypeId() != BATTLEGROUND_AV) + return false; + + if (static_cast<BattlegroundAV*>(bg)->IsBothMinesControlledByTeam(source->GetTeam())) + return true; + + return false; + } +}; + +class achievement_bg_av_perfection : public AchievementCriteriaScript +{ + public: + achievement_bg_av_perfection() : AchievementCriteriaScript("achievement_bg_av_perfection") { } + + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + if (!bg) + return false; + + if (source->GetBattlegroundTypeId() != BATTLEGROUND_AV) + return false; + + if (static_cast<BattlegroundAV*>(bg)->IsAllTowersControlledAndCaptainAlive(source->GetTeam())) + return true; + + return false; + } +}; + class achievement_wg_didnt_stand_a_chance : public AchievementCriteriaScript { public: @@ -269,6 +312,8 @@ void AddSC_achievement_scripts() new achievement_bg_sa_artillery(); new achievement_sickly_gazelle(); new achievement_wg_didnt_stand_a_chance(); + new achievement_everything_counts(); + new achievement_bg_av_perfection(); new achievement_arena_kills("achievement_arena_2v2_kills", ARENA_TYPE_2v2); new achievement_arena_kills("achievement_arena_3v3_kills", ARENA_TYPE_3v3); new achievement_arena_kills("achievement_arena_5v5_kills", ARENA_TYPE_5v5); |