mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Scripts/Instance: The Stonecore updates
Stonecore Teleporters scripted. Some corrections, better handlings, fixed Travis warnings ...
Closes #13626
(cherry picked from commit 9a941ae125)
Conflicts:
src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp
src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp
src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp
src/server/scripts/Maelstrom/Stonecore/stonecore.cpp
This commit is contained in:
25
sql/updates/world/2014_12_28_02_world.sql
Normal file
25
sql/updates/world/2014_12_28_02_world.sql
Normal file
@@ -0,0 +1,25 @@
|
||||
-- The Stonecore updates
|
||||
-- Spell conditions
|
||||
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` IN (93167, 86862, 86863);
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(13, 1, 93167, 0, 0, 31, 0, 3, 40350, 0, 0, 0, 0, '', 'Twilight Documents targets Generic Trigger LAB'),
|
||||
(13, 1, 86862, 0, 0, 31, 0, 3, 42355, 0, 0, 0, 0, '', 'Seismic Shard targets Seismic Shards'),
|
||||
(13, 1, 86862, 0, 0, 1, 0, 79009, 0, 0, 0, 0, 0, '', 'Seismic Shard''s target must have SPELL_SEISMIC_SHARD_VISUAL aura'),
|
||||
(13, 1, 86863, 0, 0, 31, 0, 3, 42333, 0, 0, 0, 0, '', 'Seismic Shard targets High Priestess Azil');
|
||||
|
||||
-- Set CREATURE_FLAG_EXTRA_TRIGGER to Stonecore Teleporters, Lava Fissure, Stalactite Trigger - Boss, Rupture Controller, Rupture, Gravity Well, Seismic Shard
|
||||
UPDATE `creature_template` SET `flags_extra` = 128 WHERE `entry` IN (51396, 51397, 43242, 43159, 49597, 49576, 42499, 42355);
|
||||
|
||||
-- Stonecore Teleporters
|
||||
DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` IN (51396, 51397);
|
||||
INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
|
||||
(51396, 95284, 3, 0),
|
||||
(51397, 95285, 3, 0);
|
||||
|
||||
DELETE FROM `spell_target_position` WHERE `id` IN (95284, 95285);
|
||||
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `VerifiedBuild`) VALUES
|
||||
(95284, 0, 725, 1313.26, 1236.833, 247.2859, 0),
|
||||
(95285, 0, 725, 853.8577, 999.7518, 317.3986, 0);
|
||||
|
||||
-- Remove cpp script from Seismic Shard (86862) spell
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` = 86862;
|
||||
@@ -3618,6 +3618,11 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
spellInfo->ManaCost = 0;
|
||||
spellInfo->ManaPerSecond = 0;
|
||||
break;
|
||||
// Stonecore spells
|
||||
case 95284: // Teleport (from entrance to Slabhide)
|
||||
case 95285: // Teleport (from Slabhide to entrance)
|
||||
spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_DB);
|
||||
break;
|
||||
// Halls Of Origination spells
|
||||
// Temple Guardian Anhuur
|
||||
case 76606: // Disable Beacon Beams L
|
||||
|
||||
@@ -93,7 +93,9 @@ class boss_corborus : public CreatureScript
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
|
||||
countTrashingCharge = 0;
|
||||
|
||||
events.ScheduleEvent(EVENT_DAMPENING_WAVE, 10000);
|
||||
events.ScheduleEvent(EVENT_CRYSTAL_BARRAGE, 15000);
|
||||
events.ScheduleEvent(EVENT_SUBMERGE, 36000);
|
||||
@@ -110,7 +112,7 @@ class boss_corborus : public CreatureScript
|
||||
|
||||
stateIntro = IN_PROGRESS;
|
||||
|
||||
if (Creature* Millhouse = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MILLHOUSE_MANASTORM)))
|
||||
if (Creature* Millhouse = instance->GetCreature(DATA_MILLHOUSE_MANASTORM))
|
||||
{
|
||||
Millhouse->InterruptNonMeleeSpells(true);
|
||||
Millhouse->RemoveAllAuras();
|
||||
@@ -144,18 +146,18 @@ class boss_corborus : public CreatureScript
|
||||
instance->SetData(DATA_MILLHOUSE_EVENT_FACE, 0);
|
||||
|
||||
// Open rock gate and cast visual from nearby worldtrigger
|
||||
instance->HandleGameObject(instance->GetGuidData(GAMEOBJECT_CORBORUS_ROCKDOOR), true);
|
||||
instance->SetData(DATA_HANDLE_CORBORUS_ROCKDOOR, 0);
|
||||
if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 60.0f))
|
||||
worldtrigger->CastSpell(worldtrigger, SPELL_DOOR_BREAK, true);
|
||||
|
||||
// Make Corborus charge
|
||||
me->CastSpell(me, SPELL_RING_WYRM_CHARGE, true);
|
||||
DoCast(me, SPELL_RING_WYRM_CHARGE, true);
|
||||
|
||||
events.ScheduleEvent(EVENT_CORBORUS_KNOCKBACK, 1000);
|
||||
break;
|
||||
case EVENT_CORBORUS_KNOCKBACK:
|
||||
// Spawn Twilight Documents (quest gameobject)
|
||||
if (Creature* Millhouse = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MILLHOUSE_MANASTORM)))
|
||||
if (Creature* Millhouse = instance->GetCreature(DATA_MILLHOUSE_MANASTORM))
|
||||
Millhouse->CastSpell(Millhouse, SPELL_TWILIGHT_DOCUMENTS, true);
|
||||
|
||||
// Knockback Millhouse and other mobs
|
||||
@@ -231,12 +233,14 @@ class boss_corborus : public CreatureScript
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
if (summon->GetEntry() != NPC_TRASHING_CHARGE)
|
||||
return;
|
||||
if (summon->GetEntry() == NPC_TRASHING_CHARGE)
|
||||
{
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summon->CastSpell(summon, SPELL_TRASHING_CHARGE_EFFECT);
|
||||
summon->DespawnOrUnsummon(6000);
|
||||
}
|
||||
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summon->CastSpell(summon, SPELL_TRASHING_CHARGE_EFFECT);
|
||||
summon->DespawnOrUnsummon(6000);
|
||||
BossAI::JustSummoned(summon);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -269,7 +273,7 @@ class npc_rock_borer : public CreatureScript
|
||||
void IsSummonedBy(Unit* summoner) override
|
||||
{
|
||||
me->SetInCombatState(false, summoner);
|
||||
DoCast(SPELL_ROCK_BORER_EMERGE);
|
||||
DoCast(me, SPELL_ROCK_BORER_EMERGE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -291,7 +295,7 @@ class npc_rock_borer : public CreatureScript
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
break;
|
||||
case EVENT_ROCK_BORE:
|
||||
DoCast(SPELL_ROCK_BORE);
|
||||
DoCast(me, SPELL_ROCK_BORE);
|
||||
events.ScheduleEvent(EVENT_ROCK_BORE, urand(15000, 20000)); // Need sniffs for this timer
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -92,7 +92,7 @@ enum Events
|
||||
// Phase 2: Fury of Earth
|
||||
EVENT_EARTH_FURY_FLY_UP,
|
||||
EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM,
|
||||
EVENT_EARTH_FURY_CHECK_SEAT0,
|
||||
EVENT_EARTH_FURY_PREPARE_SHARD,
|
||||
EVENT_EARTH_FURY_LAUNCH_SHARD,
|
||||
EVENT_EARTH_FURY_FLY_DOWN,
|
||||
EVENT_START_ATTACK,
|
||||
@@ -101,12 +101,6 @@ enum Events
|
||||
EVENT_SEISMIC_SHARD_MOUNT
|
||||
};
|
||||
|
||||
enum EventGroups
|
||||
{
|
||||
EVENT_GROUP_PHASE_ONE,
|
||||
EVENT_GROUP_ADDS,
|
||||
};
|
||||
|
||||
enum Points
|
||||
{
|
||||
POINT_NONE,
|
||||
@@ -122,7 +116,6 @@ Position const GroundPos = { 1331.82f, 980.314f, 207.542f };
|
||||
Position const AbovePlatformPos = { 1336.21f, 960.813f, 215.0f };
|
||||
|
||||
// TO-DO:
|
||||
// - Find out why NPCs summoned by boss are usually two times bigger than their normal size.
|
||||
// - Find more sniffs and script Force Grip spell (79351)
|
||||
|
||||
class boss_high_priestess_azil : public CreatureScript
|
||||
@@ -132,11 +125,7 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
|
||||
struct boss_high_priestess_azilAI : public BossAI
|
||||
{
|
||||
boss_high_priestess_azilAI(Creature* creature) : BossAI(creature, DATA_HIGH_PRIESTESS_AZIL)
|
||||
{
|
||||
ASSERT(creature->GetVehicleKit());
|
||||
}
|
||||
|
||||
boss_high_priestess_azilAI(Creature* creature) : BossAI(creature, DATA_HIGH_PRIESTESS_AZIL) { }
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
@@ -146,9 +135,9 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
|
||||
events.ScheduleEvent(EVENT_INTRO_MOVE, 2000);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000, EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000,10000), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000, EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000);
|
||||
events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000,10000));
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000);
|
||||
events.ScheduleEvent(EVENT_ENERGY_SHIELD, urand(35000,36000));
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_SOUTH, 0);
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_WEST, 40000);
|
||||
@@ -158,33 +147,17 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
{
|
||||
_EnterCombat();
|
||||
|
||||
DoCast(SPELL_ENERGY_SHIELD);
|
||||
DoCast(me, SPELL_ENERGY_SHIELD);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
/*
|
||||
void PassengerBoarded(Unit* who, int8 seatId, bool apply) override
|
||||
{
|
||||
if (!apply || who->GetEntry() != NPC_SEISMIC_SHARD)
|
||||
return;
|
||||
|
||||
Movement::MoveSplineInit init(who);
|
||||
init.DisableTransportPathTransformations();
|
||||
if (seatId == 0)
|
||||
init.MoveTo(12.13748f, 0.0f, 2.442475f);
|
||||
else if (seatId == 1)
|
||||
init.MoveTo(12.13748f, 17.5f, 11.19248f);
|
||||
else
|
||||
init.MoveTo(12.13748f, -17.5f, 11.19248f);
|
||||
init.Launch();
|
||||
}
|
||||
*/
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) override
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE && id != POINT_INTRO_MOVE)
|
||||
@@ -195,6 +168,7 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
case POINT_INTRO_MOVE:
|
||||
me->RemoveAurasDueToSpell(SPELL_ENERGY_SHIELD);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
DoStartMovement(me->GetVictim());
|
||||
break;
|
||||
case POINT_FLY_UP:
|
||||
me->SetCanFly(true);
|
||||
@@ -203,21 +177,22 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
break;
|
||||
case POINT_ABOVE_PLATFORM:
|
||||
me->SetFacingTo(5.218534f);
|
||||
DoCast(SPELL_EARTH_FURY_CASTING_VISUAL);
|
||||
DoCast(SPELL_SEISMIC_SHARD_SUMMON_1);
|
||||
DoCast(SPELL_SEISMIC_SHARD_SUMMON_2);
|
||||
DoCast(SPELL_SEISMIC_SHARD_SUMMON_3);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_CHECK_SEAT0, 6700);
|
||||
DoCast(me, SPELL_EARTH_FURY_CASTING_VISUAL);
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_SUMMON_1);
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_SUMMON_2);
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_SUMMON_3);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_PREPARE_SHARD, 6700);
|
||||
break;
|
||||
case POINT_GROUND:
|
||||
DoCast(SPELL_EJECT_ALL_PASSENGERS);
|
||||
DoCast(me, SPELL_EJECT_ALL_PASSENGERS);
|
||||
me->SetCanFly(false);
|
||||
me->SetDisableGravity(false);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
DoStartMovement(me->GetVictim());
|
||||
// Find more sniffs to correct these timers, this was copied from Reset() void.
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000, EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000, 10000), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000, EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000);
|
||||
events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000, 10000));
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -244,20 +219,20 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
case EVENT_CURSE_OF_BLOOD:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_CURSE_OF_BLOOD);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000));
|
||||
break;
|
||||
case EVENT_FORCE_GRIP:
|
||||
DoCastVictim(SPELL_FORCE_GRIP);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000));
|
||||
break;
|
||||
case EVENT_SUMMON_GRAVITY_WELL:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_SUMMON_GRAVITY_WELL);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, urand(13000, 15000), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, urand(13000, 15000));
|
||||
break;
|
||||
case EVENT_ENERGY_SHIELD:
|
||||
events.CancelEventGroup(EVENT_GROUP_PHASE_ONE);
|
||||
DoCast(SPELL_EARTH_FURY_ENERGY_SHIELD);
|
||||
events.Reset();
|
||||
DoCast(me, SPELL_EARTH_FURY_ENERGY_SHIELD);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY, 0);
|
||||
break;
|
||||
case EVENT_EARTH_FURY:
|
||||
@@ -273,9 +248,8 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
case EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM:
|
||||
me->GetMotionMaster()->MovePoint(POINT_ABOVE_PLATFORM, AbovePlatformPos);
|
||||
break;
|
||||
case EVENT_EARTH_FURY_CHECK_SEAT0:
|
||||
if (!me->GetVehicleKit()->GetPassenger(0))
|
||||
DoCast(SPELL_SEISMIC_SHARD_PREPARE);
|
||||
case EVENT_EARTH_FURY_PREPARE_SHARD:
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_PREPARE);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_LAUNCH_SHARD, 1800);
|
||||
break;
|
||||
case EVENT_EARTH_FURY_LAUNCH_SHARD:
|
||||
@@ -283,10 +257,10 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
{
|
||||
me->SetFacingToObject(target);
|
||||
DoCast(target, SPELL_SEISMIC_SHARD_TARGETING);
|
||||
DoCast(SPELL_SEISMIC_SHARD_LAUNCH);
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_LAUNCH);
|
||||
countSeismicShard -= 1;
|
||||
}
|
||||
events.ScheduleEvent(countSeismicShard > 0 ? EVENT_EARTH_FURY_CHECK_SEAT0 : EVENT_EARTH_FURY_FLY_DOWN, 4800);
|
||||
events.ScheduleEvent(countSeismicShard > 0 ? EVENT_EARTH_FURY_PREPARE_SHARD : EVENT_EARTH_FURY_FLY_DOWN, 4800);
|
||||
break;
|
||||
case EVENT_EARTH_FURY_FLY_DOWN:
|
||||
{
|
||||
@@ -369,8 +343,7 @@ public:
|
||||
{
|
||||
npc_gravity_wellAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
DoCast(SPELL_GRAVITY_WELL_VISUAL);
|
||||
DoCast(me, SPELL_GRAVITY_WELL_VISUAL);
|
||||
events.ScheduleEvent(EVENT_GRAVITY_WELL_AURA_DAMAGE, 3200);
|
||||
events.ScheduleEvent(EVENT_GRAVITY_WELL_AURA_PULL, 4500);
|
||||
if (!me->GetMap()->IsHeroic())
|
||||
@@ -397,10 +370,10 @@ public:
|
||||
{
|
||||
case EVENT_GRAVITY_WELL_AURA_DAMAGE:
|
||||
me->RemoveAurasDueToSpell(SPELL_GRAVITY_WELL_VISUAL);
|
||||
DoCast(SPELL_GRAVITY_WELL_AURA_DAMAGE);
|
||||
DoCast(me, SPELL_GRAVITY_WELL_AURA_DAMAGE);
|
||||
break;
|
||||
case EVENT_GRAVITY_WELL_AURA_PULL:
|
||||
DoCast(SPELL_GRAVITY_WELL_AURA_PULL);
|
||||
DoCast(me, SPELL_GRAVITY_WELL_AURA_PULL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -430,8 +403,7 @@ public:
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
me->SetDisableGravity(true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
DoCast(SPELL_SEISMIC_SHARD_VISUAL);
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_VISUAL);
|
||||
|
||||
Movement::MoveSplineInit init(me);
|
||||
FillPath(me->GetPosition(), init.Path());
|
||||
@@ -512,7 +484,7 @@ public:
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
for (uint8 i = 0; i < 3; i++)
|
||||
for (int i = 0; i < 3; i++)
|
||||
caster->CastSpell(caster, SPELL_SUMMON_ADD_SOUTH, true);
|
||||
}
|
||||
|
||||
@@ -548,7 +520,7 @@ public:
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
for (uint8 i = 0; i < 10; i++)
|
||||
for (int i = 0; i < 10; i++)
|
||||
caster->CastSpell(caster, SPELL_SUMMON_ADD_WEST, true);
|
||||
}
|
||||
|
||||
@@ -652,15 +624,6 @@ public:
|
||||
};
|
||||
|
||||
// 79332 - Gravity Well (pull units within 10 yards)
|
||||
class PulledRecentlyCheck
|
||||
{
|
||||
public:
|
||||
bool operator()(WorldObject* object) const
|
||||
{
|
||||
return (object->ToUnit() && object->ToUnit()->HasAura(SPELL_GRAVITY_WELL_PULL));
|
||||
}
|
||||
};
|
||||
|
||||
class spell_gravity_well_pull : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
@@ -675,15 +638,9 @@ public:
|
||||
GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3));
|
||||
}
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& unitList)
|
||||
{
|
||||
unitList.remove_if(PulledRecentlyCheck());
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
BeforeCast += SpellCastFn(spell_gravity_well_pull_SpellScript::SetRadiusMod);
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gravity_well_pull_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -693,34 +650,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
// 86862 - Seismic Shard (forces target to cast 86863)
|
||||
class spell_seismic_shard_prepare : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_seismic_shard_prepare() : SpellScriptLoader("spell_seismic_shard_prepare") { }
|
||||
|
||||
class spell_seismic_shard_prepare_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_seismic_shard_prepare_SpellScript);
|
||||
|
||||
void SetTarget(WorldObject*& target)
|
||||
{
|
||||
target = GetCaster()->FindNearestCreature(NPC_SEISMIC_SHARD, 50.0f);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_seismic_shard_prepare_SpellScript::SetTarget, EFFECT_0, TARGET_UNIT_NEARBY_ENTRY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_seismic_shard_prepare_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 86863 - Seismic Shard (moves shard to seat 0)
|
||||
// 86863 - Seismic Shard (makes shard reenter Azil)
|
||||
class spell_seismic_shard_change_seat : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
@@ -730,23 +660,14 @@ public:
|
||||
{
|
||||
PrepareSpellScript(spell_seismic_shard_change_seat_SpellScript);
|
||||
|
||||
void SetTarget(WorldObject*& target)
|
||||
{
|
||||
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
|
||||
target = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_HIGH_PRIESTESS_AZIL));
|
||||
}
|
||||
|
||||
void ChangeSeat(SpellEffIndex /*effIndex*/)
|
||||
void ExitVehicle()
|
||||
{
|
||||
GetCaster()->ExitVehicle();
|
||||
if (GetHitUnit()->IsVehicle())
|
||||
GetCaster()->EnterVehicle(GetHitUnit(), 0);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_seismic_shard_change_seat_SpellScript::SetTarget, EFFECT_0, TARGET_UNIT_NEARBY_ENTRY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_seismic_shard_change_seat_SpellScript::ChangeSeat, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
|
||||
BeforeCast += SpellCastFn(spell_seismic_shard_change_seat_SpellScript::ExitVehicle);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -800,7 +721,6 @@ void AddSC_boss_high_priestess_azil()
|
||||
new spell_gravity_well_damage_nearby();
|
||||
new spell_gravity_well_damage();
|
||||
new spell_gravity_well_pull();
|
||||
new spell_seismic_shard_prepare();
|
||||
new spell_seismic_shard_change_seat();
|
||||
new spell_seismic_shard();
|
||||
}
|
||||
|
||||
@@ -89,8 +89,6 @@ class boss_ozruk : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_ELEMENTIUM_BULWARK, 5000);
|
||||
events.ScheduleEvent(EVENT_GROUND_SLAM, 10000);
|
||||
events.ScheduleEvent(EVENT_ELEMENTIUM_SPIKE_SHIELD, 13000);
|
||||
|
||||
RemoveBouncerSpikes();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*victim*/) override
|
||||
@@ -102,12 +100,13 @@ class boss_ozruk : public CreatureScript
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
if (summon->GetEntry() != NPC_RUPTURE_CONTROLLER)
|
||||
return;
|
||||
if (summon->GetEntry() == NPC_RUPTURE_CONTROLLER)
|
||||
{
|
||||
summon->CastSpell(summon, SPELL_RUPTURE, true);
|
||||
summon->DespawnOrUnsummon(10000);
|
||||
}
|
||||
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summon->CastSpell(summon, SPELL_RUPTURE, true);
|
||||
summon->DespawnOrUnsummon(10000);
|
||||
BossAI::JustSummoned(summon);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32 &damage) override
|
||||
@@ -116,14 +115,14 @@ class boss_ozruk : public CreatureScript
|
||||
return;
|
||||
|
||||
DoCast(me, SPELL_ENRAGE);
|
||||
me->Say(SAY_ENRAGE);
|
||||
Talk(SAY_ENRAGE);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
me->Say(SAY_DEATH, killer); // receiver is the killer, sniff source!
|
||||
_JustDied();
|
||||
|
||||
RemoveBouncerSpikes();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -133,7 +132,7 @@ class boss_ozruk : public CreatureScript
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING) || me->HasAura(SPELL_ELEMENTIUM_SPIKE_SHIELD))
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
@@ -156,7 +155,7 @@ class boss_ozruk : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_SHATTER, 10000);
|
||||
break;
|
||||
case EVENT_SHATTER:
|
||||
RemoveBouncerSpikes();
|
||||
summons.DespawnEntry(NPC_BOUNCER_SPIKE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->AttackStop();
|
||||
DoCast(me, SPELL_SHATTER);
|
||||
@@ -168,6 +167,7 @@ class boss_ozruk : public CreatureScript
|
||||
break;
|
||||
case EVENT_START_ATTACK:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
DoStartMovement(me->GetVictim());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -176,18 +176,6 @@ class boss_ozruk : public CreatureScript
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void RemoveBouncerSpikes()
|
||||
{
|
||||
Vehicle* vehicle = me->GetVehicleKit();
|
||||
if (!vehicle)
|
||||
return;
|
||||
|
||||
for (uint8 i = 0; i < vehicle->GetAvailableSeatCount(); i++)
|
||||
if (Unit* passenger = vehicle->GetPassenger(i))
|
||||
if (Creature* creature = passenger->ToCreature())
|
||||
creature->RemoveFromWorld();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
@@ -229,7 +217,6 @@ public:
|
||||
if (!rupture)
|
||||
return;
|
||||
|
||||
rupture->SetReactState(REACT_PASSIVE);
|
||||
rupture->CastSpell(rupture, SPELL_RUPTURE_DAMAGE, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@ class boss_slabhide : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_STALACTITE, 400);
|
||||
break;
|
||||
case POINT_SLABHIDE_LAND:
|
||||
//DoCast(SPELL_COOLDOWN_5S); // unknown purpose
|
||||
//DoCast(me, SPELL_COOLDOWN_5S); // unknown purpose
|
||||
events.ScheduleEvent(EVENT_ATTACK, 1200);
|
||||
break;
|
||||
default:
|
||||
@@ -225,11 +225,12 @@ class boss_slabhide : public CreatureScript
|
||||
instance->SetData(DATA_SLABHIDE_ROCK_WALL, false);
|
||||
break;
|
||||
case EVENT_LAVA_FISSURE:
|
||||
DoCast(SPELL_LAVA_FISSURE);
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_LAVA_FISSURE);
|
||||
events.ScheduleEvent(EVENT_LAVA_FISSURE, urand(6000, 8000));
|
||||
break;
|
||||
case EVENT_SAND_BLAST:
|
||||
DoCast(SPELL_SAND_BLAST);
|
||||
DoCast(me, SPELL_SAND_BLAST);
|
||||
events.ScheduleEvent(EVENT_SAND_BLAST, urand(8000, 11000));
|
||||
break;
|
||||
case EVENT_AIR_PHASE:
|
||||
@@ -248,7 +249,7 @@ class boss_slabhide : public CreatureScript
|
||||
me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
|
||||
me->SetHover(true);
|
||||
|
||||
DoCast(SPELL_STALACTITE_SUMMON);
|
||||
DoCast(me, SPELL_STALACTITE_SUMMON);
|
||||
|
||||
events.ScheduleEvent(EVENT_LAND, 8000);
|
||||
break;
|
||||
@@ -267,7 +268,7 @@ class boss_slabhide : public CreatureScript
|
||||
|
||||
events.ScheduleEvent(EVENT_LAVA_FISSURE, urand(6000, 8000));
|
||||
events.ScheduleEvent(EVENT_SAND_BLAST, urand(8000, 10000));
|
||||
DoCast(SPELL_CRYSTAL_STORM);
|
||||
DoCast(me, SPELL_CRYSTAL_STORM);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
break;
|
||||
default:
|
||||
@@ -315,8 +316,7 @@ public:
|
||||
{
|
||||
npc_lava_fissureAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->CastSpell(me, SPELL_LAVA_FISSURE_CRACK, true);
|
||||
DoCast(me, SPELL_LAVA_FISSURE_CRACK, true);
|
||||
events.ScheduleEvent(EVENT_LAVA_FISSURE_ERUPTION, 6000);
|
||||
}
|
||||
|
||||
@@ -330,7 +330,7 @@ public:
|
||||
{
|
||||
case EVENT_LAVA_FISSURE_ERUPTION:
|
||||
me->RemoveAurasDueToSpell(SPELL_LAVA_FISSURE_CRACK);
|
||||
me->CastSpell(me, SPELL_LAVA_FISSURE_ERUPTION, true);
|
||||
DoCast(me, SPELL_LAVA_FISSURE_ERUPTION, true);
|
||||
me->DespawnOrUnsummon(14000);
|
||||
break;
|
||||
default:
|
||||
@@ -359,14 +359,16 @@ public:
|
||||
{
|
||||
npc_stalactite_triggerAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetDisableGravity(true);
|
||||
me->CastSpell(me, SPELL_STALACTITE_SHADE, true);
|
||||
DoCast(me, SPELL_STALACTITE_SHADE, true);
|
||||
events.ScheduleEvent(EVENT_STALACTITE_MISSLE, 5600);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (events.Empty())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
@@ -374,7 +376,7 @@ public:
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_STALACTITE_MISSLE:
|
||||
DoCast(SPELL_STALACTITE_MISSLE);
|
||||
DoCast(me, SPELL_STALACTITE_MISSLE);
|
||||
me->DespawnOrUnsummon(11000);
|
||||
break;
|
||||
default:
|
||||
@@ -394,15 +396,6 @@ public:
|
||||
};
|
||||
|
||||
// 81035 - Stalactite (check if player is near to summon stalactite)
|
||||
class NotPlayerCheck
|
||||
{
|
||||
public:
|
||||
bool operator()(WorldObject* object) const
|
||||
{
|
||||
return (object->GetTypeId() != TYPEID_PLAYER);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_s81035_stalactite : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
@@ -412,11 +405,6 @@ public:
|
||||
{
|
||||
PrepareSpellScript(spell_s81035_stalactite_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.remove_if(NotPlayerCheck());
|
||||
}
|
||||
|
||||
void SummonStalactiteTrigger()
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
@@ -425,7 +413,6 @@ public:
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_s81035_stalactite_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnHit += SpellHitFn(spell_s81035_stalactite_SpellScript::SummonStalactiteTrigger);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -34,6 +34,17 @@
|
||||
// TO-DO:
|
||||
// - Find out spell IDs for both Stonecore Teleporters (spellclick).
|
||||
|
||||
ObjectData const creatureData[] =
|
||||
{
|
||||
{ NPC_MILLHOUSE_MANASTORM, DATA_MILLHOUSE_MANASTORM },
|
||||
{ NPC_CORBORUS, DATA_CORBORUS },
|
||||
{ NPC_SLABHIDE, DATA_SLABHIDE },
|
||||
{ NPC_HIGH_PRIESTESS_AZIL, DATA_HIGH_PRIESTESS_AZIL },
|
||||
{ NPC_STONECORE_TELEPORTER, DATA_STONECORE_TELEPORTER },
|
||||
{ NPC_STONECORE_TELEPORTER_2, DATA_STONECORE_TELEPORTER_2 },
|
||||
{ 0, 0 } // END
|
||||
};
|
||||
|
||||
class instance_stonecore : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
@@ -45,6 +56,7 @@ class instance_stonecore : public InstanceMapScript
|
||||
{
|
||||
SetHeaders(DataHeader);
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
LoadObjectData(creatureData, nullptr);
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go) override
|
||||
@@ -67,27 +79,10 @@ class instance_stonecore : public InstanceMapScript
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_MILLHOUSE_MANASTORM:
|
||||
millhouseGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_CORBORUS:
|
||||
corobrusGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_SLABHIDE:
|
||||
slabhideGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HIGH_PRIESTESS_AZIL:
|
||||
highPriestessAzilGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_STONECORE_TELEPORTER:
|
||||
case NPC_STONECORE_TELEPORTER_2:
|
||||
if (GetBossState(DATA_SLABHIDE) != DONE)
|
||||
stonecoreTeleporterGUID[creature->GetEntry() - NPC_STONECORE_TELEPORTER] = creature->GetGUID();
|
||||
else // If Slabhide is already dead, no need to store teleporter guids
|
||||
{
|
||||
creature->CastSpell(creature, SPELL_TELEPORTER_ACTIVE_VISUAL, true);
|
||||
creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
||||
}
|
||||
if (GetBossState(DATA_SLABHIDE) == DONE)
|
||||
ActivateTeleporter(creature);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -95,7 +90,7 @@ class instance_stonecore : public InstanceMapScript
|
||||
|
||||
// Check if creature is part of Millhouse event
|
||||
creature->SearchFormation();
|
||||
if (CreatureGroup* group = creature->GetFormation()) // TO-DO: Fix formations
|
||||
if (CreatureGroup* group = creature->GetFormation())
|
||||
{
|
||||
switch (group->GetId())
|
||||
{
|
||||
@@ -109,6 +104,8 @@ class instance_stonecore : public InstanceMapScript
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
InstanceScript::OnCreatureCreate(creature);
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state) override
|
||||
@@ -123,16 +120,9 @@ class instance_stonecore : public InstanceMapScript
|
||||
// Activate teleporters
|
||||
if (state == DONE)
|
||||
{
|
||||
for (int8 i = 0; i < MAX_STONECORE_TELEPORTERS; i++)
|
||||
{
|
||||
if (Creature* teleporter = instance->GetCreature(stonecoreTeleporterGUID[i]))
|
||||
{
|
||||
teleporter->CastSpell(teleporter, SPELL_TELEPORTER_ACTIVE_VISUAL, true);
|
||||
teleporter->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
||||
}
|
||||
}
|
||||
ActivateTeleporter(GetCreature(DATA_STONECORE_TELEPORTER));
|
||||
ActivateTeleporter(GetCreature(DATA_STONECORE_TELEPORTER_2));
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -158,6 +148,9 @@ class instance_stonecore : public InstanceMapScript
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_HANDLE_CORBORUS_ROCKDOOR:
|
||||
HandleGameObject(corborusRockDoorGUID, true);
|
||||
break;
|
||||
case DATA_MILLHOUSE_EVENT_FACE:
|
||||
MillhouseEvent_Face();
|
||||
break;
|
||||
@@ -179,35 +172,11 @@ class instance_stonecore : public InstanceMapScript
|
||||
}
|
||||
}
|
||||
|
||||
ObjectGuid GetGuidData(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_MILLHOUSE_MANASTORM:
|
||||
return millhouseGUID;
|
||||
case GAMEOBJECT_CORBORUS_ROCKDOOR:
|
||||
return corborusRockDoorGUID;
|
||||
case DATA_CORBORUS:
|
||||
return corobrusGUID;
|
||||
case DATA_SLABHIDE:
|
||||
return slabhideGUID;
|
||||
case DATA_HIGH_PRIESTESS_AZIL:
|
||||
return highPriestessAzilGUID;
|
||||
case NPC_STONECORE_TELEPORTER:
|
||||
case NPC_STONECORE_TELEPORTER_2:
|
||||
return stonecoreTeleporterGUID[type - NPC_STONECORE_TELEPORTER];
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ObjectGuid::Empty;
|
||||
}
|
||||
|
||||
private:
|
||||
// Face Millhouse and other nearby mobs to Corborus
|
||||
void MillhouseEvent_Face()
|
||||
{
|
||||
if (Creature* Millhouse = instance->GetCreature(millhouseGUID))
|
||||
if (Creature* Millhouse = GetCreature(DATA_MILLHOUSE_MANASTORM))
|
||||
Millhouse->SetFacingTo(1.570796f);
|
||||
for (GuidVector::const_iterator i = millhouseLastGroupGUIDs.begin(); i != millhouseLastGroupGUIDs.end(); ++i)
|
||||
if (Creature* creature = instance->GetCreature(*i))
|
||||
@@ -217,7 +186,7 @@ class instance_stonecore : public InstanceMapScript
|
||||
// Knock back Millhouse and other mobs
|
||||
void MillhouseEvent_Knockback()
|
||||
{
|
||||
if (Creature* Millhouse = instance->GetCreature(millhouseGUID))
|
||||
if (Creature* Millhouse = GetCreature(DATA_MILLHOUSE_MANASTORM))
|
||||
Millhouse->CastSpell(Millhouse, SPELL_RING_WYRM_KNOCKBACK, true);
|
||||
for (GuidVector::const_iterator itr = millhouseLastGroupGUIDs.begin(); itr != millhouseLastGroupGUIDs.end(); ++itr)
|
||||
if (Creature* creature = instance->GetCreature(*itr))
|
||||
@@ -227,7 +196,7 @@ class instance_stonecore : public InstanceMapScript
|
||||
// Despawn all mobs
|
||||
void MillhouseEvent_Despawn()
|
||||
{
|
||||
if (Creature* Millhouse = instance->GetCreature(millhouseGUID))
|
||||
if (Creature* Millhouse = GetCreature(DATA_MILLHOUSE_MANASTORM))
|
||||
Millhouse->DespawnOrUnsummon(3000);
|
||||
for (GuidVector::const_iterator itr = millhouseTrashGUIDs.begin(); itr != millhouseTrashGUIDs.end(); ++itr)
|
||||
if (Creature* creature = instance->GetCreature(*itr))
|
||||
@@ -237,14 +206,18 @@ class instance_stonecore : public InstanceMapScript
|
||||
creature->DespawnOrUnsummon(3000);
|
||||
}
|
||||
|
||||
ObjectGuid millhouseGUID;
|
||||
void ActivateTeleporter(Creature* teleporter)
|
||||
{
|
||||
if (!teleporter)
|
||||
return;
|
||||
|
||||
teleporter->CastSpell(teleporter, SPELL_TELEPORTER_ACTIVE_VISUAL, true);
|
||||
teleporter->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
||||
}
|
||||
|
||||
GuidVector millhouseTrashGUIDs;
|
||||
GuidVector millhouseLastGroupGUIDs;
|
||||
ObjectGuid corborusRockDoorGUID;
|
||||
ObjectGuid corobrusGUID;
|
||||
ObjectGuid slabhideGUID;
|
||||
ObjectGuid highPriestessAzilGUID;
|
||||
ObjectGuid stonecoreTeleporterGUID[2];
|
||||
GuidVector slabhideRockWallGUIDs;
|
||||
|
||||
EncounterState slabhideIntro;
|
||||
|
||||
@@ -30,11 +30,6 @@ enum Texts
|
||||
SAY_MILLHOUSE_EVENT_2 = 1,
|
||||
};
|
||||
|
||||
enum NPCs
|
||||
{
|
||||
NPC_GENERIC_TRIGGER_LAB = 40350,
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
// Millhouse Manastorm
|
||||
@@ -96,6 +91,9 @@ Position const MillhousePointGroup2 = { 977.3045f, 895.2347f, 306.3298f };
|
||||
Position const MillhousePointGroup3 = { 1049.823f, 871.4349f, 295.006f };
|
||||
Position const MillhousePointGroup4 = { 1149.04f, 884.431f, 284.9406f };
|
||||
|
||||
// TO-DO:
|
||||
// - Millhouse Manastorm should face and cast SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND, but he won't. :(
|
||||
|
||||
// 43391 - Millhouse Manastorm
|
||||
class npc_sc_millhouse_manastorm : public CreatureScript
|
||||
{
|
||||
@@ -175,27 +173,28 @@ class npc_sc_millhouse_manastorm : public CreatureScript
|
||||
me->CombatStop(true);
|
||||
me->DeleteThreatList();
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
|
||||
switch (pointId)
|
||||
{
|
||||
case POINT_MILLHOUSE_GROUP_2:
|
||||
if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 150.0f))
|
||||
me->SetFacingToObject(worldtrigger); // o: 5.497359f (sniff data)
|
||||
me->CastSpell(me, SPELL_ANCHOR_HERE, true);
|
||||
me->AddAura(SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND, me);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 200.0f))
|
||||
me->SetFacingToObject(worldtrigger);
|
||||
DoCast(me, SPELL_ANCHOR_HERE);
|
||||
DoCast(me, SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND);
|
||||
events.ScheduleEvent(EVENT_READY_FOR_COMBAT, 10000);
|
||||
break;
|
||||
case POINT_MILLHOUSE_GROUP_3:
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetFacingTo(5.931499f);
|
||||
me->CastSpell(me, SPELL_ANCHOR_HERE, true);
|
||||
me->AddAura(SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND, me);
|
||||
DoCast(me, SPELL_ANCHOR_HERE);
|
||||
DoCast(me, SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND);
|
||||
events.ScheduleEvent(EVENT_READY_FOR_COMBAT, 10000);
|
||||
break;
|
||||
case POINT_MILLHOUSE_GROUP_4:
|
||||
me->SetFacingTo(3.455752f);
|
||||
me->CastSpell(me, SPELL_ANCHOR_HERE, true);
|
||||
DoCast(me, SPELL_ANCHOR_HERE);
|
||||
Talk(SAY_MILLHOUSE_EVENT_2);
|
||||
events.ScheduleEvent(EVENT_CAST_IMPENDING_DOOM, 1000);
|
||||
break;
|
||||
@@ -206,14 +205,14 @@ class npc_sc_millhouse_manastorm : public CreatureScript
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
// Only update events if Millhouse is aggressive
|
||||
if (me->GetReactState() != REACT_AGGRESSIVE)
|
||||
// Do not update events if Millhouse is aggressive and has no combat.
|
||||
if (!UpdateVictim() && me->GetReactState() == REACT_AGGRESSIVE)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
// Impending Doom is exception because it needs to be interrupted.
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING) && me->GetCurrentSpell(CURRENT_GENERIC_SPELL)->GetSpellInfo()->Id != SPELL_IMPENDING_DOOM_CHANNEL)
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING) && !me->FindCurrentSpellBySpellId(SPELL_IMPENDING_DOOM))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
@@ -221,7 +220,7 @@ class npc_sc_millhouse_manastorm : public CreatureScript
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FROSTBOLT_VOLLEY:
|
||||
DoCast(SPELL_FROSTBOLT_VOLLEY);
|
||||
DoCastAOE(SPELL_FROSTBOLT_VOLLEY);
|
||||
events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 7000);
|
||||
break;
|
||||
case EVENT_SHADOWFURY:
|
||||
@@ -240,8 +239,8 @@ class npc_sc_millhouse_manastorm : public CreatureScript
|
||||
ScheduleEvents();
|
||||
break;
|
||||
case EVENT_CAST_IMPENDING_DOOM:
|
||||
DoCast(SPELL_IMPENDING_DOOM);
|
||||
DoCast(SPELL_IMPENDING_DOOM_CHANNEL);
|
||||
DoCast(me, SPELL_IMPENDING_DOOM);
|
||||
DoCast(me, SPELL_IMPENDING_DOOM_CHANNEL);
|
||||
events.ScheduleEvent(EVENT_INTERRUPT_IMPENDING_DOOM, urand(15000,20000));
|
||||
break;
|
||||
case EVENT_INTERRUPT_IMPENDING_DOOM:
|
||||
@@ -341,11 +340,6 @@ class spell_sc_twilight_documents : public SpellScriptLoader
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetTarget(WorldObject*& target)
|
||||
{
|
||||
target = GetCaster()->FindNearestCreature(NPC_GENERIC_TRIGGER_LAB, 100.0f);
|
||||
}
|
||||
|
||||
void SpawnGameObject(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (WorldLocation* loc = GetHitDest())
|
||||
@@ -354,7 +348,6 @@ class spell_sc_twilight_documents : public SpellScriptLoader
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_sc_twilight_documents_SpellScript::SetTarget, EFFECT_0, TARGET_DEST_NEARBY_ENTRY);
|
||||
OnEffectHit += SpellEffectFn(spell_sc_twilight_documents_SpellScript::SpawnGameObject, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
@@ -372,7 +365,7 @@ class JumpCheck
|
||||
bool operator()(WorldObject* object) const
|
||||
{
|
||||
Player* player = object->ToPlayer();
|
||||
return (player && player->HasUnitState(UNIT_STATE_JUMPING));
|
||||
return (player && (player->IsFalling() || player->HasUnitState(UNIT_STATE_JUMPING)));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -410,7 +403,7 @@ public:
|
||||
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
|
||||
{
|
||||
if (InstanceScript* instance = player->GetInstanceScript())
|
||||
if (Creature* corborus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_CORBORUS)))
|
||||
if (Creature* corborus = instance->GetCreature(DATA_CORBORUS))
|
||||
corborus->AI()->DoAction(ACTION_CORBORUS_INTRO);
|
||||
return true;
|
||||
}
|
||||
@@ -424,7 +417,7 @@ public:
|
||||
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
|
||||
{
|
||||
if (InstanceScript* instance = player->GetInstanceScript())
|
||||
if (Creature* slabhide = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_SLABHIDE)))
|
||||
if (Creature* slabhide = instance->GetCreature(DATA_SLABHIDE))
|
||||
slabhide->AI()->DoAction(ACTION_SLABHIDE_INTRO);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -32,11 +32,16 @@ enum DataTypes
|
||||
// Additional Data
|
||||
DATA_MILLHOUSE_MANASTORM,
|
||||
DATA_MILLHOUSE_EVENT_FACE,
|
||||
DATA_HANDLE_CORBORUS_ROCKDOOR,
|
||||
DATA_MILLHOUSE_EVENT_KNOCKBACK,
|
||||
DATA_MILLHOUSE_EVENT_DESPAWN,
|
||||
|
||||
DATA_SLABHIDE_INTRO,
|
||||
DATA_SLABHIDE_ROCK_WALL,
|
||||
|
||||
// Teleporters
|
||||
DATA_STONECORE_TELEPORTER,
|
||||
DATA_STONECORE_TELEPORTER_2,
|
||||
};
|
||||
|
||||
enum Misc
|
||||
|
||||
Reference in New Issue
Block a user