Core/Scripts: Minor fixes in Baltharus The Warborn (#18550)
* Core/Scripts: Minor fixes in Baltharus The Warborn * go away travis
This commit is contained in:
1 parent
867084435b
commit
75ad9b01fd
2 files changed
+77
-73
No files matched your search
+69
-66
@@ -27,7 +27,7 @@ enum Texts
|
||||
SAY_AGGRO = 1, // Ah, the entertainment has arrived.
|
||||
SAY_KILL = 2, // Baltharus leaves no survivors! - This world has enough heroes.
|
||||
SAY_CLONE = 3, // Twice the pain and half the fun.
|
||||
SAY_DEATH = 4, // I... didn't see that coming....
|
||||
SAY_DEATH = 4 // I... didn't see that coming....
|
||||
};
|
||||
|
||||
enum Spells
|
||||
@@ -40,28 +40,28 @@ enum Spells
|
||||
SPELL_CLONE = 74511,
|
||||
SPELL_REPELLING_WAVE = 74509,
|
||||
SPELL_CLEAR_DEBUFFS = 34098,
|
||||
SPELL_SPAWN_EFFECT = 64195,
|
||||
SPELL_SPAWN_EFFECT = 64195
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_BLADE_TEMPEST = 1,
|
||||
EVENT_CLEAVE = 2,
|
||||
EVENT_ENERVATING_BRAND = 3,
|
||||
EVENT_INTRO_TALK = 4,
|
||||
EVENT_OOC_CHANNEL = 5,
|
||||
EVENT_BLADE_TEMPEST = 1,
|
||||
EVENT_CLEAVE,
|
||||
EVENT_ENERVATING_BRAND,
|
||||
EVENT_INTRO_TALK,
|
||||
EVENT_SUMMONS_ATTACK
|
||||
};
|
||||
|
||||
enum Actions
|
||||
{
|
||||
ACTION_CLONE = 1,
|
||||
ACTION_CLONE = 1
|
||||
};
|
||||
|
||||
enum Phases
|
||||
{
|
||||
PHASE_ALL = 0,
|
||||
PHASE_INTRO = 1,
|
||||
PHASE_COMBAT = 2
|
||||
PHASE_ALL = 0,
|
||||
PHASE_INTRO,
|
||||
PHASE_COMBAT
|
||||
};
|
||||
|
||||
class boss_baltharus_the_warborn : public CreatureScript
|
||||
@@ -71,13 +71,7 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
|
||||
struct boss_baltharus_the_warbornAI : public BossAI
|
||||
{
|
||||
boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN)
|
||||
{
|
||||
Initialize();
|
||||
_introDone = false;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN), _introDone(false)
|
||||
{
|
||||
_cloneCount = RAID_MODE<uint8>(1, 2, 2, 2);
|
||||
}
|
||||
@@ -86,9 +80,9 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
{
|
||||
_Reset();
|
||||
events.SetPhase(PHASE_INTRO);
|
||||
events.ScheduleEvent(EVENT_OOC_CHANNEL, 0, 0, PHASE_INTRO);
|
||||
Initialize();
|
||||
instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetMaxHealth());
|
||||
if (Creature* channelTarget = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_CRYSTAL_CHANNEL_TARGET)))
|
||||
DoCast(channelTarget, SPELL_BARRIER_CHANNEL);
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
@@ -100,13 +94,13 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
return;
|
||||
_introDone = true;
|
||||
me->setActive(true);
|
||||
events.ScheduleEvent(EVENT_INTRO_TALK, 7000, 0, PHASE_INTRO);
|
||||
events.ScheduleEvent(EVENT_INTRO_TALK, Seconds(7), 0, PHASE_INTRO);
|
||||
break;
|
||||
case ACTION_CLONE:
|
||||
{
|
||||
DoCast(me, SPELL_CLEAR_DEBUFFS);
|
||||
DoCast(me, SPELL_CLONE);
|
||||
DoCast(me, SPELL_REPELLING_WAVE);
|
||||
DoCastSelf(SPELL_CLEAR_DEBUFFS);
|
||||
DoCastSelf(SPELL_CLONE);
|
||||
DoCastSelf(SPELL_REPELLING_WAVE);
|
||||
Talk(SAY_CLONE);
|
||||
--_cloneCount;
|
||||
break;
|
||||
@@ -122,9 +116,9 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
_EnterCombat();
|
||||
events.Reset();
|
||||
events.SetPhase(PHASE_COMBAT);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 11000, 0, PHASE_COMBAT);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 13000, 0, PHASE_COMBAT);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 15000, 0, PHASE_COMBAT);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, Seconds(13), 0, PHASE_COMBAT);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, Seconds(13), 0, PHASE_COMBAT);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, Seconds(18), 0, PHASE_COMBAT);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
@@ -146,7 +140,7 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->SetHealth(me->GetHealth());
|
||||
summon->CastSpell(summon, SPELL_SPAWN_EFFECT, true);
|
||||
events.ScheduleEvent(EVENT_SUMMONS_ATTACK, Seconds(2));
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
@@ -168,10 +162,18 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetHealth() - damage);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
summons.DespawnAll();
|
||||
events.Reset();
|
||||
_DespawnAtEvade();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
bool introPhase = events.IsInPhase(PHASE_INTRO);
|
||||
if (!UpdateVictim() && !introPhase)
|
||||
|
||||
if (!introPhase && !UpdateVictim())
|
||||
return;
|
||||
|
||||
if (!introPhase)
|
||||
@@ -179,7 +181,7 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING) && !introPhase)
|
||||
if (!introPhase && me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
@@ -189,30 +191,28 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
case EVENT_INTRO_TALK:
|
||||
Talk(SAY_BALTHARUS_INTRO);
|
||||
break;
|
||||
case EVENT_OOC_CHANNEL:
|
||||
if (Creature* channelTarget = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_CRYSTAL_CHANNEL_TARGET)))
|
||||
DoCast(channelTarget, SPELL_BARRIER_CHANNEL);
|
||||
events.ScheduleEvent(EVENT_OOC_CHANNEL, 7000, 0, PHASE_INTRO);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 24000, 0, PHASE_COMBAT);
|
||||
events.Repeat(Seconds(20), Seconds(24));
|
||||
break;
|
||||
case EVENT_BLADE_TEMPEST:
|
||||
DoCast(me, SPELL_BLADE_TEMPEST);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000, 0, PHASE_COMBAT);
|
||||
DoCastSelf(SPELL_BLADE_TEMPEST);
|
||||
events.Repeat(Seconds(24));
|
||||
break;
|
||||
case EVENT_ENERVATING_BRAND:
|
||||
for (uint8 i = 0; i < RAID_MODE<uint8>(4, 8, 8, 10); i++)
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true))
|
||||
DoCast(target, SPELL_ENERVATING_BRAND);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000, 0, PHASE_COMBAT);
|
||||
events.Repeat(Seconds(26));
|
||||
break;
|
||||
case EVENT_SUMMONS_ATTACK:
|
||||
summons.DoZoneInCombat(NPC_BALTHARUS_THE_WARBORN_CLONE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING) && !introPhase)
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -235,33 +235,38 @@ class npc_baltharus_the_warborn_clone : public CreatureScript
|
||||
public:
|
||||
npc_baltharus_the_warborn_clone() : CreatureScript("npc_baltharus_the_warborn_clone") { }
|
||||
|
||||
struct npc_baltharus_the_warborn_cloneAI : public ScriptedAI
|
||||
struct npc_baltharus_the_warborn_cloneAI : public BossAI
|
||||
{
|
||||
npc_baltharus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature),
|
||||
_instance(creature->GetInstanceScript())
|
||||
npc_baltharus_the_warborn_cloneAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_CLONE) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
DoCastSelf(SPELL_SPAWN_EFFECT);
|
||||
me->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
DoZoneInCombat();
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, urand(18000, 25000));
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, urand(10000, 15000));
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_CLEAVE, Seconds(11));
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, Seconds(15));
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, Seconds(10));
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override { }
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
{
|
||||
// Setting DATA_BALTHARUS_SHARED_HEALTH to 0 when killed would bug the boss.
|
||||
if (me->GetHealth() > damage)
|
||||
_instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetHealth() - damage);
|
||||
instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetHealth() - damage);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
// This is here because DamageTaken wont trigger if the damage is deadly.
|
||||
if (Creature* baltharus = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_BALTHARUS_THE_WARBORN)))
|
||||
if (Creature* baltharus = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BALTHARUS_THE_WARBORN)))
|
||||
killer->Kill(baltharus);
|
||||
}
|
||||
|
||||
@@ -270,42 +275,41 @@ class npc_baltharus_the_warborn_clone : public CreatureScript
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
me->SetHealth(_instance->GetData(DATA_BALTHARUS_SHARED_HEALTH));
|
||||
me->SetHealth(instance->GetData(DATA_BALTHARUS_SHARED_HEALTH));
|
||||
|
||||
_events.Update(diff);
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 24000);
|
||||
events.Repeat(Seconds(20), Seconds(24));
|
||||
break;
|
||||
case EVENT_BLADE_TEMPEST:
|
||||
DoCastVictim(SPELL_BLADE_TEMPEST);
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000);
|
||||
break;
|
||||
events.Repeat(Seconds(24));
|
||||
break;
|
||||
case EVENT_ENERVATING_BRAND:
|
||||
for (uint8 i = 0; i < RAID_MODE<uint8>(4, 8, 8, 10); i++)
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true))
|
||||
DoCast(target, SPELL_ENERVATING_BRAND);
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000);
|
||||
events.Repeat(Seconds(26));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
InstanceScript* _instance;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
@@ -314,6 +318,7 @@ class npc_baltharus_the_warborn_clone : public CreatureScript
|
||||
}
|
||||
};
|
||||
|
||||
// 74505 - Enervating Brand
|
||||
class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
@@ -325,11 +330,9 @@ class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader
|
||||
|
||||
void CheckDistance()
|
||||
{
|
||||
if (Unit* caster = GetOriginalCaster())
|
||||
{
|
||||
if (Unit* target = GetHitUnit())
|
||||
target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true);
|
||||
}
|
||||
Unit* caster = GetCaster();
|
||||
Unit* target = GetHitUnit();
|
||||
target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
|
||||
@@ -49,6 +49,7 @@ enum RSDataTypes
|
||||
DATA_BURNING_TREE_4 = 16,
|
||||
DATA_FLAME_RING = 17,
|
||||
DATA_TWILIGHT_FLAME_RING = 18,
|
||||
DATA_BALTHARUS_CLONE = 19
|
||||
};
|
||||
|
||||
enum RSSharedActions
|
||||
@@ -56,7 +57,7 @@ enum RSSharedActions
|
||||
ACTION_INTRO_BALTHARUS = -3975101,
|
||||
ACTION_BALTHARUS_DEATH = -3975102,
|
||||
ACTION_INTRO_HALION = -4014601,
|
||||
ACTION_INTRO_HALION_2 = -4014602,
|
||||
ACTION_INTRO_HALION_2 = -4014602
|
||||
};
|
||||
|
||||
enum RSCreaturesIds
|
||||
@@ -97,7 +98,7 @@ enum RSCreaturesIds
|
||||
NPC_COMBAT_STALKER = 40151, // Seen in sniffs but not used, so no wonder.
|
||||
|
||||
// Xerestrasza
|
||||
NPC_XERESTRASZA = 40429,
|
||||
NPC_XERESTRASZA = 40429
|
||||
};
|
||||
|
||||
enum RSGameObjectsIds
|
||||
@@ -112,19 +113,19 @@ enum RSGameObjectsIds
|
||||
GO_BURNING_TREE_1 = 203034,
|
||||
GO_BURNING_TREE_2 = 203035,
|
||||
GO_BURNING_TREE_3 = 203036,
|
||||
GO_BURNING_TREE_4 = 203037,
|
||||
GO_BURNING_TREE_4 = 203037
|
||||
};
|
||||
|
||||
enum RSWorldStates
|
||||
{
|
||||
WORLDSTATE_CORPOREALITY_MATERIAL = 5049,
|
||||
WORLDSTATE_CORPOREALITY_TWILIGHT = 5050,
|
||||
WORLDSTATE_CORPOREALITY_TOGGLE = 5051,
|
||||
WORLDSTATE_CORPOREALITY_TOGGLE = 5051
|
||||
};
|
||||
|
||||
enum RSInstanceSpell
|
||||
{
|
||||
SPELL_BERSERK = 26662,
|
||||
SPELL_BERSERK = 26662
|
||||
};
|
||||
|
||||
template<class AI>
|
||||
@@ -134,7 +135,7 @@ CreatureAI* GetRubySanctumAI(Creature* creature)
|
||||
if (instance->GetInstanceScript())
|
||||
if (instance->GetScriptId() == sObjectMgr->GetScriptId(RSScriptName))
|
||||
return new AI(creature);
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template<class AI>
|
||||
@@ -145,7 +146,7 @@ GameObjectAI* GetRubySanctumAI(GameObject* go)
|
||||
if (instance->GetScriptId() == sObjectMgr->GetScriptId(RSScriptName))
|
||||
return new AI(go);
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#endif // RUBY_SANCTUM_H_
|
||||
Reference in new issue
Block a user