Scripts/HoO: reworked and fixed Temple Guardian Anhuur's script:

* moved removed grid searcher and moved functionality to instance script and simplified handling
* properly placed event schedules in their intended AI hook
* simplified some spell scripts and overall event processes
This commit is contained in:
Ovahlord
2018-06-10 12:52:05 +02:00
parent 9e260e7e6f
commit 8dcfab531d
4 changed files with 145 additions and 86 deletions

View File

@@ -34,7 +34,7 @@ enum Texts
SAY_AGGRO = 0,
SAY_SHIELD = 1,
EMOTE_SHIELD = 2,
EMOTE_UNSHIELD = 3,
EMOTE_SHIELD_REMOVED = 3,
SAY_KILL = 4,
SAY_DEATH = 5
};
@@ -64,13 +64,7 @@ enum Spells
SPELL_DEACTIVATE_BEACONS = 76600,
// Cave In Stalker (eyes)
SPELL_BURNING_LIGHT_SEAR = 75194,
// Cave In Stalker (beacons)
SPELL_SHIELD_VISUAL_LEFT = 83697,
SPELL_SHIELD_VISUAL_RIGHT = 83698,
SPELL_BEAM_OF_LIGHT_LEFT = 74930,
SPELL_BEAM_OF_LIGHT_RIGHT = 76573
SPELL_BURNING_LIGHT_SEAR = 75194
};
enum Phases
@@ -109,13 +103,8 @@ public:
{
Initialize();
_Reset();
CleanStalkers();
me->MakeInterruptable(false);
me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT);
DoCastAOE(SPELL_DEACTIVATE_BEACONS, true);
me->SetReactState(REACT_AGGRESSIVE);
events.SetPhase(PHASE_FIGHT);
ScheduleEvents();
}
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
@@ -136,16 +125,24 @@ public:
void DoAction(int32 action) override
{
if (action == ACTION_DISABLE_BEACON_L)
_leftBeaconDisabled = true;
else if (action == ACTION_DISABLE_BEACON_R)
_rightBeaconDisabled = true;
else if (action == ACTION_HYMN_EXPIRED) // We manually deactivate beacons.
DoCastAOE(SPELL_DEACTIVATE_BEACONS, true);
switch (action)
{
case ACTION_DISABLE_BEACON_L:
_leftBeaconDisabled = true;
break;
case ACTION_DISABLE_BEACON_R:
_rightBeaconDisabled = true;
break;
case ACTION_HYMN_EXPIRED:
RemoveShieldOfLight();
break;
default:
break;
}
// Exit shield phase if both beacons are disabled or channeling Reverberating Hymn finished.
if ((_leftBeaconDisabled && _rightBeaconDisabled) || action == ACTION_HYMN_EXPIRED)
ExitShieldPhase();
if (_leftBeaconDisabled && _rightBeaconDisabled)
RemoveShieldOfLight();
}
void JustEngagedWith(Unit* /*who*/) override
@@ -153,9 +150,12 @@ public:
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
Talk(SAY_AGGRO);
_JustEngagedWith();
events.SetPhase(PHASE_FIGHT);
events.ScheduleEvent(EVENT_DIVINE_RECKONING, Seconds(10), 0, PHASE_FIGHT);
events.ScheduleEvent(EVENT_BURNING_LIGHT, Seconds(12), 0, PHASE_FIGHT);
instance->DoUpdateWorldState(WS_I_HATE_THIS_SONG, 0);
sWorld->setWorldState(WS_I_HATE_THIS_SONG, 0); // To-do: make InstanceScript::DoUpdateWorldState do the World::setWorldState.
sWorld->setWorldState(WS_I_HATE_THIS_SONG, 0);
}
void JustDied(Unit* /*killer*/) override
@@ -175,6 +175,7 @@ public:
{
DoCastAOE(SPELL_DEACTIVATE_BEACONS, true);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
instance->SetData(DATA_HANDLE_BEAM_OF_LIGHT, NOT_STARTED);
_EnterEvadeMode();
_DespawnAtEvade();
}
@@ -186,8 +187,9 @@ public:
if (spell->Id == SPELL_REVERBERATING_HYMN)
{
events.CancelEvent(EVENT_ACHIEVEMENT_FAILED);
DoAction(ACTION_HYMN_EXPIRED);
ScheduleEvents();
events.SetPhase(PHASE_FIGHT);
events.ScheduleEvent(EVENT_DIVINE_RECKONING, Seconds(10), 0, PHASE_FIGHT);
events.ScheduleEvent(EVENT_BURNING_LIGHT, Seconds(12), 0, PHASE_FIGHT);
}
}
@@ -224,8 +226,8 @@ public:
break;
case EVENT_CAST_SHIELD:
me->AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
me->SetFacingTo(1.5708f); // Sniffs set it again
DoCastSelf(SPELL_SHIELD_OF_LIGHT); // Note: stun!
me->SetFacingTo(1.5708f);
DoCastSelf(SPELL_SHIELD_OF_LIGHT);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_31);
events.ScheduleEvent(EVENT_ACTIVATE_BEACONS, Seconds(2), 0, PHASE_SHIELD);
break;
@@ -233,16 +235,16 @@ public:
Talk(EMOTE_SHIELD);
DoCastAOE(SPELL_ACTIVATE_BEACONS, true);
DoCastSelf(SPELL_REVERBERATING_HYMN);
HandleVisuals(SPELL_SHIELD_VISUAL_LEFT, SPELL_SHIELD_VISUAL_RIGHT, true);
instance->SetData(DATA_HANDLE_SHIELD_VISUAL, IN_PROGRESS);
events.ScheduleEvent(EVENT_CAST_BEAMS, Seconds(1), 0, PHASE_SHIELD);
events.ScheduleEvent(EVENT_ACHIEVEMENT_FAILED, Seconds(15), 0, PHASE_SHIELD);
break;
case EVENT_CAST_BEAMS:
HandleVisuals(SPELL_BEAM_OF_LIGHT_LEFT, SPELL_BEAM_OF_LIGHT_RIGHT, true);
instance->SetData(DATA_HANDLE_BEAM_OF_LIGHT, IN_PROGRESS);
break;
case EVENT_ACHIEVEMENT_FAILED: // Happens on normal too, heroic check is in dbc.
case EVENT_ACHIEVEMENT_FAILED:
instance->DoUpdateWorldState(WS_I_HATE_THIS_SONG, 1);
sWorld->setWorldState(WS_I_HATE_THIS_SONG, 1); // To-do: make InstanceScript::DoUpdateWorldState do the World::setWorldState.
sWorld->setWorldState(WS_I_HATE_THIS_SONG, 1);
break;
default:
break;
@@ -256,15 +258,6 @@ public:
DoMeleeAttackIfReady();
}
private:
void ScheduleEvents()
{
events.Reset();
events.ScheduleEvent(EVENT_DIVINE_RECKONING, Seconds(10), 0, PHASE_FIGHT);
events.ScheduleEvent(EVENT_BURNING_LIGHT, Seconds(12), 0, PHASE_FIGHT);
}
// To-do: Ideal for a custom spell.
void HandleSearingLight()
{
Unit* target = me->FindNearestCreature(NPC_SEARING_LIGHT, 100.0f);
@@ -294,7 +287,7 @@ public:
void EnterShieldPhase()
{
events.SetPhase(PHASE_SHIELD);
++_countShield;
_countShield++;
_leftBeaconDisabled = false;
_rightBeaconDisabled = false;
@@ -308,42 +301,14 @@ public:
events.ScheduleEvent(EVENT_CAST_SHIELD, Seconds(1), 0, PHASE_SHIELD);
}
void ExitShieldPhase()
void RemoveShieldOfLight()
{
CleanStalkers();
instance->SetData(DATA_HANDLE_BEAM_OF_LIGHT, NOT_STARTED); // includes whole aura removal
me->MakeInterruptable(true);
me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT);
me->SetReactState(REACT_AGGRESSIVE);
Talk(EMOTE_UNSHIELD);
events.SetPhase(PHASE_FIGHT);
}
void CleanStalkers()
{
HandleVisuals(SPELL_SHIELD_VISUAL_LEFT, SPELL_SHIELD_VISUAL_RIGHT, false);
HandleVisuals(SPELL_BEAM_OF_LIGHT_LEFT, SPELL_BEAM_OF_LIGHT_RIGHT, false);
}
void HandleVisuals(uint32 leftSpellId, uint32 rightSpellId, bool apply)
{
std::list<Creature*> stalkers;
GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f);
for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
{
// Target only the bottom stalkers (Y: 65.392f and 64.9004f)
if ((*itr)->GetPositionZ() > 70.f)
return;
// Left stalker X: -603.465f; right stalker X: -678.132f
uint32 spellId = ((*itr)->GetPositionX() > -640.0f) ? leftSpellId : rightSpellId;
if (apply)
(*itr)->CastSpell((*itr), spellId, true);
else
{
(*itr)->InterruptNonMeleeSpells(true, spellId);
(*itr)->RemoveAurasDueToSpell(spellId);
}
}
DoCastAOE(SPELL_DEACTIVATE_BEACONS, true);
Talk(EMOTE_SHIELD_REMOVED);
}
uint8 _countShield;
@@ -394,7 +359,6 @@ public:
// 74930 - Shield of Light (left)
// 76573 - Shield of Light (right)
class spell_anhuur_shield_of_light : public SpellScriptLoader
{
public:
@@ -406,16 +370,14 @@ class spell_anhuur_shield_of_light : public SpellScriptLoader
void FilterTargets(std::list<WorldObject*>& targets)
{
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
{
if (GameObject* go = instance->GetGameObject(DATA_ANHUUR_DOOR))
{
targets.remove_if(Trinity::HeightDifferenceCheck(go, 5.0f, false));
targets.remove(GetCaster());
targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
targets.resize(2);
}
}
if (targets.empty())
return;
targets.remove(GetCaster());
targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
if (targets.size() > 2)
targets.resize(2);
}
void Register() override

View File

@@ -43,6 +43,8 @@ enum HOOData
// Temple Guardian Anhuur
DATA_ANHUUR_DOOR,
DATA_HANDLE_SHIELD_VISUAL,
DATA_HANDLE_BEAM_OF_LIGHT,
// Anraphet
DATA_BRANN_0,
@@ -194,7 +196,13 @@ enum HOOMisc
SPELL_TELEPORT_EARTH = 82329, // South-West
SPELL_TELEPORT_AIR = 82330, // South-East
SPELL_TELEPORT_FIRE = 82331, // North-West
SPELL_TELEPORT_WATER = 82332 // North-East
SPELL_TELEPORT_WATER = 82332, // North-East
// Cave In Stalker (beacons)
SPELL_SHIELD_VISUAL_LEFT = 83697,
SPELL_SHIELD_VISUAL_RIGHT = 83698,
SPELL_BEAM_OF_LIGHT_LEFT = 74930,
SPELL_BEAM_OF_LIGHT_RIGHT = 76573
};
enum HOOGlobalActions

