mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-24 10:56:38 +01:00
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:
52
sql/updates/world/custom/custom_2018_06_10_00_world.sql
Normal file
52
sql/updates/world/custom/custom_2018_06_10_00_world.sql
Normal 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);
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user