diff options
author | Mihapro <miha.penger@siol.net> | 2014-12-28 18:00:13 +0000 |
---|---|---|
committer | Nayd <dnpd.dd@gmail.com> | 2014-12-28 18:02:10 +0000 |
commit | 76fa042fdc82a92780c148839f33ff8fbb099ab6 (patch) | |
tree | ab004045fbef78579e59bc6fa678874836d87d4f /src | |
parent | 611ff7096c5a03b20068e8edcf3db1b0bad6738d (diff) |
Scripts/Instance: The Stonecore updates
Stonecore Teleporters scripted. Some corrections, better handlings, fixed Travis warnings ...
Closes #13626
(cherry picked from commit 9a941ae125c8b22b802270f7f419c1a8bfd2a343)
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
Diffstat (limited to 'src')
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 |