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:
Mihapro
2014-12-28 18:00:13 +00:00
committed by Nayd
parent 611ff7096c
commit 76fa042fdc
9 changed files with 170 additions and 271 deletions

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

View File

@@ -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

View File

@@ -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:

View File

@@ -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();
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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