aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/SpellMgr.cpp5
-rw-r--r--src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp26
-rw-r--r--src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp154
-rw-r--r--src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp39
-rw-r--r--src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp39
-rw-r--r--src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp95
-rw-r--r--src/server/scripts/Maelstrom/Stonecore/stonecore.cpp53
-rw-r--r--src/server/scripts/Maelstrom/Stonecore/stonecore.h5
8 files changed, 145 insertions, 271 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 544abc9ca87..46ec7553d02 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -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
diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp
index 1cf0cc56242..36289fb1169 100644
--- a/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp
+++ b/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp
@@ -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:
diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp
index 08d56f2fa50..c7fa900ff8b 100644
--- a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp
+++ b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp
@@ -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,32 +147,16 @@ 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
{
- Talk(SAY_DEATH);
- }
-
- /*
- void PassengerBoarded(Unit* who, int8 seatId, bool apply) override
- {
- if (!apply || who->GetEntry() != NPC_SEISMIC_SHARD)
- return;
+ _JustDied();
- 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();
+ Talk(SAY_DEATH);
}
- */
void MovementInform(uint32 type, uint32 id) override
{
@@ -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();
}
diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp
index 0b260de944a..b5448acb556 100644
--- a/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp
+++ b/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp
@@ -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);
}
diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp
index c5f0718e240..0b5b3e153be 100644
--- a/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp
+++ b/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp
@@ -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);
}
};
diff --git a/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp b/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp
index b2ac21a1edf..1e68c612616 100644
--- a/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp
+++ b/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp
@@ -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;
diff --git a/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp b/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp
index abfb82284d3..3500290c358 100644
--- a/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp
+++ b/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp
@@ -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;
}
diff --git a/src/server/scripts/Maelstrom/Stonecore/stonecore.h b/src/server/scripts/Maelstrom/Stonecore/stonecore.h
index 98a9878e0d3..a13a0efad58 100644
--- a/src/server/scripts/Maelstrom/Stonecore/stonecore.h
+++ b/src/server/scripts/Maelstrom/Stonecore/stonecore.h
@@ -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