Scripts/BoT: converted achievements to world state handling

This commit is contained in:
Ovahlord committed 2021-06-13 22:57:24 +02:00
1 parent b0df1fdca3
commit 1e9fd012e8
5 files changed
+35 -100

No files matched your search

@@ -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');
@@ -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<class AI>
AI* GetBastionOfTwilightAI(Creature* creature)
{
@@ -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();
}
@@ -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();
}
@@ -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();
}