View File

@@ -102,8 +102,8 @@ class instance_halls_of_origination : public InstanceMapScript
switch (go->GetEntry())
{
case GO_HOO_TRANSIT_DEVICE: // 5 spawns
case GO_HOO_TRANSIT_DEVICE_2: // 1 spawn: elevator
case GO_HOO_TRANSIT_DEVICE:
case GO_HOO_TRANSIT_DEVICE_2:
_transitDeviceGUIDs.insert(go->GetGUID());
UpdateTransitDevice(go);
break;
@@ -203,6 +203,9 @@ class instance_halls_of_origination : public InstanceMapScript
case NPC_ALPHA_BEAM:
if (Creature* anraphet = GetCreature(DATA_ANRAPHET))
anraphet->AI()->JustSummoned(creature);
case NPC_CAVE_IN_STALKER:
if (creature->GetPositionZ() <= 70.0f)
_caveInStalkerGUIDs.insert(creature->GetGUID());
default:
break;
}
@@ -227,6 +230,40 @@ class instance_halls_of_origination : public InstanceMapScript
case DATA_ISISET_VEIL_OF_SKY_ALIVE:
_isisetVeilOfSkyAlive = value;
break;
case DATA_HANDLE_SHIELD_VISUAL:
for (ObjectGuid guid : _caveInStalkerGUIDs)
{
if (Creature* stalker = instance->GetCreature(guid))
{
if (value == IN_PROGRESS)
{
if (stalker->GetPositionX() > -640.0f)
stalker->CastSpell(stalker, SPELL_SHIELD_VISUAL_LEFT, true);
else
stalker->CastSpell(stalker, SPELL_SHIELD_VISUAL_RIGHT, true);
}
}
}
break;
case DATA_HANDLE_BEAM_OF_LIGHT:
for (ObjectGuid guid : _caveInStalkerGUIDs)
{
if (Creature* stalker = instance->GetCreature(guid))
{
if (value == IN_PROGRESS)
{
if (stalker->GetPositionX() > -640.0f)
stalker->CastSpell(stalker, SPELL_BEAM_OF_LIGHT_LEFT, true);
else
stalker->CastSpell(stalker, SPELL_BEAM_OF_LIGHT_RIGHT, true);
}
else
stalker->RemoveAllAuras();
}
}
break;
default:
break;
}
}