From 1e9fd012e80e8ae2dd055164c47ce70155bdf5a4 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sun, 13 Jun 2021 22:57:24 +0200 Subject: [PATCH] Scripts/BoT: converted achievements to world state handling --- .../world/4.3.4/2021_06_13_04_world.sql | 10 +++++ .../BastionOfTwilight/bastion_of_twilight.h | 14 ++++++- .../boss_ascendant_council.cpp | 39 ++----------------- .../BastionOfTwilight/boss_chogall.cpp | 39 ++----------------- .../boss_halfus_wyrmbreaker.cpp | 33 ++-------------- 5 files changed, 35 insertions(+), 100 deletions(-) create mode 100644 sql/updates/world/4.3.4/2021_06_13_04_world.sql diff --git a/sql/updates/world/4.3.4/2021_06_13_04_world.sql b/sql/updates/world/4.3.4/2021_06_13_04_world.sql new file mode 100644 index 0000000000..a5f9b47829 --- /dev/null +++ b/sql/updates/world/4.3.4/2021_06_13_04_world.sql @@ -0,0 +1,10 @@ +DELETE FROM `achievement_criteria_data` WHERE `ScriptName` IN +('achievement_the_only_escape', +'achievement_elementary', +'achievement_the_abyss_will_gaze_into_you'); + +DELETE FROM `world_states` WHERE `ID` IN (5607, 5621, 5659); +INSERT INTO `world_states` (`ID`, `DefaultValue`, `MapID`, `Comment`) VALUES +(5607, 0, 671, 'Bastion of Twilight - Halfus Wyrmbreaker - The Only Escape'), +(5621, 0, 671, 'Bastion of Twilight - Ascendant Council - Elementary'), +(5659, 0, 671, 'Bastion of Twilight - Cho\'Gall - The Abyss Will Gate Back Into You'); diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h b/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h index d64a642303..8257f21b59 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/bastion_of_twilight.h @@ -78,7 +78,7 @@ enum BoTDataTypes enum BoTDataStates { - DRAGON_BUFFS_HALFUS_WYRMBREAKER, + DRAGON_BUFFS_HALFUS_WYRMBREAKER = 0, DRAGON_BUFFS_PROTO_BEHEMOTH, }; @@ -194,6 +194,18 @@ enum BoTSpells SPELL_BERSERK = 26662 }; +enum BoTWorldStates +{ + // Halfus Wyrmbreaker + WORLD_STATE_ID_THE_ONLY_ESCAPE = 5607, + + // Ascendant Council + WORLD_STATE_ID_ELEMENTARY = 5621, + + // Cho'Gall + WORLD_STATE_ID_THE_ABYSS_WILL_GAZE_BACK_INTO_YOU = 5659 +}; + template AI* GetBastionOfTwilightAI(Creature* creature) { diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_ascendant_council.cpp b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_ascendant_council.cpp index 7eff6f2d0b..ff334a88c0 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_ascendant_council.cpp +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_ascendant_council.cpp @@ -294,11 +294,6 @@ enum MovePoints POINT_NONE = 0 }; -enum AchievementData -{ - DATA_ELEMENTARY = 1 -}; - enum SummonProperties { PROPERTY_DEFAULT = 64 @@ -338,6 +333,7 @@ struct boss_ascendant_council_controller final : public BossAI break; instance->SetBossState(DATA_ASCENDANT_COUNCIL, IN_PROGRESS); + instance->instance->SetWorldState(WORLD_STATE_ID_ELEMENTARY, 0); if (Creature* feludius = instance->GetCreature(DATA_FELUDIUS)) { @@ -1276,7 +1272,7 @@ private: struct npc_elementium_monstrosity final : public ScriptedAI { npc_elementium_monstrosity(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summons(me), _mergedHealth(0), - _mergedTargets(0), _liquidIceCount(0), _achievementEnligible(true) + _mergedTargets(0), _liquidIceCount(0) { me->SetReactState(REACT_PASSIVE); } @@ -1322,9 +1318,9 @@ struct npc_elementium_monstrosity final : public ScriptedAI if (summon->GetEntry() == NPC_LIQUID_ICE) { - _liquidIceCount++; + ++_liquidIceCount; if (_liquidIceCount == 2) - _achievementEnligible = false; + _instance->instance->SetWorldState(WORLD_STATE_ID_ELEMENTARY, 1); } } @@ -1346,14 +1342,6 @@ struct npc_elementium_monstrosity final : public ScriptedAI } } - uint32 GetData(uint32 type) const override - { - if (type == DATA_ELEMENTARY) - return _achievementEnligible; - - return 0; - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim() && !_events.IsInPhase(PHASE_INTRO)) @@ -1399,7 +1387,6 @@ private: uint32 _mergedHealth; uint8 _mergedTargets; uint8 _liquidIceCount; - bool _achievementEnligible; }; struct npc_ascendant_council_violent_cyclone final : public ScriptedAI @@ -2572,23 +2559,6 @@ class spell_elementium_monstrosity_gravity_crush final : public SpellScript } }; -class achievement_elementary final : public AchievementCriteriaScript -{ - public: - achievement_elementary() : AchievementCriteriaScript("achievement_elementary") { } - - bool OnCheck(Player* /*source*/, Unit* target) override - { - if (!target) - return false; - - if (target->IsAIEnabled) - return target->GetAI()->GetData(DATA_ELEMENTARY); - - return false; - } -}; - void AddSC_boss_ascendant_council() { RegisterBastionOfTwilightCreatureAI(boss_ascendant_council_controller); @@ -2636,5 +2606,4 @@ void AddSC_boss_ascendant_council() RegisterSpellScript(spell_elementium_monstrosity_liquid_ice); RegisterSpellScript(spell_elementium_monstrosity_electric_instability); RegisterSpellScript(spell_elementium_monstrosity_gravity_crush); - new achievement_elementary(); } diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_chogall.cpp b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_chogall.cpp index 78648a617b..8fe1553072 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_chogall.cpp +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_chogall.cpp @@ -166,16 +166,9 @@ enum Phases PHASE_HEROIC_DEATH }; -enum Actions -{ - // 1 - 6 used by header file - ACTION_FAIL_ACHIEVEMENT = 7 -}; - enum Data { - DATA_ELEMENTAL_POWER_STACKS = 0, - DATA_ABYSS_WILL_GAZE_INTO_YOU = 1 + DATA_ELEMENTAL_POWER_STACKS = 0 }; enum Corruption @@ -245,8 +238,8 @@ namespace CorruptionHandler // Achievement check if (power > CORRUPTION_ACHIEVEMENT_CAP) if (InstanceScript* instance = target->GetInstanceScript()) - if (Creature* chogall = instance->GetCreature(DATA_CHOGALL)) - chogall->AI()->DoAction(ACTION_FAIL_ACHIEVEMENT); + if (!instance->instance->GetWorldStateValue(WORLD_STATE_ID_THE_ABYSS_WILL_GAZE_BACK_INTO_YOU)) + instance->instance->SetWorldState(WORLD_STATE_ID_THE_ABYSS_WILL_GAZE_BACK_INTO_YOU, 1); } } @@ -299,7 +292,6 @@ struct boss_chogall final : public BossAI _elementalPowerStacks = 0; _firstDarkenedCreations = true; _allowDeath = true; - _achievementEnligibe = true; } void JustEngagedWith(Unit* who) override @@ -307,6 +299,7 @@ struct boss_chogall final : public BossAI BossAI::JustEngagedWith(who); Talk(SAY_AGGRO); instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + instance->instance->SetWorldState(WORLD_STATE_ID_THE_ABYSS_WILL_GAZE_BACK_INTO_YOU, 0); DoCastSelf(SPELL_CORRUPTED_BLOOD); events.SetPhase(PHASE_1); events.ScheduleEvent(EVENT_FURY_OF_CHOGALL, 57s + 800ms); @@ -395,9 +388,6 @@ struct boss_chogall final : public BossAI case ACTION_TALK_CHOGALL_INTRO: Talk(SAY_INTRO); break; - case ACTION_FAIL_ACHIEVEMENT: - _achievementEnligibe = false; - break; default: break; } @@ -425,8 +415,6 @@ struct boss_chogall final : public BossAI { case DATA_ELEMENTAL_POWER_STACKS: return _elementalPowerStacks; - case DATA_ABYSS_WILL_GAZE_INTO_YOU: - return _achievementEnligibe; } return 0; } @@ -557,7 +545,6 @@ private: uint8 _elementalPowerStacks; bool _firstDarkenedCreations; bool _allowDeath; - bool _achievementEnligibe; }; class SpilledBloodAuraEvent : public BasicEvent @@ -1394,23 +1381,6 @@ class spell_chogall_debilitating_beam final : public AuraScript } }; -class achievement_the_abyss_will_gaze_into_you final : public AchievementCriteriaScript -{ - public: - achievement_the_abyss_will_gaze_into_you() : AchievementCriteriaScript("achievement_the_abyss_will_gaze_into_you") { } - - bool OnCheck(Player* /*source*/, Unit* target) override - { - if (!target) - return false; - - if (target->IsAIEnabled) - return target->GetAI()->GetData(DATA_ABYSS_WILL_GAZE_INTO_YOU); - - return false; - } -}; - void AddSC_boss_chogall() { RegisterBastionOfTwilightCreatureAI(boss_chogall); @@ -1446,5 +1416,4 @@ void AddSC_boss_chogall() RegisterSpellScript(spell_chogall_corruption_malformation); RegisterSpellScript(spell_chogall_shadow_bolt); RegisterSpellScript(spell_chogall_debilitating_beam); - new achievement_the_abyss_will_gaze_into_you(); } diff --git a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_halfus_wyrmbreaker.cpp b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_halfus_wyrmbreaker.cpp index c7a6500e3f..cd3d30e53a 100644 --- a/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_halfus_wyrmbreaker.cpp +++ b/src/server/scripts/EasternKingdoms/BastionOfTwilight/boss_halfus_wyrmbreaker.cpp @@ -82,11 +82,6 @@ enum Events EVENT_MOVE_OUT_OF_CAGE }; -enum AchievementData -{ - DATA_THE_ONLY_ESCAPE = 1 -}; - enum Texts { // Halfus Wyrmbreaker @@ -174,7 +169,8 @@ struct boss_halfus_wyrmbreaker final : 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_THE_ONLY_ESCAPE, 0); events.ScheduleEvent(EVENT_BERSERK, 10min); if (Creature* protoBehemoth = instance->GetCreature(DATA_PROTO_BEHEMOTH)) @@ -241,11 +237,13 @@ struct boss_halfus_wyrmbreaker final : public BossAI if (_theOnlyEscapeAchievementState == NOT_STARTED) { _theOnlyEscapeAchievementState = IN_PROGRESS; + instance->instance->SetWorldState(WORLD_STATE_ID_THE_ONLY_ESCAPE, 1); events.ScheduleEvent(EVENT_RESET_ACHIEVEMT, Seconds(10)); } else if (_theOnlyEscapeAchievementState == IN_PROGRESS) { _theOnlyEscapeAchievementState = DONE; + instance->instance->SetWorldState(WORLD_STATE_ID_THE_ONLY_ESCAPE, 2); events.CancelEvent(EVENT_RESET_ACHIEVEMT); } break; @@ -281,14 +279,6 @@ struct boss_halfus_wyrmbreaker final : public BossAI } } - uint32 GetData(uint32 type) const override - { - if (type == DATA_THE_ONLY_ESCAPE) - return _theOnlyEscapeAchievementState; - - return 0; - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -700,20 +690,6 @@ class spell_halfus_dancing_flames final : public SpellScript } }; -class achievement_the_only_escape final : public AchievementCriteriaScript -{ - public: - achievement_the_only_escape() : AchievementCriteriaScript("achievement_the_only_escape") { } - - bool OnCheck(Player* /*source*/, Unit* target) - { - if (target && target->IsAIEnabled) - return (target->GetAI()->GetData(DATA_THE_ONLY_ESCAPE) == DONE); - - return false; - } -}; - void AddSC_boss_halfus_wyrmbreaker() { RegisterBastionOfTwilightCreatureAI(boss_halfus_wyrmbreaker); @@ -725,5 +701,4 @@ void AddSC_boss_halfus_wyrmbreaker() RegisterSpellScript(spell_halfus_stone_touch); RegisterSpellScript(spell_halfus_cyclone_winds); RegisterSpellScript(spell_halfus_dancing_flames); - new achievement_the_only_escape(); }