aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
authoret65 <et65@ashbringer.fr>2014-12-28 19:50:19 +0100
committeret65 <et65@ashbringer.fr>2014-12-28 19:50:19 +0100
commite46921748d9173f0dcaa32f8a53626c21cf4a2a2 (patch)
treee9467c092c4c9189b34ac10e95bc684c7d77ce3e /src/server/scripts
parent4f557347ce26dcb3d7ce697ecd203ff92da5198a (diff)
parent27137ca06e99209bd1a47a0ff7082ff14fcae8c9 (diff)
Merge remote-tracking branch 'trinitycore/6.x' into 6.x
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp2
-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
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp1
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp26
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.h12
-rw-r--r--src/server/scripts/Outland/zone_hellfire_peninsula.cpp53
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp69
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp28
15 files changed, 320 insertions, 284 deletions
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 5a99d30100b..674560f2500 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1978,7 +1978,7 @@ public:
static bool HandleMuteInfoHelper(uint32 accountId, char const* accountName, ChatHandler *handler)
{
PreparedStatement *stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_MUTE_INFO);
- stmt->setUInt16(0, accountId);
+ stmt->setUInt32(0, accountId);
PreparedQueryResult result = LoginDatabase.Query(stmt);
if (!result)
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
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index 645df91d8ea..1b6df68c5c4 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -362,7 +362,7 @@ class NecroticPlagueTargetCheck : public std::unary_function<Unit*, bool>
bool operator()(Unit* unit) const
{
- if (!unit || unit == _sourceObj || !unit->isTargetableForAttack() || unit->IsTotem() || unit->HasAura(SPELL_PLAGUE_AVOIDANCE))
+ if (!unit || unit == _sourceObj || !unit->isTargetableForAttack() || unit->GetTypeId() != TYPEID_PLAYER || unit->HasAura(SPELL_PLAGUE_AVOIDANCE))
return false;
if ((_notAura1 && unit->HasAura(_notAura1)) || (_notAura2 && unit->HasAura(_notAura2)))
return false;
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
index 1df5f5eac8f..c12b0889f9d 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
@@ -19,6 +19,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "nexus.h"
+#include "GameEventMgr.h"
enum Spells
{
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
index 0665bfd240c..ed902dba260 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
@@ -192,6 +192,7 @@ class instance_oculus : public InstanceMapScript
FreeDragons();
if (Creature* varos = instance->GetCreature(VarosGUID))
varos->SetPhaseMask(1, true);
+ events.ScheduleEvent(EVENT_VAROS_INTRO, 15000);
}
break;
case DATA_VAROS:
@@ -209,6 +210,7 @@ class instance_oculus : public InstanceMapScript
{
eregos->SetPhaseMask(1, true);
GreaterWhelps();
+ events.ScheduleEvent(EVENT_EREGOS_INTRO, 5000);
}
}
break;
@@ -267,6 +269,28 @@ class instance_oculus : public InstanceMapScript
}
}
+ void Update(uint32 diff) override
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_VAROS_INTRO:
+ if (Creature* varos = instance->GetCreature(VarosGUID))
+ varos->AI()->Talk(SAY_VAROS_INTRO_TEXT);
+ break;
+ case EVENT_EREGOS_INTRO:
+ if (Creature* eregos = instance->GetCreature(EregosGUID))
+ eregos->AI()->Talk(SAY_EREGOS_INTRO_TEXT);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
void GreaterWhelps()
{
for (ObjectGuid guid : GreaterWhelpList)
@@ -289,6 +313,8 @@ class instance_oculus : public InstanceMapScript
ObjectGuid EregosCacheGUID;
GuidList GreaterWhelpList;
+
+ EventMap events;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
index 268cdb54e3e..d1144df9486 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
@@ -79,6 +79,18 @@ enum OculusSpells
SPELL_DEATH_SPELL = 50415
};
+enum InstanceTexts
+{
+ SAY_EREGOS_INTRO_TEXT = 0,
+ SAY_VAROS_INTRO_TEXT = 4
+};
+
+enum InstanceEvents
+{
+ EVENT_VAROS_INTRO = 1,
+ EVENT_EREGOS_INTRO
+};
+
enum Misc
{
POINT_MOVE_OUT = 1
diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
index 79e6649495b..58f77f22f97 100644
--- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
+++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
@@ -140,8 +140,8 @@ enum AncestralWolf
{
EMOTE_WOLF_LIFT_HEAD = 0,
EMOTE_WOLF_HOWL = 1,
- SAY_WOLF_WELCOME = 2,
- SPELL_ANCESTRAL_WOLF_BUFF = 29981,
+ SAY_WOLF_WELCOME = 0,
+ SPELL_ANCESTRAL_WOLF_BUFF = 29938,
NPC_RYGA = 17123
};
@@ -166,11 +166,16 @@ public:
void Reset() override
{
ryga = NULL;
+ }
+
+ // Override Evade Mode event, recast buff that was removed by standard handler
+ void EnterEvadeMode() override
+ {
+ npc_escortAI::EnterEvadeMode();
DoCast(me, SPELL_ANCESTRAL_WOLF_BUFF, true);
}
void MoveInLineOfSight(Unit* who) override
-
{
if (!ryga && who->GetEntry() == NPC_RYGA && me->IsWithinDistInMap(who, 15.0f))
if (Creature* temp = who->ToCreature())
@@ -188,10 +193,48 @@ public:
break;
case 2:
Talk(EMOTE_WOLF_HOWL);
+ DoCast(me, SPELL_ANCESTRAL_WOLF_BUFF, true);
+ break;
+ // Move Ryga into position
+ case 48:
+ if (Creature* ryga = me->FindNearestCreature(NPC_RYGA,70))
+ {
+ if (ryga->IsAlive() && !ryga->IsInCombat())
+ {
+ ryga->SetWalk(true);
+ ryga->SetSpeed(MOVE_WALK, 1.5f);
+ ryga->GetMotionMaster()->MovePoint(0, 517.340698f, 3885.03975f, 190.455978f, true);
+ Reset();
+ }
+ }
break;
+ // Ryga Kneels and welcomes spirit wolf
case 50:
- if (ryga && ryga->IsAlive() && !ryga->IsInCombat())
- ryga->AI()->Talk(SAY_WOLF_WELCOME);
+ if (Creature* ryga = me->FindNearestCreature(NPC_RYGA,70))
+ {
+ if (ryga->IsAlive() && !ryga->IsInCombat())
+ {
+ ryga->SetFacingTo(0.776773f);
+ ryga->SetStandState(UNIT_STAND_STATE_KNEEL);
+ ryga->AI()->Talk(SAY_WOLF_WELCOME);
+ Reset();
+ }
+ }
+ break;
+ // Ryga returns to spawn point
+ case 51:
+ if (Creature* ryga = me->FindNearestCreature(NPC_RYGA,70))
+ {
+ if (ryga->IsAlive() && !ryga->IsInCombat())
+ {
+ float fRetX, fRetY, fRetZ, fRetO;
+ ryga->GetRespawnPosition(fRetX, fRetY, fRetZ, &fRetO);
+ ryga->SetHomePosition(fRetX, fRetY, fRetZ, fRetO);
+ ryga->SetStandState(UNIT_STAND_STATE_STAND);
+ ryga->GetMotionMaster()->MoveTargetedHome();
+ Reset();
+ }
+ }
break;
}
}
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index baf7ff48cb5..fc8ba0ffad0 100644
--- a/src/server/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
@@ -392,7 +392,7 @@ class spell_mage_cone_of_cold : public SpellScriptLoader
};
// 42955 Conjure Refreshment
-/// Updated 4.3.4
+/// Updated 6.0.3
struct ConjureRefreshmentData
{
uint32 minLevel;
@@ -400,7 +400,7 @@ struct ConjureRefreshmentData
uint32 spellId;
};
-uint8 const MAX_CONJURE_REFRESHMENT_SPELLS = 7;
+uint8 const MAX_CONJURE_REFRESHMENT_SPELLS = 9;
ConjureRefreshmentData const _conjureData[MAX_CONJURE_REFRESHMENT_SPELLS] =
{
{ 33, 43, 92739 },
@@ -409,7 +409,9 @@ ConjureRefreshmentData const _conjureData[MAX_CONJURE_REFRESHMENT_SPELLS] =
{ 64, 73, 92805 },
{ 74, 79, 74625 },
{ 80, 84, 92822 },
- { 85, 85, 92727 }
+ { 85, 89, 92727 },
+ { 90, 99, 116130 },
+ { 100, 100, 167143 }
};
// 42955 - Conjure Refreshment
@@ -462,6 +464,66 @@ class spell_mage_conjure_refreshment : public SpellScriptLoader
}
};
+uint8 const MAX_CONJURE_REFRESHMENT_TABLE_SPELLS = 5;
+ConjureRefreshmentData const _conjureTableData[MAX_CONJURE_REFRESHMENT_TABLE_SPELLS] =
+{
+ { 73, 79, 120056 },
+ { 80, 84, 120055 },
+ { 85, 89, 120054 },
+ { 90, 99, 120053 },
+ { 100, 100, 167145 }
+};
+
+// 43987 - Conjure Refreshment Table
+class spell_mage_conjure_refreshment_table : public SpellScriptLoader
+{
+public:
+ spell_mage_conjure_refreshment_table() : SpellScriptLoader("spell_mage_conjure_refreshment_table") { }
+
+ class spell_mage_conjure_refreshment_table_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mage_conjure_refreshment_table_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_TABLE_SPELLS; ++i)
+ if (!sSpellMgr->GetSpellInfo(_conjureTableData[i].spellId))
+ return false;
+ return true;
+ }
+
+ bool Load() override
+ {
+ if (GetCaster()->GetTypeId() != TYPEID_PLAYER)
+ return false;
+ return true;
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ uint8 level = GetHitUnit()->getLevel();
+ for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_TABLE_SPELLS; ++i)
+ {
+ ConjureRefreshmentData const& spellData = _conjureTableData[i];
+ if (level < spellData.minLevel || level > spellData.maxLevel)
+ continue;
+ GetHitUnit()->CastSpell(GetHitUnit(), spellData.spellId);
+ break;
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment_table_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const override
+ {
+ return new spell_mage_conjure_refreshment_table_SpellScript();
+ }
+};
+
// 543 - Fire War
class spell_mage_fire_frost_ward : public SpellScriptLoader
{
@@ -1468,6 +1530,7 @@ void AddSC_mage_spell_scripts()
new spell_mage_cold_snap();
new spell_mage_cone_of_cold();
new spell_mage_conjure_refreshment();
+ new spell_mage_conjure_refreshment_table();
new spell_mage_fire_frost_ward();
new spell_mage_focus_magic();
new spell_mage_frostbolt();
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index e9cf81f2e64..434a8f75693 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -1076,9 +1076,12 @@ class spell_q14112_14145_chum_the_water: public SpellScriptLoader
// http://old01.wowhead.com/quest=9452 - Red Snapper - Very Tasty!
enum RedSnapperVeryTasty
{
- SPELL_CAST_NET = 29866,
- ITEM_RED_SNAPPER = 23614,
- SPELL_NEW_SUMMON_TEST = 49214,
+ ITEM_RED_SNAPPER = 23614,
+
+ SPELL_CAST_NET = 29866,
+ SPELL_NEW_SUMMON_TEST = 49214,
+
+ GO_SCHOOL_OF_RED_SNAPPER = 181616
};
class spell_q9452_cast_net: public SpellScriptLoader
@@ -1095,6 +1098,15 @@ class spell_q9452_cast_net: public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
+ SpellCastResult CheckCast()
+ {
+ GameObject* go = GetCaster()->FindNearestGameObject(GO_SCHOOL_OF_RED_SNAPPER, 3.0f);
+ if (!go || go->GetRespawnTime())
+ return SPELL_FAILED_REQUIRES_SPELL_FOCUS;
+
+ return SPELL_CAST_OK;
+ }
+
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Player* caster = GetCaster()->ToPlayer();
@@ -1104,9 +1116,19 @@ class spell_q9452_cast_net: public SpellScriptLoader
caster->CastSpell(caster, SPELL_NEW_SUMMON_TEST, true);
}
+ void HandleActiveObject(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ GetHitGObj()->SetRespawnTime(roll_chance_i(50) ? 2 * MINUTE : 3 * MINUTE);
+ GetHitGObj()->Use(GetCaster());
+ GetHitGObj()->SetLootState(GO_JUST_DEACTIVATED);
+ }
+
void Register() override
{
+ OnCheckCast += SpellCheckCastFn(spell_q9452_cast_net_SpellScript::CheckCast);
OnEffectHit += SpellEffectFn(spell_q9452_cast_net_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_q9452_cast_net_SpellScript::HandleActiveObject, EFFECT_1, SPELL_EFFECT_ACTIVATE_OBJECT);
}
};