From edb4df4ffcd60cc4ceda9ce1d05e34e585dca79d Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 14 Jun 2021 11:11:10 +0200 Subject: [PATCH] Scripts/SFK: converted achievements to world state handling --- .../world/4.3.4/2021_06_14_00_world.sql | 8 +++ .../ShadowfangKeep/boss_baron_ashbury.cpp | 56 ++++-------------- .../boss_commander_springvale.cpp | 59 +++---------------- .../ShadowfangKeep/shadowfang_keep.h | 9 +++ 4 files changed, 38 insertions(+), 94 deletions(-) create mode 100644 sql/updates/world/4.3.4/2021_06_14_00_world.sql diff --git a/sql/updates/world/4.3.4/2021_06_14_00_world.sql b/sql/updates/world/4.3.4/2021_06_14_00_world.sql new file mode 100644 index 00000000000..b0b0f857e51 --- /dev/null +++ b/sql/updates/world/4.3.4/2021_06_14_00_world.sql @@ -0,0 +1,8 @@ +DELETE FROM `achievement_criteria_data` WHERE `ScriptName` IN ( +'achievement_pardon_denied', +'achievement_to_the_ground'); + +DELETE FROM `world_states` WHERE `ID` IN (5670, 5672); +INSERT INTO `world_states` (`ID`, `DefaultValue`, `MapID`, `Comment`) VALUES +(5670, 0, 33, 'Shadowfang Keep - Baron Ashbury - Pardon Denied'), +(5672, 0, 33, 'Shadowfang Keep - Commander Srpingvale - To the Ground!'); diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_baron_ashbury.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_baron_ashbury.cpp index 66a41cb34ea..ee1a95a4af6 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_baron_ashbury.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_baron_ashbury.cpp @@ -35,7 +35,8 @@ enum Spells SPELL_PAIN_AND_SUFFERING_DUMMY = 93605, SPELL_WRACKING_PAIN = 93720, SPELL_DARK_ARCHANGEL_FORM = 93757, - SPELL_CALAMITY = 93812 + SPELL_CALAMITY = 93812, + SPELL_STAY_OF_EXECUTION_HEAL = 93706 }; #define SPELL_STAY_OF_EXECUTION RAID_MODE(93468, 93705) @@ -62,11 +63,6 @@ enum Events EVENT_DARK_ARCHANGEL_FORM }; -enum AchievementData -{ - DATA_PARDON_DENIED = 1 -}; - struct boss_baron_ashbury : public BossAI { boss_baron_ashbury(Creature* creature) : BossAI(creature, DATA_BARON_ASHBURY) @@ -77,7 +73,6 @@ struct boss_baron_ashbury : public BossAI void Initialize() { _phaseTwoTriggered = false; - _pardonDenied = true; me->MakeInterruptable(false); } @@ -91,7 +86,8 @@ struct boss_baron_ashbury : public BossAI { BossAI::JustEngagedWith(who); Talk(SAY_AGGRO); - instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + instance->instance->SetWorldState(WORLD_STATE_ID_PARDON_DENIED, 0); events.ScheduleEvent(EVENT_ASPHYXIATE, IsHeroic() ? 20s + 500ms : 15s + 500ms); events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 6s); @@ -114,6 +110,15 @@ struct boss_baron_ashbury : public BossAI _DespawnAtEvade(); } + void HealReceived(Unit* healer, uint32& /*heal*/) override + { + if (healer != me) + return; + + if (!instance->instance->GetWorldStateValue(WORLD_STATE_ID_PARDON_DENIED)) + instance->instance->SetWorldState(WORLD_STATE_ID_PARDON_DENIED, 1); + } + void DamageTaken(Unit* /*attacker*/, uint32& damage) override { if (me->HealthBelowPctDamaged(25, damage) && !_phaseTwoTriggered && IsHeroic()) @@ -139,28 +144,12 @@ struct boss_baron_ashbury : public BossAI if (spell->Id == SPELL_STAY_OF_EXECUTION) { - // Failing achievement when Baron Ashbury finished channeling Stay of Execution - if (reason == SPELL_FINISHED_CHANNELING_COMPLETE && IsHeroic()) - _pardonDenied = false; - me->SetReactState(REACT_AGGRESSIVE); me->resetAttackTimer(); events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 500ms); } } - uint32 GetData(uint32 type) const override - { - switch (type) - { - case DATA_PARDON_DENIED: - return _pardonDenied; - default: - break; - } - return 0; - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -218,7 +207,6 @@ struct boss_baron_ashbury : public BossAI } private: bool _phaseTwoTriggered; - bool _pardonDenied; }; class spell_ashbury_asphyxiate : public AuraScript @@ -300,28 +288,10 @@ class spell_ashbury_dark_archangel_form : public AuraScript } }; -class achievement_pardon_denied : public AchievementCriteriaScript -{ - public: - achievement_pardon_denied() : AchievementCriteriaScript("achievement_pardon_denied") { } - - bool OnCheck(Player* /*source*/, Unit* target) - { - if (!target) - return false; - - if (target->GetMap()->IsHeroic()) - return target->GetAI()->GetData(DATA_PARDON_DENIED); - - return false; - } -}; - void AddSC_boss_baron_ashbury() { RegisterShadowfangKeepCreatureAI(boss_baron_ashbury); RegisterSpellScript(spell_ashbury_asphyxiate); RegisterSpellScript(spell_ashbury_pain_and_suffering); RegisterSpellScript(spell_ashbury_dark_archangel_form); - new achievement_pardon_denied(); } diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_commander_springvale.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_commander_springvale.cpp index 527d0f6fecc..cf3914701c9 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_commander_springvale.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_commander_springvale.cpp @@ -84,13 +84,7 @@ enum Events enum Actions { - ACTION_UNHOLY_POWER = 1, - ACTION_TO_THE_GROUND -}; - -enum AchievementData -{ - DATA_TO_THE_GROUND = 1 + ACTION_UNHOLY_POWER = 1 }; // Heroic additional adds @@ -116,7 +110,6 @@ public: void Reset() override { _Reset(); - _toTheGround = true; if (IsHeroic()) { DoSummon(NPC_WAILING_GUARDSMAN, GuardsmanPos, 4000, TEMPSUMMON_CORPSE_TIMED_DESPAWN); @@ -185,18 +178,6 @@ public: } } - uint32 GetData(uint32 type) const override - { - switch (type) - { - case DATA_TO_THE_GROUND: - return _toTheGround; - default: - break; - } - return 0; - } - void DoAction(int32 action) override { switch (action) @@ -219,9 +200,6 @@ public: else events.ScheduleEvent(EVENT_SHIELD_OF_THE_PERFIDIOUS, Seconds(1)); break; - case ACTION_TO_THE_GROUND: - _toTheGround = false; - break; default: break; } @@ -276,10 +254,8 @@ public: } DoMeleeAttackIfReady(); } - private: - bool _toTheGround; - }; + CreatureAI* GetAI(Creature *creature) const override { return GetShadowfangKeepAI(creature); @@ -522,20 +498,19 @@ public: void HandleStacks() { - if (Unit* target = GetHitUnit()) + if (Creature* target = GetHitCreature()) { Aura* aura = nullptr; aura = target->GetAura(SPELL_UNHOLY_POWER_HC); if (!aura) target->GetAura(SPELL_UNHOLY_POWER); - if (aura) - if (aura->GetStackAmount() == 3) - if (target->GetTypeId() == TYPEID_UNIT && target->IsAIEnabled) - target->ToCreature()->AI()->DoAction(ACTION_UNHOLY_POWER); + if (aura && aura->GetStackAmount() == 3 && target->IsAIEnabled) + target->ToCreature()->AI()->DoAction(ACTION_UNHOLY_POWER); - if (target->GetTypeId() == TYPEID_UNIT && target->IsAIEnabled) - target->ToCreature()->AI()->DoAction(ACTION_TO_THE_GROUND); + if (InstanceScript* instance = target->GetInstanceScript()) + if (!instance->instance->GetWorldStateValue(WORLD_STATE_ID_TO_THE_GROUND)) + instance->instance->SetWorldState(WORLD_STATE_ID_TO_THE_GROUND, 1); } } @@ -551,23 +526,6 @@ public: } }; -class achievement_to_the_ground : public AchievementCriteriaScript -{ -public: - achievement_to_the_ground() : AchievementCriteriaScript("achievement_to_the_ground") { } - - bool OnCheck(Player* /*source*/, Unit* target) - { - if (!target) - return false; - - if (target->GetMap()->IsHeroic()) - return target->GetAI()->GetData(DATA_TO_THE_GROUND); - - return false; - } -}; - void AddSC_boss_commander_springvale() { new boss_commander_springvale(); @@ -576,5 +534,4 @@ void AddSC_boss_commander_springvale() new spell_sfk_forsaken_ability(); new spell_sfk_unholy_power(); new spell_sfk_unholy_empowerment(); - new achievement_to_the_ground(); } diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h index e60e62d6ec5..073782a228c 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h @@ -94,6 +94,15 @@ enum SKGameObjectIds GO_ARUGALS_LAIR = 18971 }; +enum SKWorldStates +{ + // Baron Ashbury + WORLD_STATE_ID_PARDON_DENIED = 5670, + + // Commander Springvale + WORLD_STATE_ID_TO_THE_GROUND = 5672 +}; + template AI* GetShadowfangKeepAI(Creature* creature) {