aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarpten <vertozor@gmail.com>2012-11-09 18:12:29 +0100
committerWarpten <vertozor@gmail.com>2012-11-09 18:12:29 +0100
commit05c8cbaa4bf29e680cc4706fb1f1e67a7a6831cc (patch)
tree54ae8cdd42982ae596a76b470b01af0c71bde200
parent4e227314677b86196d3400625c0b9e8414977cb1 (diff)
Scripts/Ruby Sanctum:
* Move Dark / Flame Breaths handling to generic_halionAI. * Also apply Twilight Precision to Twilight Halion. * Fix some mistakes in the corporeality handling code, and remove some unused enums. Fixes #8176.
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp103
1 files changed, 49 insertions, 54 deletions
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index 82739c0026a..8e91691bc26 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -29,7 +29,7 @@
SDName: ruby_sanctum
SDAuthors: Kaelima, Warpten
SD%Complete: 90%
-SDComment: Based on Kaelima's initial work (nearly half of it). Corporeality handling is a pure guess, we lack info.
+SDComment: Based on Kaelima's initial work (half of it). Corporeality handling is a pure guess, we lack info.
SDCategory: Chamber of Aspects
EndScriptData */
@@ -123,13 +123,12 @@ enum Events
// Halion
EVENT_ACTIVATE_FIREWALL = 1,
EVENT_CLEAVE = 2,
- EVENT_FLAME_BREATH = 3,
+ EVENT_BREATH = 3,
EVENT_METEOR_STRIKE = 4,
EVENT_FIERY_COMBUSTION = 5,
EVENT_TAIL_LASH = 6,
// Twilight Halion
- EVENT_DARK_BREATH = 7,
EVENT_SOUL_CONSUMPTION = 8,
// Meteor Strike
@@ -153,12 +152,10 @@ enum Actions
ACTION_METEOR_STRIKE_AOE = 2,
// Halion Controller
- ACTION_PHASE_TWO = 3,
- ACTION_PHASE_THREE = 4,
- ACTION_CLEANUP = 5,
+ ACTION_MONITOR_CORPOREALITY = 3,
// Orb Carrier
- ACTION_SHOOT = 6
+ ACTION_SHOOT = 4
};
enum Phases
@@ -231,9 +228,11 @@ struct generic_halionAI : public BossAI
void EnterCombat(Unit* who)
{
BossAI::EnterCombat(who);
+ me->AddAura(SPELL_TWILIGHT_PRECISION, me);
_canEvade = false;
events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000));
events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
+ events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000));
}
void Reset()
@@ -260,19 +259,20 @@ struct generic_halionAI : public BossAI
DoCastAOE(SPELL_TAIL_LASH);
events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
break;
+ case EVENT_BREATH:
+ DoCast(me, me->GetEntry() == NPC_HALION ? SPELL_FLAME_BREATH : SPELL_DARK_BREATH);
+ events.ScheduleEvent(EVENT_BREATH, urand(10000, 12000));
+ break;
}
}
void UpdateAI(uint32 const diff)
{
- if (!UpdateVictim())
+ if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
while (uint32 eventId = events.ExecuteEvent())
ExecuteEvent(eventId);
@@ -319,7 +319,6 @@ class boss_halion : public CreatureScript
me->SetReactState(REACT_DEFENSIVE);
me->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->AddAura(SPELL_TWILIGHT_PRECISION, me);
}
void EnterEvadeMode()
@@ -342,7 +341,6 @@ class boss_halion : public CreatureScript
instance->SetBossState(DATA_HALION, IN_PROGRESS);
events.ScheduleEvent(EVENT_ACTIVATE_FIREWALL, 5000);
- events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 12000));
events.ScheduleEvent(EVENT_METEOR_STRIKE, urand(20000, 25000));
events.ScheduleEvent(EVENT_FIERY_COMBUSTION, urand(15000, 18000));
@@ -408,10 +406,6 @@ class boss_halion : public CreatureScript
if (GameObject* flameRing = ObjectAccessor::GetGameObject(*me, instance->GetData64(i)))
instance->HandleGameObject(instance->GetData64(DATA_FLAME_RING), false, flameRing);
break;
- case EVENT_FLAME_BREATH:
- DoCast(me, SPELL_FLAME_BREATH);
- events.ScheduleEvent(EVENT_FLAME_BREATH, 25000);
- break;
case EVENT_METEOR_STRIKE:
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_TWILIGHT_REALM))
@@ -490,7 +484,6 @@ class boss_twilight_halion : public CreatureScript
generic_halionAI::EnterCombat(who);
- events.ScheduleEvent(EVENT_DARK_BREATH, urand(10000, 15000));
events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 2);
@@ -554,7 +547,7 @@ class boss_twilight_halion : public CreatureScript
{
case SPELL_TWILIGHT_DIVISION:
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER)))
- controller->AI()->SetData(DATA_FIGHT_PHASE, PHASE_THREE);
+ controller->AI()->DoAction(ACTION_MONITOR_CORPOREALITY);
break;
default:
generic_halionAI::SpellHit(who, spell);
@@ -566,10 +559,6 @@ class boss_twilight_halion : public CreatureScript
{
switch (eventId)
{
- case EVENT_DARK_BREATH:
- DoCast(me, SPELL_DARK_BREATH);
- events.ScheduleEvent(EVENT_DARK_BREATH, urand(10000, 15000));
- break;
case EVENT_SOUL_CONSUMPTION:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_TWILIGHT_REALM))
DoCast(target, SPELL_SOUL_CONSUMPTION);
@@ -610,6 +599,8 @@ class npc_halion_controller : public CreatureScript
_summons.DespawnAll();
_events.Reset();
_materialCorporealityValue = 5;
+ _materialDamageTaken = 0;
+ _twilightDamageTaken = 0;
DoCast(me, SPELL_CLEAR_DEBUFFS);
}
@@ -658,6 +649,34 @@ class npc_halion_controller : public CreatureScript
_events.SetPhase(PHASE_INTRO);
_events.ScheduleEvent(EVENT_START_INTRO, 2000);
break;
+ case ACTION_MONITOR_CORPOREALITY:
+ {
+ for (uint8 itr = DATA_HALION; itr <= DATA_TWILIGHT_HALION; itr++)
+ {
+ Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(itr));
+ if (!halion)
+ continue;
+
+ halion->CastSpell(halion, GetSpell(_materialCorporealityValue, itr == DATA_TWILIGHT_HALION), false);
+ halion->AI()->SetData(DATA_FIGHT_PHASE, PHASE_THREE);
+
+ if (itr == DATA_TWILIGHT_HALION)
+ continue;
+
+ halion->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING);
+ halion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ }
+
+ // Summon Twilight portals
+ DoCast(me, SPELL_SUMMON_EXIT_PORTALS);
+
+ _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 1);
+ // Hardcoding doesn't really matter here.
+ _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 50);
+ _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 50);
+
+ _events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 7500);
+ }
default:
break;
}
@@ -748,36 +767,8 @@ class npc_halion_controller : public CreatureScript
DoZoneInCombat();
break;
case PHASE_TWO:
- // Timer taken from a 4.3.4 solo video and confirmed by TankSpot's 3.3.5 guide. http://www.tankspot.com/showthread.php?67195-Halion-Encounter-Guide-Live
_events.ScheduleEvent(EVENT_SHADOW_PULSARS_SHOOT, 29000);
break;
- case PHASE_THREE:
- _events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 5000);
- // Load up corporeality data.
- for (uint8 itr = DATA_HALION; itr <= DATA_TWILIGHT_HALION; itr++)
- {
- Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetData64(itr));
- if (!halion)
- continue;
-
- halion->CastSpell(halion, GetSpell(_materialCorporealityValue, itr == DATA_TWILIGHT_HALION), false);
- halion->AI()->SetData(DATA_FIGHT_PHASE, PHASE_THREE);
-
- if (itr == DATA_TWILIGHT_HALION)
- continue;
-
- halion->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING);
- halion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
-
- // Summon Twilight portals
- DoCast(me, SPELL_SUMMON_EXIT_PORTALS);
-
- _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 1);
- // Hardcoding doesn't really matter here.
- _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 50);
- _instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 50);
- break;
default:
break;
}
@@ -808,17 +799,21 @@ class npc_halion_controller : public CreatureScript
float damageRatio = float(_materialDamageTaken) / float(_twilightDamageTaken);
CorporealityEvent action = CORPOREALITY_NONE;
- if (damageRatio < 0.98f) // [0 , 0.98[: Corporeality goes down
+ if (damageRatio < 0.98f) // [0 , 0.98[: Corporeality goes down
action = CORPOREALITY_DECREASE;
- else if (0.99f < damageRatio && damageRatio < 1.0f) // ]0.99, 1.01[: Twilight Mending
+ else if (0.99f < damageRatio && damageRatio < 1.01f) // ]0.99, 1.01[: Twilight Mending
action = CORPOREALITY_TWILIGHT_MENDING;
- else if (1.02f < damageRatio) // ]1.02, +oo [: Corporeality goes up
+ else if (1.02f < damageRatio) // ]1.02, +oo [: Corporeality goes up
action = CORPOREALITY_INCREASE;
switch (action)
{
case CORPOREALITY_NONE:
+ {
+ _materialDamageTaken = 0;
+ _twilightDamageTaken = 0;
return;
+ }
case CORPOREALITY_INCREASE:
{
if (_materialCorporealityValue >= (MAX_CORPOREALITY_STATE - 1))