diff options
Diffstat (limited to 'src')
5 files changed, 102 insertions, 27 deletions
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp index 52277ee420d..4ee8affda74 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp @@ -91,7 +91,7 @@ class boss_baltharus_the_warborn : public CreatureScript { switch(action) { - case ACTION_INTRO_TRIGGER: + case ACTION_INTRO_BALTHARUS: if (_introDone) return; _introDone = true; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index f594087aefb..107aed734e1 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -93,10 +93,18 @@ class boss_general_zarithrian : public CreatureScript { } + void Reset() + { + _Reset(); + if (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); + } + void EnterCombat(Unit* /*who*/) { _EnterCombat(); Talk(SAY_AGGRO); + events.Reset(); events.ScheduleEvent(EVENT_CLEAVE, 15000); events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000); events.ScheduleEvent(EVENT_SUMMON_ADDS, 40000); @@ -128,10 +136,16 @@ class boss_general_zarithrian : public CreatureScript void UpdateAI(uint32 const diff) { - // Cant use room boundary, the gameobject is spawned on same position as the boss. - if (!UpdateVictim() || me->GetPositionX() > 3060.0f) + if (!UpdateVictim()) return; + // Can't use room boundary here, the gameobject is spawned at the same position as the boss. This is just as good anyway. + if (me->GetPositionX() > 3060.0f) + { + EnterEvadeMode(); + return; + } + events.Update(diff); if (me->HasUnitState(UNIT_STAT_CASTING)) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp index 0c7b47e703f..ca6509060c3 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp @@ -40,11 +40,14 @@ class instance_ruby_sanctum : public InstanceMapScript GeneralZarithrianGUID = 0; SavianaRagefireGUID = 0; HalionGUID = 0; + HalionControllerGUID = 0; CrystalChannelTargetGUID = 0; XerestraszaGUID = 0; BaltharusSharedHealth = 0; FlameWallsGUID = 0; + FlameRingGUID = 0; memset(ZarithianSpawnStalkerGUID, 0, 2*sizeof(uint64)); + memset(BurningTreeGUID, 0, 4*sizeof(uint64)); } void OnCreatureCreate(Creature* creature) @@ -63,6 +66,8 @@ class instance_ruby_sanctum : public InstanceMapScript case NPC_HALION: HalionGUID = creature->GetGUID(); break; + case NPC_HALION_CONTROLLER: + HalionControllerGUID = creature->GetGUID(); case NPC_BALTHARUS_TARGET: CrystalChannelTargetGUID = creature->GetGUID(); break; @@ -89,6 +94,31 @@ class instance_ruby_sanctum : public InstanceMapScript break; case GO_FLAME_WALLS: FlameWallsGUID = go->GetGUID(); + if (GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) + HandleGameObject(FlameWallsGUID, true, go); + break; + case GO_FLAME_RING: + FlameRingGUID = go->GetGUID(); + break; + case GO_BURNING_TREE_1: + BurningTreeGUID[0] = go->GetGUID(); + if (GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE) + HandleGameObject(BurningTreeGUID[0], true); + break; + case GO_BURNING_TREE_2: + BurningTreeGUID[1] = go->GetGUID(); + if (GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE) + HandleGameObject(BurningTreeGUID[1], true); + break; + case GO_BURNING_TREE_3: + BurningTreeGUID[2] = go->GetGUID(); + if (GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE) + HandleGameObject(BurningTreeGUID[2], true); + break; + case GO_BURNING_TREE_4: + BurningTreeGUID[3] = go->GetGUID(); + if (GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE) + HandleGameObject(BurningTreeGUID[3], true); break; default: break; @@ -113,20 +143,32 @@ class instance_ruby_sanctum : public InstanceMapScript { case DATA_BALTHARUS_THE_WARBORN: return BaltharusTheWarbornGUID; - case DATA_GENERAL_ZARITHRIAN: - return GeneralZarithrianGUID; - case DATA_SAVIANA_RAGEFIRE: - return SavianaRagefireGUID; - case DATA_HALION: - return HalionGUID; case DATA_CRYSTAL_CHANNEL_TARGET: return CrystalChannelTargetGUID; case DATA_XERESTRASZA: return XerestraszaGUID; + case DATA_SAVIANA_RAGEFIRE: + return SavianaRagefireGUID; + case DATA_GENERAL_ZARITHRIAN: + return GeneralZarithrianGUID; case DATA_ZARITHIAN_SPAWN_STALKER_1: return ZarithianSpawnStalkerGUID[0]; case DATA_ZARITHIAN_SPAWN_STALKER_2: return ZarithianSpawnStalkerGUID[1]; + case DATA_HALION: + return HalionGUID; + case DATA_HALION_CONTROLLER: + return HalionControllerGUID; + case DATA_BURNING_TREE_1: + return BurningTreeGUID[0]; + case DATA_BURNING_TREE_2: + return BurningTreeGUID[1]; + case DATA_BURNING_TREE_3: + return BurningTreeGUID[2]; + case DATA_BURNING_TREE_4: + return BurningTreeGUID[3]; + case DATA_FLAME_RING: + return FlameRingGUID; default: break; } @@ -145,11 +187,9 @@ class instance_ruby_sanctum : public InstanceMapScript { if (state == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE) { - if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID)) - HandleGameObject(FlameWallsGUID, true, flameWalls); - + HandleGameObject(FlameWallsGUID, true); if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID)) - zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE); + zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } break; } @@ -157,17 +197,18 @@ class instance_ruby_sanctum : public InstanceMapScript { if (state == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) { - if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID)) - HandleGameObject(FlameWallsGUID, true, flameWalls); - + HandleGameObject(FlameWallsGUID, true); if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID)) - zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE); + zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } break; } case DATA_GENERAL_ZARITHRIAN: - if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID)) - HandleGameObject(FlameWallsGUID, state != IN_PROGRESS, flameWalls); + if (GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) + HandleGameObject(FlameWallsGUID, state != IN_PROGRESS); + if (state == DONE) + if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos)) + halionController->AI()->DoAction(ACTION_INTRO_HALION); break; default: break; @@ -248,11 +289,14 @@ class instance_ruby_sanctum : public InstanceMapScript uint64 GeneralZarithrianGUID; uint64 SavianaRagefireGUID; uint64 HalionGUID; + uint64 HalionControllerGUID; uint64 CrystalChannelTargetGUID; uint64 XerestraszaGUID; uint64 FlameWallsGUID; - uint32 BaltharusSharedHealth; uint64 ZarithianSpawnStalkerGUID[2]; + uint64 BurningTreeGUID[4]; + uint64 FlameRingGUID; + uint32 BaltharusSharedHealth; }; InstanceScript* GetInstanceScript(InstanceMap* map) const diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp index 9432a77e1d5..5819d543313 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp @@ -82,7 +82,7 @@ class npc_xerestrasza : public CreatureScript _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_6, 61000); _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_7, 69000); } - else if (action == ACTION_INTRO_TRIGGER && !_introDone) + else if (action == ACTION_INTRO_BALTHARUS && !_introDone) { _introDone = true; Talk(SAY_XERESTRASZA_INTRO); @@ -152,10 +152,10 @@ class at_baltharus_plateau : public AreaTriggerScript if (InstanceScript* instance = player->GetInstanceScript()) { if (Creature* xerestrasza = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_XERESTRASZA))) - xerestrasza->AI()->DoAction(ACTION_INTRO_TRIGGER); + xerestrasza->AI()->DoAction(ACTION_INTRO_BALTHARUS); if (Creature* baltharus = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_BALTHARUS_THE_WARBORN))) - baltharus->AI()->DoAction(ACTION_INTRO_TRIGGER); + baltharus->AI()->DoAction(ACTION_INTRO_BALTHARUS); } return true; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h index 60c13002935..a7ecc8c78d5 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h @@ -25,6 +25,8 @@ #define RSScriptName "instance_ruby_sanctum" uint32 const EncounterCount = 4; +Position const HalionControllerSpawnPos = {3156.037f, 533.2656f, 72.97205f, 0.0f}; + enum DataTypes { // Encounter States/Boss GUIDs @@ -39,12 +41,18 @@ enum DataTypes DATA_BALTHARUS_SHARED_HEALTH = 6, DATA_ZARITHIAN_SPAWN_STALKER_1 = 7, DATA_ZARITHIAN_SPAWN_STALKER_2 = 8, + DATA_HALION_CONTROLLER = 9, + DATA_BURNING_TREE_1 = 10, + DATA_BURNING_TREE_2 = 11, + DATA_BURNING_TREE_3 = 12, + DATA_BURNING_TREE_4 = 13, }; enum SharedActions { - ACTION_INTRO_TRIGGER = -3975101, + ACTION_INTRO_BALTHARUS = -3975101, ACTION_BALTHARUS_DEATH = -3975102, + ACTION_INTRO_HALION = -4014601, }; enum CreaturesIds @@ -72,6 +80,11 @@ enum CreaturesIds NPC_ORB_ROTATION_FOCUS = 40091, NPC_SHADOW_ORB_N = 40083, NPC_SHADOW_ORB_S = 40100, + NPC_METEOR_STRIKE_NORTH = 40041, + NPC_METEOR_STRIKE_EAST = 40042, + NPC_METEOR_STRIKE_WEST = 40043, + NPC_METEOR_STRIKE_SOUTH = 40044, + NPC_METEOR_STRIKE_FLAME = 40055, // Xerestrasza NPC_XERESTRASZA = 40429, @@ -85,13 +98,17 @@ enum GameObjectsIds GO_FIRE_FIELD = 203005, GO_FLAME_WALLS = 203006, GO_FLAME_RING = 203007, + GO_BURNING_TREE_1 = 203034, + GO_BURNING_TREE_2 = 203035, + GO_BURNING_TREE_3 = 203036, + GO_BURNING_TREE_4 = 203037, }; enum WorldStatesRS { - WORLDSTATE_UNK_1 = 5049, // Halion corporeality amount - normal phase - WORLDSTATE_UNK_2 = 5050, // Halion corporeality amount - twilight phase - WORLDSTATE_UNK_3 = 5051, // Halion corporeality toggle show + WORLDSTATE_CORPOREALITY_MATERIAL = 5049, + WORLDSTATE_CORPOREALITY_TWILIGHT = 5050, + WORLDSTATE_CORPOREALITY_TOGGLE = 5051, }; template<class AI> |