From cf3c3cb5e0e7d00f49e19089014f14f8beed63a7 Mon Sep 17 00:00:00 2001 From: Ovalord <1Don7H4v3@m41L.com> Date: Mon, 19 Feb 2018 12:25:00 +0100 Subject: [PATCH] Scripts/Deadmines: implement Admiral Ripsnarl encounter --- .../4.3.4/custom_2018_02_19_00_world.sql | 48 ++ .../Deadmines/boss_admiral_ripsnarl.cpp | 462 ++++++++++++++++++ .../EasternKingdoms/Deadmines/deadmines.h | 9 +- .../Deadmines/instance_deadmines.cpp | 25 + .../eastern_kingdoms_script_loader.cpp | 2 + 5 files changed, 545 insertions(+), 1 deletion(-) create mode 100644 sql/updates/world/4.3.4/custom_2018_02_19_00_world.sql create mode 100644 src/server/scripts/EasternKingdoms/Deadmines/boss_admiral_ripsnarl.cpp diff --git a/sql/updates/world/4.3.4/custom_2018_02_19_00_world.sql b/sql/updates/world/4.3.4/custom_2018_02_19_00_world.sql new file mode 100644 index 00000000000..b3651be240f --- /dev/null +++ b/sql/updates/world/4.3.4/custom_2018_02_19_00_world.sql @@ -0,0 +1,48 @@ +-- Template Updates +-- Admiral Ripsnarl +UPDATE `creature_template` SET `ScriptName`= 'boss_admiral_ripsnarl' WHERE `entry`= 47626; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `DamageModifier`= 30, `flags_extra`= 1 WHERE `entry`= 48943; +-- Vapor +UPDATE `creature_template` SET `minlevel`= 15, `maxlevel`= 15, `difficulty_entry_1`= 49241, `ScriptName`= 'npc_ripsnarl_vapor' WHERE `entry`= 47714; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `exp`= 3, `faction`= 14, `DamageModifier`= 10 WHERE `entry`= 49241; + + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID`= 47626; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `Comment`) VALUES +(47626, 0, 0, 'Ah, fresh meat!', 14, 0, 100, 0, 0, 19882, 48179, 'Admiral Ripsnarl - Aggro'), +(47626, 1, 0, 'Do you feel that chill running up your spine?', 14, 0, 100, 0, 0, 19877, 47914, 'Admiral Ripsnarl - Fog 1'), +(47626, 2, 0, 'The fog is rolling in...', 14, 0, 100, 0, 0, 0, 47915, 'Admiral Ripsnarl - Fog 2'), +(47626, 3, 0, 'Your blood only increases my hunger!', 14, 0, 100, 0, 0, 19876, 48009, 'Admiral Ripsnarl - Slay'), +(47626, 4, 0, 'I can smell your fear...', 14, 0, 100, 0, 0, 19879, 48006, 'Admiral Ripsnarl - Go for the Throat 1'), +(47626, 4, 1, 'I will rip your heart from your chest!', 14, 0, 100, 0, 0, 19880, 48007, 'Admiral Ripsnarl - Go for the Throat 2'), +(47626, 5, 0, 'Multiple vapors appear from the fog! Kill Admiral Ripsnarl before you are overwhelmed!', 41, 0, 100, 0, 0, 19878, 50851, 'Admiral Ripsnarl - Announce Vapor'), +(47626, 6, 0, 'You will...NOT find her...until it is too late...', 14, 0, 100, 0, 0, 19875, 48010, 'Admiral Ripsnarl - Death'); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceEntry` IN (95408) AND `SourceTypeOrReferenceId`= 13; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES +(13, 1, 95408, 0, 0, 31, 0, 3, 48266, 0, 0, 0, '', 'Ripnsarl Cannon Kill - Target Defias Cannon'); + +-- Spells +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_ripsnarl_go_for_the_throat_targeting', +'spell_ripsnarl_summon_vapor_targeting'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(88838, 'spell_ripsnarl_go_for_the_throat_targeting'), +(88833, 'spell_ripsnarl_summon_vapor_targeting'); + +-- Loot +UPDATE `creature_template` SET `lootid`= 47626 WHERE `entry` = 47626; +DELETE FROM creature_loot_template WHERE `Entry` IN (47626, 48943); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Chance`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`) VALUES +(47626, 1156, 0, 1, 1, 1, 1), +(47626, 5196, 0, 1, 1, 1, 1), +(47626, 872, 0, 1, 1, 1, 1); + +UPDATE `creature_template` SET `lootid`= 48943 WHERE `entry` = 48943; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Chance`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`) VALUES +(48943, 65166, 0, 1, 1, 1, 1), +(48943, 65165, 0, 1, 1, 1, 1), +(48943, 65167, 0, 1, 1, 1, 1); diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_admiral_ripsnarl.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_admiral_ripsnarl.cpp new file mode 100644 index 00000000000..19d17903360 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_admiral_ripsnarl.cpp @@ -0,0 +1,462 @@ +/* +* Copyright (C) 2008-2017 TrinityCore +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see . +*/ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "Player.h" +#include "deadmines.h" + +enum Texts +{ + // Admiral Ripsnarl + SAY_AGGRO = 0, + SAY_FOG_1 = 1, + SAY_FOG_2 = 2, + SAY_SLAY = 3, + SAY_GO_FOR_THE_THROAT = 4, + SAY_ANNOUNCE_VAPORS = 5, + SAY_DEATH = 6 +}; + +enum Spells +{ + // Admiral Ripsnarl + SPELL_RIPSNARL_CANNON_KILL = 95408, + SPELL_THIRST_FOR_BLOOD = 88736, + SPELL_SWIPE = 88839, + SPELL_EMOTE_TALK = 79506, + SPELL_VANISH = 88840, + SPELL_GO_FOR_THE_THROAT_TARGETING = 88838, + SPELL_SUMMON_VAPOR_TARGETING = 88833, + + // Vapor + SPELL_STEAM_AURA = 95503, + SPELL_CONDENSATION = 92013, + + SPELL_SWIRLING_VAPOR = 92007, + SPELL_CONDENSING_VAPOR = 92008, + SPELL_FREEZING_VAPOR = 92011, + SPELL_COALESCE = 92042, + SPELL_CONDENSE_TRANSFORM_1 = 92016, + SPELL_CONDENSE_TRANSFORM_2 = 92020, + SPELL_VAPOR_ANIMUS = 92038, + + // General Purpose Bunny JMF + SPELL_RIPSNARLS_FOG_AURA = 89247 +}; + +enum Events +{ + // Admiral Ripsnarl + EVENT_SWIPE = 1, + EVENT_SAY_VANISH_INTRO, + EVENT_VANISH, + EVENT_CAST_VANISH, + EVENT_CAST_RIPSNARLS_FOG_AURA, + EVENT_GO_FOR_THE_THROAT, + EVENT_SUMMON_VAPOR, + + // Vapor + EVENT_VAPOR, +}; + +enum Sounds +{ + SOUND_HOWL = 19881 +}; + +class boss_admiral_ripsnarl: public CreatureScript +{ + public: + boss_admiral_ripsnarl() : CreatureScript("boss_admiral_ripsnarl") { } + + struct boss_admiral_ripsnarlAI : public BossAI + { + boss_admiral_ripsnarlAI(Creature* creature) : BossAI(creature, DATA_ADMIRAL_RIPSNARL) + { + Initialize(); + } + + void Initialize() + { + _vanishCounter = 0; + _firstVaporGuid.Clear(); + } + + void Reset() override + { + _Reset(); + Initialize(); + DoCastSelf(SPELL_THIRST_FOR_BLOOD, true); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + Talk(SAY_AGGRO); + DoCastAOE(SPELL_RIPSNARL_CANNON_KILL, true); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + events.ScheduleEvent(EVENT_SWIPE, Seconds(3) + Milliseconds(500)); + if (IsHeroic()) + events.ScheduleEvent(EVENT_GO_FOR_THE_THROAT, Seconds(11)); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->SetData(DATA_RIPSNARL_FOG, NOT_STARTED); + Talk(SAY_DEATH); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + _EnterEvadeMode(); + summons.DespawnAll(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->SetData(DATA_RIPSNARL_FOG, NOT_STARTED); + summons.DespawnAll(); + _DespawnAtEvade(); + } + + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + if (_firstVaporGuid.IsEmpty()) + _firstVaporGuid = summon->GetGUID(); + } + + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + switch (summon->GetEntry()) + { + case NPC_VAPOR: + if (summon->GetGUID() == _firstVaporGuid) + Talk(SAY_GO_FOR_THE_THROAT); + break; + default: + break; + } + } + + void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override + { + if (HealthBelowPct(75) && _vanishCounter == 0) + { + Talk(SAY_FOG_1); + DoCastSelf(SPELL_EMOTE_TALK, true); + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + events.CancelEvent(EVENT_GO_FOR_THE_THROAT); + events.CancelEvent(EVENT_SWIPE); + events.CancelEvent(EVENT_SUMMON_VAPOR); + events.ScheduleEvent(EVENT_VANISH, Seconds(3) + Milliseconds(600)); + events.ScheduleEvent(EVENT_SAY_VANISH_INTRO, Seconds(3) + Milliseconds(600)); + events.ScheduleEvent(EVENT_CAST_RIPSNARLS_FOG_AURA, Seconds(3) + Milliseconds(600)); + _vanishCounter++; + } + else if (HealthBelowPct(50) && _vanishCounter == 1) + { + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + events.CancelEvent(EVENT_GO_FOR_THE_THROAT); + events.CancelEvent(EVENT_SWIPE); + events.CancelEvent(EVENT_SUMMON_VAPOR); + events.ScheduleEvent(EVENT_VANISH, Milliseconds(1)); + _vanishCounter++; + } + else if (HealthBelowPct(25) && _vanishCounter == 2) + { + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + events.CancelEvent(EVENT_GO_FOR_THE_THROAT); + events.CancelEvent(EVENT_SWIPE); + events.CancelEvent(EVENT_SUMMON_VAPOR); + events.ScheduleEvent(EVENT_VANISH, Milliseconds(1)); + _vanishCounter++; + } + else if (IsHeroic() && HealthBelowPct(10) && _vanishCounter == 3) + { + for (uint8 i = 0; i < 3; i++) + DoCastAOE(SPELL_SUMMON_VAPOR_TARGETING, true); + + _vanishCounter++; + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SWIPE: + DoCastVictim(SPELL_SWIPE); + events.Repeat(Seconds(3) + Milliseconds(500)); + break; + case EVENT_SAY_VANISH_INTRO: + Talk(SAY_FOG_2); + instance->SetData(DATA_RIPSNARL_FOG, IN_PROGRESS); + break; + case EVENT_VANISH: + { + float angle = me->GetOrientation() + float(M_PI); + float x = me->GetPositionX() + cos(angle) * 5; + float y = me->GetPositionY() + sin(angle) * 5; + float z = me->GetPositionZ(); + me->GetMotionMaster()->MovePoint(0, x, y, z, false); + + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _firstVaporGuid.Clear(); + events.ScheduleEvent(EVENT_CAST_VANISH, Milliseconds(1)); + events.ScheduleEvent(EVENT_GO_FOR_THE_THROAT, Seconds(22) + Milliseconds(500)); + events.ScheduleEvent(EVENT_SUMMON_VAPOR, Seconds(3)); + break; + } + case EVENT_CAST_VANISH: + DoCastSelf(SPELL_VANISH); + break; + case EVENT_CAST_RIPSNARLS_FOG_AURA: + if (Creature* bunny = me->FindNearestCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, 100.0f, true)) + bunny->CastSpell(bunny, SPELL_RIPSNARLS_FOG_AURA); + events.Repeat(Seconds(2)); + break; + case EVENT_GO_FOR_THE_THROAT: + if (me->HasAura(SPELL_VANISH)) + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + me->RemoveAurasDueToSpell(SPELL_VANISH); + me->SetReactState(REACT_AGGRESSIVE); + me->PlayDirectSound(SOUND_HOWL); + events.ScheduleEvent(EVENT_SWIPE, Seconds(3) + Milliseconds(500)); + events.RescheduleEvent(EVENT_SUMMON_VAPOR, Seconds(10)); + } + DoCastAOE(SPELL_GO_FOR_THE_THROAT_TARGETING, true); + if (IsHeroic()) + events.Repeat(_vanishCounter > 0 ? Seconds(9) + Milliseconds(500) : Seconds(10), _vanishCounter > 0 ? Seconds(10) : Seconds(12)); + break; + case EVENT_SUMMON_VAPOR: + DoCastAOE(SPELL_SUMMON_VAPOR_TARGETING, true); + events.Repeat(me->HasAura(SPELL_VANISH) ? Seconds(4) : Seconds(12), me->HasAura(SPELL_VANISH) ? Seconds(5) : Seconds(16)); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + uint8 _vanishCounter; + ObjectGuid _firstVaporGuid; + }; + + CreatureAI* GetAI(Creature *creature) const override + { + return GetDeadminesAI(creature); + } +}; + +class npc_ripsnarl_vapor : public CreatureScript +{ + public: + npc_ripsnarl_vapor() : CreatureScript("npc_ripsnarl_vapor") { } + + struct npc_ripsnarl_vaporAI : public ScriptedAI + { + npc_ripsnarl_vaporAI(Creature* creature) : ScriptedAI(creature) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + DoCastSelf(SPELL_STEAM_AURA, true); + if (Player* player = me->SelectNearestPlayer(50.0f)) + me->AI()->AttackStart(player); + + if (IsHeroic()) + { + DoCastSelf(SPELL_CONDENSATION, true); + _events.ScheduleEvent(EVENT_VAPOR, Seconds(3), Seconds(4)); + } + } + + void JustDied(Unit* /*killer*/) override + { + me->DespawnOrUnsummon(Seconds(5)); + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + { + if (spell->Id == SPELL_VAPOR_ANIMUS) + DoCastAOE(SPELL_COALESCE, true); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_VAPOR: + { + uint32 spellId = SPELL_SWIRLING_VAPOR; + if (me->HasAura(SPELL_CONDENSE_TRANSFORM_1)) + spellId = SPELL_CONDENSING_VAPOR; + else if (me->HasAura(SPELL_CONDENSE_TRANSFORM_2)) + spellId = SPELL_FREEZING_VAPOR; + + DoCastSelf(spellId); + _events.Repeat(Seconds(9), Seconds(10)); + break; + } + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetDeadminesAI(creature); + } +}; + +class TargetingCheck +{ + public: + TargetingCheck() { } + + bool operator()(WorldObject* object) + { + if (Unit* unit = object->ToUnit()) + if ((unit->IsCharmedOwnedByPlayerOrPlayer()) || unit->GetTypeId() == TYPEID_PLAYER) + return false; + + return true; + } +}; + +class spell_ripsnarl_go_for_the_throat_targeting : public SpellScriptLoader +{ + public: + spell_ripsnarl_go_for_the_throat_targeting() : SpellScriptLoader("spell_ripsnarl_go_for_the_throat_targeting") { } + + class spell_ripsnarl_go_for_the_throat_targeting_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ripsnarl_go_for_the_throat_targeting_SpellScript); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + targets.remove_if(TargetingCheck()); + + if (targets.empty()) + return; + + Trinity::Containers::RandomResize(targets, 1); + } + + void HandleHit(SpellEffIndex effIndex) + { + GetCaster()->CastSpell(GetHitUnit(), GetSpellInfo()->Effects[effIndex].BasePoints, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ripsnarl_go_for_the_throat_targeting_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_ripsnarl_go_for_the_throat_targeting_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_ripsnarl_go_for_the_throat_targeting_SpellScript(); + } +}; + +class spell_ripsnarl_summon_vapor_targeting : public SpellScriptLoader +{ + public: + spell_ripsnarl_summon_vapor_targeting() : SpellScriptLoader("spell_ripsnarl_summon_vapor_targeting") { } + + class spell_ripsnarl_summon_vapor_targeting_SpellScript : public SpellScript + { + PrepareSpellScript(spell_ripsnarl_summon_vapor_targeting_SpellScript); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + { + if (Creature* caster = GetCaster()->ToCreature()) + caster->AI()->EnterEvadeMode(); + return; + } + + targets.remove_if(TargetingCheck()); + + if (targets.empty()) + { + if (Creature* caster = GetCaster()->ToCreature()) + caster->AI()->EnterEvadeMode(); + return; + } + + Trinity::Containers::RandomResize(targets, 1); + } + + void HandleHit(SpellEffIndex effIndex) + { + GetCaster()->CastSpell(GetHitUnit(), GetSpellInfo()->Effects[effIndex].BasePoints, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ripsnarl_summon_vapor_targeting_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_ripsnarl_summon_vapor_targeting_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_ripsnarl_summon_vapor_targeting_SpellScript(); + } +}; + +void AddSC_boss_admiral_ripsnarl() +{ + new boss_admiral_ripsnarl(); + new npc_ripsnarl_vapor(); + new spell_ripsnarl_go_for_the_throat_targeting(); + new spell_ripsnarl_summon_vapor_targeting(); +} diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h index 37247ec7fd8..c48e95baa66 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h +++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h @@ -40,7 +40,8 @@ enum DMDataTypes DATA_FOE_REAPER_BUNNY = 10, DATA_PROTOTYPE_REAPER = 11, DATA_BROKEN_DOOR = 13, - DATA_IRON_CLAD_DOOR = 14 + DATA_IRON_CLAD_DOOR = 14, + DATA_RIPSNARL_FOG = 15 }; enum DMCreatures @@ -49,6 +50,7 @@ enum DMCreatures BOSS_GLUBTOK = 47162, BOSS_HELIX_GEARBREAKER = 47296, BOSS_FOE_REAPER_5000 = 43778, + BOSS_ADMIRAL_RIPSNARL = 47626, // Horde Creatures NPC_SLINKY_SHARPSHIV = 46906, @@ -84,6 +86,7 @@ enum DMCreatures NPC_FOE_REAPER_TARGETING_BUNNY = 47468, NPC_PROTOTYPE_REAPER = 49208, NPC_MOLTEN_SLAG = 49229, + NPC_VAPOR = 47714 }; enum DMGameObjects @@ -97,6 +100,10 @@ enum DMGameObjects GO_FOUNDRY_DOOR = 16399 }; +enum DMSpells +{ + SPELL_FOG = 88768 +}; template AI* GetDeadminesAI(Creature* creature) diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index 3dc924b94c7..86a8a5b268c 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -27,6 +27,7 @@ ObjectData const creatureData[] = { BOSS_GLUBTOK, DATA_GLUBTOK }, { BOSS_HELIX_GEARBREAKER, DATA_HELIX_GEARBREAKER }, { BOSS_FOE_REAPER_5000, DATA_FOE_REAPER_5000 }, + { BOSS_ADMIRAL_RIPSNARL, DATA_ADMIRAL_RIPSNARL }, { NPC_LUMBERING_OAF, DATA_LUMBERING_OAF }, { NPC_FOE_REAPER_TARGETING_BUNNY, DATA_FOE_REAPER_BUNNY }, { NPC_PROTOTYPE_REAPER, DATA_PROTOTYPE_REAPER }, @@ -126,6 +127,13 @@ class instance_deadmines : public InstanceMapScript if (Creature* reaper = GetCreature(DATA_FOE_REAPER_5000)) reaper->AI()->JustSummoned(creature); break; + case NPC_GENERAL_PURPOSE_BUNNY_L2: + _generalPurposeBunnyJMF2GuidSet.insert(creature->GetGUID()); + break; + case NPC_VAPOR: + if (Creature* ripsnarl = GetCreature(DATA_ADMIRAL_RIPSNARL)) + ripsnarl->AI()->JustSummoned(creature); + break; default: break; } @@ -162,6 +170,22 @@ class instance_deadmines : public InstanceMapScript _IronCladDoorState = data; SaveToDB(); break; + case DATA_RIPSNARL_FOG: + if (data == IN_PROGRESS) + { + if (Creature* ripsnarl = GetCreature(DATA_ADMIRAL_RIPSNARL)) + for (auto itr = _generalPurposeBunnyJMF2GuidSet.begin(); itr != _generalPurposeBunnyJMF2GuidSet.end(); itr++) + if (Creature* bunny = instance->GetCreature(*itr)) + if (bunny->GetDistance2d(ripsnarl->GetHomePosition().GetPositionX(), ripsnarl->GetHomePosition().GetPositionY()) <= 100.0f) + bunny->CastSpell(bunny, SPELL_FOG, true); + } + else if (data == NOT_STARTED) + { + for (auto itr = _generalPurposeBunnyJMF2GuidSet.begin(); itr != _generalPurposeBunnyJMF2GuidSet.end(); itr++) + if (Creature* bunny = instance->GetCreature(*itr)) + bunny->RemoveAllAuras(); + } + break; default: break; } @@ -201,6 +225,7 @@ class instance_deadmines : public InstanceMapScript uint32 _teamInInstance; uint32 _foeReaper5000Intro; uint32 _IronCladDoorState; + GuidSet _generalPurposeBunnyJMF2GuidSet; }; diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp index 06b7f0593b0..3d3f12d2490 100644 --- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp @@ -72,6 +72,7 @@ void AddSC_instance_deadmines(); void AddSC_boss_glubtok(); void AddSC_boss_helix_gearbreaker(); void AddSC_boss_foe_reaper_5000(); +void AddSC_boss_admiral_ripsnarl(); void AddSC_gilneas_c1(); //Gilneas void AddSC_gnomeregan(); //Gnomeregan void AddSC_instance_gnomeregan(); @@ -276,6 +277,7 @@ void AddEasternKingdomsScripts() AddSC_boss_glubtok(); AddSC_boss_helix_gearbreaker(); AddSC_boss_foe_reaper_5000(); + AddSC_boss_admiral_ripsnarl(); AddSC_gilneas_c1(); //Gilneas AddSC_gnomeregan(); //Gnomeregan AddSC_instance_gnomeregan();