mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-28 21:02:14 +01:00
Scripts/BrC: rewrite and finish Beauty encounter
This commit is contained in:
28
sql/updates/world/custom/custom_2018_07_27_02_world.sql
Normal file
28
sql/updates/world/custom/custom_2018_07_27_02_world.sql
Normal 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');
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user