Scripts/BrC: rewrite and finish Beauty encounter

This commit is contained in:
Ovahlord
2018-07-27 19:14:02 +02:00
parent 447f9da201
commit 6bb900f000
4 changed files with 236 additions and 83 deletions

View File

@@ -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');

View File

@@ -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 <class AI, class T>

View File

@@ -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<boss_beautyAI>(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);
}

View File

@@ -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 }
};