diff --git a/sql/updates/world/custom/custom_2018_07_27_02_world.sql b/sql/updates/world/custom/custom_2018_07_27_02_world.sql new file mode 100644 index 00000000000..ee75559c2f0 --- /dev/null +++ b/sql/updates/world/custom/custom_2018_07_27_02_world.sql @@ -0,0 +1,28 @@ +-- Template Updates +-- Runty +UPDATE `creature_template` SET `flags_extra`= 2 WHERE `entry` IN (40015, 40016); +-- Pups +UPDATE `creature_template` SET `ScriptName`= 'npc_beauty_puppy', `DamageModifier`= 12, `BaseVariance`= 0.5 WHERE `entry` IN (40008, 40011, 40013); +UPDATE `creature_template` SET `DamageModifier`= 25, `BaseVariance`= 0.5 WHERE `entry` IN (40009, 40012, 40014); +UPDATE `creature_template` SET `mechanic_immune_mask`= 1 | 512 | 65536 | 131072 WHERE `entry` IN (0008, 40011, 40013, 40009, 40012, 40014); +-- Spot +UPDATE `creature_template` SET `difficulty_entry_1`= 40012 WHERE `entry`= 40011; +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `exp`= 3, `faction`= 16, `speed_walk`= 1.6, `speed_run`= 1.28571, `unit_flags`= 32832 WHERE `entry`= 40012; + +-- Spells +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_beauty_magma_spit'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(76031, 'spell_beauty_magma_spit'); + +-- Creature corrections +-- Runty +UPDATE `creature` SET `MovementType`= 0, `spawndist`= 0 WHERE `guid`= 361807; +-- Buster (4.0.6 nerf: only two of the three pups are available on heroic difficulty) +UPDATE `creature` SET `spawnMask`= 1 WHERE `guid`= 361806; + +-- Creature addons +DELETE FROM `creature_addon` WHERE `guid`= 361807; +INSERT INTO `creature_addon` (`guid`, `auras`) VALUES +(361807, '77783'); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h index b9df3e6fff8..71b4c275727 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h @@ -27,15 +27,17 @@ uint32 const EncounterCount = 5; enum BRCDataTypes { - // Encounter States // Boss GUIDs - DATA_ROMOGG_BONECRUSHER = 0, - DATA_CORLA_HERALD_OF_TWILIGHT = 1, - DATA_KARSH_STEELBENDER = 2, - DATA_BEAUTY = 3, - DATA_ASCENDANT_LORD_OBSIDIUS = 4, + // Encounters + DATA_ROMOGG_BONECRUSHER = 0, + DATA_CORLA_HERALD_OF_TWILIGHT = 1, + DATA_KARSH_STEELBENDER = 2, + DATA_BEAUTY = 3, + DATA_ASCENDANT_LORD_OBSIDIUS = 4, // Additional Objects - DATA_RAZ_THE_CRAZED = 5 + DATA_RAZ_THE_CRAZED = 5, + DATA_LUCKY = 6, + DATA_SPOT = 7 }; enum BRCCreatureIds @@ -44,6 +46,7 @@ enum BRCCreatureIds BOSS_ROMOGG_BONECRUSHER = 39665, BOSS_CORLA_HERALD_OF_TWILIGHT = 39679, BOSS_KARSH_STEELBENDER = 39698, + BOSS_BEAUTY = 39700, // Encounter Related /*Rom'ogg Bonecrusher*/ @@ -61,6 +64,10 @@ enum BRCCreatureIds /*Karsh Steelbender*/ NPC_INVISIBLE_STALKER = 39842, NPC_BOUND_FLAMES = 50417, + + /*Beauty*/ + NPC_LUCKY = 40008, + NPC_SPOT = 40011 }; template diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp index 6fbac750144..be660b86c33 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp @@ -21,99 +21,214 @@ enum Sounds { - SOUND_AGGRO = 18559, - SOUND_DEATH = 18563 + // Beauty + SOUND_AGGRO = 18559, + SOUND_DEATH = 18563 }; enum Spells { - SPELL_TERRIFYING_ROAR = 76028, // Not yet Implemented - SPELL_BERSERKER_CHARGE = 76030, - SPELL_MAGMA_SPIT = 76031, - SPELL_FLAMEBREAK = 76032, - SPELL_BERSERK = 82395 // Not yet Implemented + // Beauty + SPELL_TERRIFYING_ROAR = 76028, + SPELL_BERSERKER_CHARGE = 76030, + SPELL_MAGMA_SPIT = 76031, + SPELL_FLAMEBREAK = 76032, + SPELL_BERSERK = 82395, + + // Lucky, Spot and Buster + SPELL_LAVA_DROOL = 76628, + SPELL_LITTLE_BIG_FLAME_BREATH = 76665, + + // Player + SPELL_MAGMA_SPIT_MISSILE_1 = 76058, + SPELL_MAGMA_SPIT_MISSILE_2 = 76072, + SPELL_MAGMA_SPIT_MISSILE_3 = 76074, + SPELL_MAGMA_SPIT_MISSILE_4 = 76076 }; enum Events { - EVENT_TERRIFYING_ROAR = 1, - EVENT_BERSERKER_CHARGE = 2, - EVENT_MAGMA_SPIT = 3, - EVENT_FLAMEBREAK = 4, - EVENT_BERSERK = 5 + // Beauty + EVENT_TERRIFYING_ROAR = 1, + EVENT_BERSERKER_CHARGE, + EVENT_MAGMA_SPIT, + EVENT_FLAMEBREAK, + + // Lucky, Spot and Buster + EVENT_LAVA_DROOL, + EVENT_LITTLE_BIG_FLAME_BREATH }; -class boss_beauty : public CreatureScript +struct boss_beauty : public BossAI { - public: - boss_beauty(): CreatureScript("boss_beauty") { } + boss_beauty(Creature* creature) : BossAI(creature, DATA_BEAUTY) { } - struct boss_beautyAI : public BossAI + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + events.ScheduleEvent(EVENT_BERSERKER_CHARGE, 15s); + events.ScheduleEvent(EVENT_FLAMEBREAK, 21s); + events.ScheduleEvent(EVENT_TERRIFYING_ROAR, 36s); + events.ScheduleEvent(EVENT_MAGMA_SPIT, 10s); + DoPlaySoundToSet(me, SOUND_AGGRO); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MAGMA_SPIT); + DoPlaySoundToSet(me, SOUND_DEATH); + + if (IsHeroic()) { - boss_beautyAI(Creature* creature) : BossAI(creature, DATA_BEAUTY) { } + if (Creature* lucky = instance->GetCreature(DATA_LUCKY)) + lucky->DespawnOrUnsummon(); - void Reset() override - { - _Reset(); - } - - void JustEngagedWith(Unit* /*who*/) override - { - _JustEngagedWith(); - events.ScheduleEvent(SPELL_MAGMA_SPIT, urand(7000, 10000)); - events.ScheduleEvent(EVENT_BERSERKER_CHARGE, urand(16000, 19000)); - events.ScheduleEvent(EVENT_FLAMEBREAK, urand(18000, 22000)); - DoPlaySoundToSet(me, SOUND_AGGRO); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - DoPlaySoundToSet(me, SOUND_DEATH); - } - - 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 SPELL_MAGMA_SPIT: - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_MAGMA_SPIT, true); - events.ScheduleEvent(SPELL_MAGMA_SPIT, urand(7000, 10000)); - break; - case EVENT_BERSERKER_CHARGE: - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_BERSERKER_CHARGE, true); - events.ScheduleEvent(EVENT_BERSERKER_CHARGE, urand(16000, 19000)); - break; - case EVENT_FLAMEBREAK: - DoCast(me, SPELL_FLAMEBREAK); - events.ScheduleEvent(EVENT_FLAMEBREAK, urand(18000, 22000)); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackrockCavernsAI(creature); + if (Creature* spot = instance->GetCreature(DATA_SPOT)) + spot->DespawnOrUnsummon(); } + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MAGMA_SPIT); + + if (IsHeroic()) + { + if (Creature* lucky = instance->GetCreature(DATA_LUCKY)) + lucky->DespawnOrUnsummon(0, 30s); + + if (Creature* spot = instance->GetCreature(DATA_SPOT)) + spot->DespawnOrUnsummon(0, 30s); + } + + _EnterEvadeMode(); + _DespawnAtEvade(); + } + + 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_MAGMA_SPIT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_MAGMA_SPIT)) + DoCast(target, SPELL_MAGMA_SPIT); + events.Repeat(7s, 9s); + break; + case EVENT_BERSERKER_CHARGE: + if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 100.0f, true, 0)) + DoCast(target, SPELL_BERSERKER_CHARGE); + events.Repeat(15s, 21s); + break; + case EVENT_FLAMEBREAK: + DoCastAOE(SPELL_FLAMEBREAK); + events.Repeat(15s, 21s); + break; + case EVENT_TERRIFYING_ROAR: + DoCastAOE(SPELL_TERRIFYING_ROAR); + events.Repeat(31s, 33s); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } +}; + +struct npc_beauty_puppy : public ScriptedAI +{ + npc_beauty_puppy(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript()) + { + Initialize(); + } + + void Initialize() + { + if (!IsHeroic()) + me->SetNoCallAssistance(true); + } + + void JustEngagedWith(Unit* /*who*/) override + { + if (IsHeroic()) + if (Creature* beauty = _instance->GetCreature(DATA_BEAUTY)) + beauty->AI()->DoZoneInCombat(); + + _events.ScheduleEvent(EVENT_LAVA_DROOL, 5s + 500ms, 6s + 500ms); + _events.ScheduleEvent(EVENT_LITTLE_BIG_FLAME_BREATH, 7s, 9s); + } + + 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_LAVA_DROOL: + DoCastSelf(SPELL_LAVA_DROOL); + _events.Repeat(12s, 13s); + break; + case EVENT_LITTLE_BIG_FLAME_BREATH: + DoCastVictim(SPELL_LITTLE_BIG_FLAME_BREATH); + _events.Repeat(11s, 12s); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } +private: + EventMap _events; + InstanceScript* _instance; +}; + +class spell_beauty_magma_spit : public AuraScript +{ + PrepareAuraScript(spell_beauty_magma_spit); + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_MAGMA_SPIT_MISSILE_1, true); + target->CastSpell(target, SPELL_MAGMA_SPIT_MISSILE_2, true); + target->CastSpell(target, SPELL_MAGMA_SPIT_MISSILE_3, true); + target->CastSpell(target, SPELL_MAGMA_SPIT_MISSILE_4, true); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_beauty_magma_spit::AfterRemove, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } }; void AddSC_boss_beauty() { - new boss_beauty(); + RegisterBlackrockCavernsCreatureAI(boss_beauty); + RegisterBlackrockCavernsCreatureAI(npc_beauty_puppy); + RegisterAuraScript(spell_beauty_magma_spit); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp index e6041700c78..62c6a37e693 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp @@ -25,7 +25,10 @@ ObjectData const creatureData[] = { BOSS_ROMOGG_BONECRUSHER, DATA_ROMOGG_BONECRUSHER }, { BOSS_CORLA_HERALD_OF_TWILIGHT, DATA_CORLA_HERALD_OF_TWILIGHT }, { BOSS_KARSH_STEELBENDER, DATA_KARSH_STEELBENDER }, + { BOSS_BEAUTY, DATA_BEAUTY }, { NPC_RAZ_THE_CRAZED, DATA_RAZ_THE_CRAZED }, + { NPC_LUCKY, DATA_LUCKY }, + { NPC_SPOT, DATA_SPOT }, { 0, 0 } };