Scripts/BWD: converted remaining achievements to world state based handling

This commit is contained in:
Ovahlord committed 2021-06-13 17:10:56 +02:00
1 parent 5fd77a3b28
commit b0df1fdca3
7 files changed
+46 -139

No files matched your search

@@ -0,0 +1,12 @@
DELETE FROM `achievement_criteria_data` WHERE `ScriptName` IN
('achievement_parasite_evening',
'achievement_full_of_sound_and_fury',
'achievement_keeping_it_in_the_family',
'achievement_silence_is_golden');
DELETE FROM `world_states` WHERE `ID` IN (5640, 5643, 5652, 5655);
INSERT INTO `world_states` (`ID`, `DefaultValue`, `MapID`, `Comment`) VALUES
(5640, 0, 669, 'Blackwing Descent - Magmaw - Parasite Evening'),
(5643, 0, 669, 'Blackwing Descent - Chimaeron - Full of Sound and Fury'),
(5652, 1, 669, 'Blackwing Descent - Nefarian\'s End - Keeping it in the Family'),
(5655, 0, 669, 'Blackwing Descent - Atramedes - Silence is Golden');
@@ -42,7 +42,6 @@ enum BWDDataTypes
DATA_COLUMN_OF_LIGHT,
DATA_ATRAMEDES_INTRO,
DATA_ENTRANCE_INTRO,
DATA_NEFARIAN_ACHIEVEMENT_STATE,
DATA_LORD_VICTOR_NEFARIUS_GENERIC,
DATA_BOSS_DEFEATED,
DATA_HEROES_ENTERED_HALLS,
@@ -207,13 +206,22 @@ enum BWDSpells
enum BWDWorldStates
{
// Omnotron Defense System
WORLD_STATE_ID_STATIC_SHOCK = 5644,
WORLD_STATE_ID_POISON_BOMB = 5645,
WORLD_STATE_ID_ARCANE_ANNIHILATOR = 5646,
WORLD_STATE_ID_FLAMETHROWER = 5647,
WORLD_STATE_ID_STATIC_SHOCK = 5644,
WORLD_STATE_ID_POISON_BOMB = 5645,
WORLD_STATE_ID_ARCANE_ANNIHILATOR = 5646,
WORLD_STATE_ID_FLAMETHROWER = 5647,
// Magmaw
WORLD_STATE_ID_PARASITE_EVENING = 5640,
// Chimaeron
WORLD_STATE_ID_FULL_OF_SOUND_AND_FURY = 5643,
// Atramedes
WORLD_STATE_ID_SILENCE_IS_GOLDEN = 5655,
// Nefarian's End
WS_KEEPING_IT_IN_THE_FAMILY = 0
WORLD_STATE_ID_KEEPING_IT_IN_THE_FAMILY = 5652
};
template <class AI, class T>
@@ -19,6 +19,7 @@
#include "ScriptMgr.h"
#include "CommonPredicates.h"
#include "GridNotifiers.h"
#include "Map.h"
#include "MoveSpline.h"
#include "PassiveAI.h"
#include "ScriptedCreature.h"
@@ -130,7 +131,6 @@ enum Actions
// Atramedes
ACTION_START_INTRO = 0,
ACTION_HALT_REVERBERATING_FLAME = 1,
ACTION_FAIL_ACHIEVEMENT = 2,
// Lord Victor Nefarius
ACTION_DESTROY_SHIELD = 0,
@@ -166,7 +166,6 @@ enum Data
DATA_ADD_NOISY_PLAYER = 1,
DATA_REMOVE_NOISY_PLAYER = 2,
DATA_LAST_SHIELD_USER = 3,
DATA_ACHIEVEMENT_ENLIGIBLE = 4,
// Getter
DATA_IS_IN_AIR = 0,
@@ -188,7 +187,7 @@ Position const LordVictorNefariusSummonPosition = { 92.91319f, -223.9931f, 96.89
struct boss_atramedes : public BossAI
{
boss_atramedes(Creature* creature) : BossAI(creature, DATA_ATRAMEDES), _achievementEnligible(true) { }
boss_atramedes(Creature* creature) : BossAI(creature, DATA_ATRAMEDES) { }
void Reset() override
{
@@ -200,6 +199,7 @@ struct boss_atramedes : public BossAI
{
BossAI::JustEngagedWith(who);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
instance->instance->SetWorldState(WORLD_STATE_ID_SILENCE_IS_GOLDEN, 0);
Talk(SAY_AGGRO);
DoCastSelf(SPELL_DEVASTATION_TRIGGER);
DoCastSelf(SPELL_SOUND_BAR);
@@ -307,8 +307,6 @@ struct boss_atramedes : public BossAI
return (uint8(!_noisyPlayerGUIDs.empty()));
case DATA_IS_IN_INTRO_PHASE:
return (uint8(events.IsInPhase(PHASE_INTRO)));
case DATA_ACHIEVEMENT_ENLIGIBLE:
return (uint8(_achievementEnligible));
}
return 0;
@@ -411,9 +409,6 @@ struct boss_atramedes : public BossAI
events.ScheduleEvent(EVENT_MOVE_REVERBERATING_FLAME_TO_SHIELD, 2s, 0, PHASE_AIR);
}
break;
case ACTION_FAIL_ACHIEVEMENT:
_achievementEnligible = false;
break;
default:
break;
}
@@ -518,7 +513,6 @@ private:
ObjectGuid _lastShieldUserGUID;
ObjectGuid _lastUsedAncientDwarvenShieldGUID;
ObjectGuid _reverberatingFlameGUID;
bool _achievementEnligible;
};
struct npc_atramedes_ancient_dwarven_shield : public NullCreatureAI
@@ -842,8 +836,8 @@ class spell_atramedes_sound_bar : public AuraScript
target->CastSpell(target, SPELL_NOISY, aurEff);
}
else if (target->GetPower(POWER_ALTERNATE_POWER) >= 50)
if (Creature* atramedes = instance->GetCreature(DATA_ATRAMEDES))
atramedes->AI()->DoAction(ACTION_FAIL_ACHIEVEMENT);
if (!instance->instance->GetWorldStateValue(WORLD_STATE_ID_SILENCE_IS_GOLDEN))
instance->instance->SetWorldState(WORLD_STATE_ID_SILENCE_IS_GOLDEN, 1);
}
void Register() override
@@ -1039,23 +1033,6 @@ class spell_atramedes_apply_vehicle_periodic : public AuraScript
}
};
class achievement_silence_is_golden : public AchievementCriteriaScript
{
public:
achievement_silence_is_golden() : AchievementCriteriaScript("achievement_silence_is_golden") { }
bool OnCheck(Player* /*source*/, Unit* target) override
{
if (!target)
return false;
if (target->IsAIEnabled)
return target->GetAI()->GetData(DATA_ACHIEVEMENT_ENLIGIBLE);
return false;
}
};
void AddSC_boss_atramedes()
{
RegisterBlackwingDescentCreatureAI(boss_atramedes);
@@ -1078,5 +1055,4 @@ void AddSC_boss_atramedes()
RegisterSpellScript(spell_atramedes_destroy_shield);
RegisterSpellScript(spell_atramedes_pestered);
RegisterSpellScript(spell_atramedes_apply_vehicle_periodic);
new achievement_silence_is_golden();
}
@@ -125,11 +125,6 @@ enum GossipMenuMisc
NPC_TEXT_MISSING_KEY = 16565
};
enum Data
{
DATA_ACHIEVEMENT_ENLIGIBLE = 0
};
Position const LordVictorNefariusSummonPosition = { -113.8229f, 45.86111f, 80.36481f, 4.817109f };
struct boss_chimaeron : public BossAI
@@ -155,6 +150,7 @@ struct boss_chimaeron : public BossAI
{
BossAI::JustEngagedWith(who);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
instance->instance->SetWorldState(WORLD_STATE_ID_FULL_OF_SOUND_AND_FURY, 0);
me->SetReactState(REACT_AGGRESSIVE);
events.SetPhase(PHASE_1);
events.ScheduleEvent(EVENT_CAUSTIC_SLIME, 5s, 0, PHASE_1);
@@ -213,7 +209,11 @@ struct boss_chimaeron : public BossAI
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
{
_killedPlayerCount++;
if (_killedPlayerCount == 3)
instance->instance->SetWorldState(WORLD_STATE_ID_FULL_OF_SOUND_AND_FURY, 1);
}
}
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
@@ -313,19 +313,6 @@ struct boss_chimaeron : public BossAI
}
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
case DATA_ACHIEVEMENT_ENLIGIBLE:
return uint8(_killedPlayerCount <= 2);
default:
return 0;
}
return 0;
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim() && !events.IsInPhase(PHASE_ASLEEP) && !_isInFeud)
@@ -697,23 +684,6 @@ class spell_chimaeron_shadow_whip : public SpellScript
}
};
class achievement_full_of_sound_and_fury : public AchievementCriteriaScript
{
public:
achievement_full_of_sound_and_fury() : AchievementCriteriaScript("achievement_full_of_sound_and_fury") { }
bool OnCheck(Player* /*source*/, Unit* target) override
{
if (!target)
return false;
if (target->IsAIEnabled)
return target->GetAI()->GetData(DATA_ACHIEVEMENT_ENLIGIBLE);
return false;
}
};
void AddSC_boss_chimaeron()
{
RegisterBlackwingDescentCreatureAI(boss_chimaeron);
@@ -726,5 +696,4 @@ void AddSC_boss_chimaeron()
RegisterSpellScript(spell_chimaeron_reroute_power);
RegisterSpellScript(spell_chimaeron_feud);
RegisterSpellScript(spell_chimaeron_shadow_whip);
new achievement_full_of_sound_and_fury();
}
@@ -133,7 +133,6 @@ enum Actions
ACTION_DISABLE_MOUNTING = 2,
ACTION_EXPOSE_HEAD = 4,
ACTION_COVER_HEAD = 5,
ACTION_FAIL_ACHIEVEMT = 3,
// Nefarian
ACTION_SCHEDULE_SHADOW_BREATH = 0,
@@ -174,8 +173,7 @@ enum VehicleSeats
enum Data
{
DATA_FREE_PINCER = 0,
DATA_ACHIEVEMENT_STATE = 1
DATA_FREE_PINCER = 0
};
enum MovePoints
@@ -212,7 +210,7 @@ Position const NefarianIntroSummonPos = { -390.1042f, 40.88411f, 207.8586f, 0
struct boss_magmaw : public BossAI
{
boss_magmaw(Creature* creature) : BossAI(creature, DATA_MAGMAW),
_magmaProjectileCount(0), _achievementEnligible(true), _headEngaged(false), _heroicPhaseTwoActive(!IsHeroic())
_magmaProjectileCount(0), _headEngaged(false), _heroicPhaseTwoActive(!IsHeroic())
{
me->SetReactState(REACT_PASSIVE);
}
@@ -237,6 +235,7 @@ struct boss_magmaw : public BossAI
BossAI::JustEngagedWith(who);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, FRAME_PRIORITY_MAGMAW);
instance->instance->SetWorldState(WORLD_STATE_ID_PARASITE_EVENING, 0);
me->SetReactState(REACT_AGGRESSIVE);
events.SetPhase(PHASE_COMBAT);
@@ -330,14 +329,6 @@ struct boss_magmaw : public BossAI
}
}
uint32 GetData(uint32 type) const override
{
if (type == DATA_ACHIEVEMENT_STATE)
return _achievementEnligible;
return 0;
}
ObjectGuid GetGUID(int32 type) const override
{
switch (type)
@@ -432,9 +423,6 @@ struct boss_magmaw : public BossAI
head->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
break;
case ACTION_FAIL_ACHIEVEMT:
_achievementEnligible = false;
break;
default:
break;
}
@@ -604,7 +592,6 @@ private:
std::array<ObjectGuid, MAX_BODY_PARTS> _bodyPartGUIDs;
uint8 _magmaProjectileCount;
bool _achievementEnligible;
bool _headEngaged;
bool _heroicPhaseTwoActive;
};
@@ -714,8 +701,8 @@ struct npc_magmaw_lava_parasite : public ScriptedAI
me->AttackStop();
me->SetReactState(REACT_PASSIVE);
me->DespawnOrUnsummon(4s);
if (Creature* magmaw = _instance->GetCreature(DATA_MAGMAW))
magmaw->AI()->DoAction(ACTION_FAIL_ACHIEVEMT);
if (!_instance->instance->GetWorldStateValue(WORLD_STATE_ID_PARASITE_EVENING))
_instance->instance->SetWorldState(WORLD_STATE_ID_PARASITE_EVENING, 1);
}
}
@@ -1271,22 +1258,6 @@ class spell_magmaw_captured : public AuraScript
}
};
class achievement_parasite_evening : public AchievementCriteriaScript
{
public:
achievement_parasite_evening() : AchievementCriteriaScript("achievement_parasite_evening") { }
bool OnCheck(Player* /*source*/, Unit* target) override
{
if (!target)
return false;
if (target->IsAIEnabled)
return target->GetAI()->GetData(DATA_ACHIEVEMENT_STATE);
return false;
}
};
void AddSC_boss_magmaw()
{
@@ -1308,5 +1279,4 @@ void AddSC_boss_magmaw()
RegisterSpellScript(spell_magmaw_massive_crash);
RegisterSpellScript(spell_magmaw_impale_self);
RegisterSpellScript(spell_magmaw_captured);
new achievement_parasite_evening();
}
@@ -291,8 +291,7 @@ static OnyxiaChainData OnyxiaChainInfo[] =
enum Misc
{
SOUND_ID_ROAR = 7274,
WS_ACHIEVEMENT_CRITERIA = 5652
SOUND_ID_ROAR = 7274
};
Position const NefarianSummonPosition = { -166.655f, -224.602f, 40.48163f, 0.0f };
@@ -438,7 +437,6 @@ struct boss_nefarians_end : public BossAI
}
summons.DespawnAll();
instance->SetData(DATA_NEFARIAN_ACHIEVEMENT_STATE, 1);
instance->SetBossState(DATA_NEFARIANS_END, FAIL);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_EXPLOSIVE_CINDERS);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DOMINION_OVERRIDE_ACTION_BAR);
@@ -781,7 +779,7 @@ struct boss_nefarians_end : public BossAI
break;
case EVENT_LAND_PHASE_THREE:
if (me->GetHealthPct() > 50.f)
instance->SetData(DATA_NEFARIAN_ACHIEVEMENT_STATE, 0);
instance->instance->SetWorldState(WORLD_STATE_ID_KEEPING_IT_IN_THE_FAMILY, 0);
me->RemoveAurasDueToSpell(SPELL_NEFARIAN_PHASE_2_HEALTH_AURA);
me->SendSetPlayHoverAnim(true);
@@ -924,7 +922,10 @@ struct npc_nefarians_end_onyxia : public ScriptedAI
void JustEngagedWith(Unit* /*who*/) override
{
if (_instance->GetBossState(DATA_NEFARIANS_END) != IN_PROGRESS)
{
_instance->SetBossState(DATA_NEFARIANS_END, IN_PROGRESS);
_instance->instance->SetWorldState(WORLD_STATE_ID_KEEPING_IT_IN_THE_FAMILY, 1);
}
_instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, FRAME_INDEX_ONYXIA);
@@ -2051,21 +2052,6 @@ private:
InstanceScript* _instance;
};
class achievement_keeping_it_in_the_family : public AchievementCriteriaScript
{
public:
achievement_keeping_it_in_the_family() : AchievementCriteriaScript("achievement_keeping_it_in_the_family") { }
bool OnCheck(Player* /*source*/, Unit* target) override
{
InstanceScript* instance = target->GetInstanceScript();
if (!instance)
return false;
return instance->GetData(DATA_NEFARIAN_ACHIEVEMENT_STATE);
}
};
void AddSC_boss_nefarians_end()
{
RegisterBlackwingDescentCreatureAI(boss_nefarians_end);
@@ -2098,5 +2084,4 @@ void AddSC_boss_nefarians_end()
RegisterSpellScript(spell_nefarians_end_siphon_power);
RegisterSpellScript(spell_nefarians_end_explosive_cinders);
RegisterGameObjectAI(go_nefarians_end_orb_of_culmination);
new achievement_keeping_it_in_the_family();
}
@@ -131,7 +131,6 @@ class instance_blackwing_descent : public InstanceMapScript
_deadDwarfSpiritsLeft = 0;
_deadDwarfSpiritsRight = 0;
_atramedesIntroState = NOT_STARTED;
_nefarianAchievementEligible = true;
_nefariansEndIntroDone = false;
}
@@ -360,10 +359,6 @@ class instance_blackwing_descent : public InstanceMapScript
nefarius->AI()->SetData(DATA_HEROES_ENTERED_HALLS, DONE);
break;
}
case DATA_NEFARIAN_ACHIEVEMENT_STATE:
_nefarianAchievementEligible = uint8(data);
DoUpdateWorldState(WS_KEEPING_IT_IN_THE_FAMILY, uint8(_nefarianAchievementEligible));
break;
case DATA_NEFARIANS_END_INTRO_DONE:
_nefariansEndIntroDone = uint8(data);
break;
@@ -375,19 +370,12 @@ class instance_blackwing_descent : public InstanceMapScript
}
}
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& data) override
{
data.Worldstates.emplace_back(uint32(WS_KEEPING_IT_IN_THE_FAMILY), uint32(_nefarianAchievementEligible));
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
case DATA_ATRAMEDES_INTRO:
return _atramedesIntroState;
case DATA_NEFARIAN_ACHIEVEMENT_STATE:
return uint8(_nefarianAchievementEligible);
case DATA_NEFARIANS_END_INTRO_DONE:
return uint8(_nefariansEndIntroDone);
}
@@ -528,7 +516,6 @@ class instance_blackwing_descent : public InstanceMapScript
uint8 _deadDwarfSpiritsLeft;
uint8 _deadDwarfSpiritsRight;
uint8 _atramedesIntroState;
bool _nefarianAchievementEligible;
bool _nefariansEndIntroDone;
bool IsNefarianAvailable() const