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

@@ -0,0 +1,52 @@
-- Template Updates
UPDATE `creature_template` SET `DamageModifier`= 80, `mingold`= 19000, `maxgold`= 21000 WHERE `entry`= 39425;
UPDATE `creature_template` SET `DamageModifier`= 80, `mingold`= 19000, `maxgold`= 21000 WHERE `entry`= 49262;
-- Pit Viper snakes respawn in 30 seconds.
UPDATE `creature` SET `spawntimesecs`= 30 WHERE `map`= 644 AND `id`= 39444;
-- broadcast text ids for Anhuur
UPDATE `creature_text` SET `BroadcastTextId`= 40968 WHERE `CreatureID`= 39425 AND `GroupID` = 2;
UPDATE `creature_text` SET `BroadcastTextId`= 50665 WHERE `CreatureID`= 39425 AND `GroupID` = 3;
-- script names ("spell_anhuur_activate_beacons" rewritten into "spell_anhuur_handle_beacons")
DELETE FROM `spell_script_names` WHERE `ScriptName` IN
('spell_anhuur_reverberating_hymn',
'spell_anhuur_activate_beacons',
'spell_anhuur_handle_beacons');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(75322, 'spell_anhuur_reverberating_hymn'),
(76599, 'spell_anhuur_handle_beacons'),
(76600, 'spell_anhuur_handle_beacons');
-- spell condition
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` IN (76599, 76600);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13, 1, 76599, 0, 0, 31, 0, 5, 207218, 0, 0, 0, 0, '', 'Activate Beacons targets Beacon of Light'),
(13, 1, 76599, 0, 1, 31, 0, 5, 207219, 0, 0, 0, 0, '', 'Activate Beacons targets Beacon of Light'),
(13, 1, 76599, 0, 2, 31, 0, 5, 203133, 0, 0, 0, 0, '', 'Activate Beacons targets Beacon of Light'),
(13, 1, 76599, 0, 3, 31, 0, 5, 203136, 0, 0, 0, 0, '', 'Activate Beacons targets Beacon of Light'),
(13, 1, 76600, 0, 0, 31, 0, 5, 207218, 0, 0, 0, 0, '', 'Deactivate Beacons targets Beacon of Light'),
(13, 1, 76600, 0, 1, 31, 0, 5, 207219, 0, 0, 0, 0, '', 'Deactivate Beacons targets Beacon of Light'),
(13, 1, 76600, 0, 2, 31, 0, 5, 203133, 0, 0, 0, 0, '', 'Deactivate Beacons targets Beacon of Light'),
(13, 1, 76600, 0, 3, 31, 0, 5, 203136, 0, 0, 0, 0, '', 'Deactivate Beacons targets Beacon of Light');
UPDATE `gameobject` SET `spawnMask`= 1 WHERE `guid` IN (220773, 220775);
UPDATE `gameobject` SET `spawnMask`= 2 WHERE `guid` IN (200969, 200968);
-- Creature Pit Viper 39444 SAI
SET @ENTRY := 39444;
UPDATE `creature_template` SET `AIName`="SmartAI", `DamageModifier`= 5, `difficulty_entry_1`= 48891 WHERE `entry`= @ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 0, 6, 0, 100, 0, 0, 0, 0, 0, 41, 6000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "On death - Self: Despawn in 6000 ms // "),
(@ENTRY, 0, 1, 0, 0, 0, 100, 0, 5000, 5000, 6000, 7000, 11, 74538, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "When in combat and timer at the begining between 5000 and 5000 ms (and later repeats every 6000 and 7000 ms) - Self: Cast spell 74538 on Victim // ");
UPDATE `creature_template` SET `DamageModifier`= 5, `minlevel`= 85, `maxlevel`= 85, `exp`= 3, `faction`= 16 WHERE `entry`= 48891;
-- Currency Loot
DELETE FROM `creature_onkill_reward` WHERE `creature_id` IN (39425, 49262);
INSERT INTO `creature_onkill_reward` (`creature_id`, `CurrencyId1`, `CurrencyCount1`) VALUES
(39425, 395, 3500),
(49262, 395, 7000);

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;
}
}