diff options
| author | et65 <et65@ashbringer.fr> | 2014-12-28 19:50:19 +0100 |
|---|---|---|
| committer | et65 <et65@ashbringer.fr> | 2014-12-28 19:50:19 +0100 |
| commit | e46921748d9173f0dcaa32f8a53626c21cf4a2a2 (patch) | |
| tree | e9467c092c4c9189b34ac10e95bc684c7d77ce3e /src/server/scripts | |
| parent | 4f557347ce26dcb3d7ce697ecd203ff92da5198a (diff) | |
| parent | 27137ca06e99209bd1a47a0ff7082ff14fcae8c9 (diff) | |
Merge remote-tracking branch 'trinitycore/6.x' into 6.x
Diffstat (limited to 'src/server/scripts')
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); } }; |
