Scripts/Ruby Sanctum:

- Fix removal of UNIT_FLAG_OOC_NOT_ATTACKABLE when Zarithrian resets.
- Let Zarithrian evade when passing 3060.0 positionX (thanks vcrx6 for hint)

Added some enums for Halion.
This commit is contained in:
kaelima
2011-06-06 15:20:56 +02:00
parent fc11540c23
commit 726c260002
5 changed files with 102 additions and 27 deletions
@@ -91,7 +91,7 @@ class boss_baltharus_the_warborn : public CreatureScript
{ {
switch(action) switch(action)
{ {
case ACTION_INTRO_TRIGGER: case ACTION_INTRO_BALTHARUS:
if (_introDone) if (_introDone)
return; return;
_introDone = true; _introDone = true;
@@ -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*/) void EnterCombat(Unit* /*who*/)
{ {
_EnterCombat(); _EnterCombat();
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
events.Reset();
events.ScheduleEvent(EVENT_CLEAVE, 15000); events.ScheduleEvent(EVENT_CLEAVE, 15000);
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000); events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000);
events.ScheduleEvent(EVENT_SUMMON_ADDS, 40000); events.ScheduleEvent(EVENT_SUMMON_ADDS, 40000);
@@ -128,10 +136,16 @@ class boss_general_zarithrian : public CreatureScript
void UpdateAI(uint32 const diff) void UpdateAI(uint32 const diff)
{ {
// Cant use room boundary, the gameobject is spawned on same position as the boss. if (!UpdateVictim())
if (!UpdateVictim() || me->GetPositionX() > 3060.0f)
return; 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); events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
@@ -40,11 +40,14 @@ class instance_ruby_sanctum : public InstanceMapScript
GeneralZarithrianGUID = 0; GeneralZarithrianGUID = 0;
SavianaRagefireGUID = 0; SavianaRagefireGUID = 0;
HalionGUID = 0; HalionGUID = 0;
HalionControllerGUID = 0;
CrystalChannelTargetGUID = 0; CrystalChannelTargetGUID = 0;
XerestraszaGUID = 0; XerestraszaGUID = 0;
BaltharusSharedHealth = 0; BaltharusSharedHealth = 0;
FlameWallsGUID = 0; FlameWallsGUID = 0;
FlameRingGUID = 0;
memset(ZarithianSpawnStalkerGUID, 0, 2*sizeof(uint64)); memset(ZarithianSpawnStalkerGUID, 0, 2*sizeof(uint64));
memset(BurningTreeGUID, 0, 4*sizeof(uint64));
} }
void OnCreatureCreate(Creature* creature) void OnCreatureCreate(Creature* creature)
@@ -63,6 +66,8 @@ class instance_ruby_sanctum : public InstanceMapScript
case NPC_HALION: case NPC_HALION:
HalionGUID = creature->GetGUID(); HalionGUID = creature->GetGUID();
break; break;
case NPC_HALION_CONTROLLER:
HalionControllerGUID = creature->GetGUID();
case NPC_BALTHARUS_TARGET: case NPC_BALTHARUS_TARGET:
CrystalChannelTargetGUID = creature->GetGUID(); CrystalChannelTargetGUID = creature->GetGUID();
break; break;
@@ -89,6 +94,31 @@ class instance_ruby_sanctum : public InstanceMapScript
break; break;
case GO_FLAME_WALLS: case GO_FLAME_WALLS:
FlameWallsGUID = go->GetGUID(); 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; break;
default: default:
break; break;
@@ -113,20 +143,32 @@ class instance_ruby_sanctum : public InstanceMapScript
{ {
case DATA_BALTHARUS_THE_WARBORN: case DATA_BALTHARUS_THE_WARBORN:
return BaltharusTheWarbornGUID; return BaltharusTheWarbornGUID;
case DATA_GENERAL_ZARITHRIAN:
return GeneralZarithrianGUID;
case DATA_SAVIANA_RAGEFIRE:
return SavianaRagefireGUID;
case DATA_HALION:
return HalionGUID;
case DATA_CRYSTAL_CHANNEL_TARGET: case DATA_CRYSTAL_CHANNEL_TARGET:
return CrystalChannelTargetGUID; return CrystalChannelTargetGUID;
case DATA_XERESTRASZA: case DATA_XERESTRASZA:
return XerestraszaGUID; return XerestraszaGUID;
case DATA_SAVIANA_RAGEFIRE:
return SavianaRagefireGUID;
case DATA_GENERAL_ZARITHRIAN:
return GeneralZarithrianGUID;
case DATA_ZARITHIAN_SPAWN_STALKER_1: case DATA_ZARITHIAN_SPAWN_STALKER_1:
return ZarithianSpawnStalkerGUID[0]; return ZarithianSpawnStalkerGUID[0];
case DATA_ZARITHIAN_SPAWN_STALKER_2: case DATA_ZARITHIAN_SPAWN_STALKER_2:
return ZarithianSpawnStalkerGUID[1]; 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: default:
break; break;
} }
@@ -145,11 +187,9 @@ class instance_ruby_sanctum : public InstanceMapScript
{ {
if (state == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE) if (state == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE)
{ {
if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID)) HandleGameObject(FlameWallsGUID, true);
HandleGameObject(FlameWallsGUID, true, flameWalls);
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID)) 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; break;
} }
@@ -157,17 +197,18 @@ class instance_ruby_sanctum : public InstanceMapScript
{ {
if (state == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) if (state == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
{ {
if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID)) HandleGameObject(FlameWallsGUID, true);
HandleGameObject(FlameWallsGUID, true, flameWalls);
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID)) 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; break;
} }
case DATA_GENERAL_ZARITHRIAN: case DATA_GENERAL_ZARITHRIAN:
if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID)) if (GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
HandleGameObject(FlameWallsGUID, state != IN_PROGRESS, flameWalls); HandleGameObject(FlameWallsGUID, state != IN_PROGRESS);
if (state == DONE)
if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos))
halionController->AI()->DoAction(ACTION_INTRO_HALION);
break; break;
default: default:
break; break;
@@ -248,11 +289,14 @@ class instance_ruby_sanctum : public InstanceMapScript
uint64 GeneralZarithrianGUID; uint64 GeneralZarithrianGUID;
uint64 SavianaRagefireGUID; uint64 SavianaRagefireGUID;
uint64 HalionGUID; uint64 HalionGUID;
uint64 HalionControllerGUID;
uint64 CrystalChannelTargetGUID; uint64 CrystalChannelTargetGUID;
uint64 XerestraszaGUID; uint64 XerestraszaGUID;
uint64 FlameWallsGUID; uint64 FlameWallsGUID;
uint32 BaltharusSharedHealth;
uint64 ZarithianSpawnStalkerGUID[2]; uint64 ZarithianSpawnStalkerGUID[2];
uint64 BurningTreeGUID[4];
uint64 FlameRingGUID;
uint32 BaltharusSharedHealth;
}; };
InstanceScript* GetInstanceScript(InstanceMap* map) const InstanceScript* GetInstanceScript(InstanceMap* map) const
@@ -82,7 +82,7 @@ class npc_xerestrasza : public CreatureScript
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_6, 61000); _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_6, 61000);
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_7, 69000); _events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_7, 69000);
} }
else if (action == ACTION_INTRO_TRIGGER && !_introDone) else if (action == ACTION_INTRO_BALTHARUS && !_introDone)
{ {
_introDone = true; _introDone = true;
Talk(SAY_XERESTRASZA_INTRO); Talk(SAY_XERESTRASZA_INTRO);
@@ -152,10 +152,10 @@ class at_baltharus_plateau : public AreaTriggerScript
if (InstanceScript* instance = player->GetInstanceScript()) if (InstanceScript* instance = player->GetInstanceScript())
{ {
if (Creature* xerestrasza = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_XERESTRASZA))) 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))) 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; return true;
@@ -25,6 +25,8 @@
#define RSScriptName "instance_ruby_sanctum" #define RSScriptName "instance_ruby_sanctum"
uint32 const EncounterCount = 4; uint32 const EncounterCount = 4;
Position const HalionControllerSpawnPos = {3156.037f, 533.2656f, 72.97205f, 0.0f};
enum DataTypes enum DataTypes
{ {
// Encounter States/Boss GUIDs // Encounter States/Boss GUIDs
@@ -39,12 +41,18 @@ enum DataTypes
DATA_BALTHARUS_SHARED_HEALTH = 6, DATA_BALTHARUS_SHARED_HEALTH = 6,
DATA_ZARITHIAN_SPAWN_STALKER_1 = 7, DATA_ZARITHIAN_SPAWN_STALKER_1 = 7,
DATA_ZARITHIAN_SPAWN_STALKER_2 = 8, 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 enum SharedActions
{ {
ACTION_INTRO_TRIGGER = -3975101, ACTION_INTRO_BALTHARUS = -3975101,
ACTION_BALTHARUS_DEATH = -3975102, ACTION_BALTHARUS_DEATH = -3975102,
ACTION_INTRO_HALION = -4014601,
}; };
enum CreaturesIds enum CreaturesIds
@@ -72,6 +80,11 @@ enum CreaturesIds
NPC_ORB_ROTATION_FOCUS = 40091, NPC_ORB_ROTATION_FOCUS = 40091,
NPC_SHADOW_ORB_N = 40083, NPC_SHADOW_ORB_N = 40083,
NPC_SHADOW_ORB_S = 40100, 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 // Xerestrasza
NPC_XERESTRASZA = 40429, NPC_XERESTRASZA = 40429,
@@ -85,13 +98,17 @@ enum GameObjectsIds
GO_FIRE_FIELD = 203005, GO_FIRE_FIELD = 203005,
GO_FLAME_WALLS = 203006, GO_FLAME_WALLS = 203006,
GO_FLAME_RING = 203007, 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 enum WorldStatesRS
{ {
WORLDSTATE_UNK_1 = 5049, // Halion corporeality amount - normal phase WORLDSTATE_CORPOREALITY_MATERIAL = 5049,
WORLDSTATE_UNK_2 = 5050, // Halion corporeality amount - twilight phase WORLDSTATE_CORPOREALITY_TWILIGHT = 5050,
WORLDSTATE_UNK_3 = 5051, // Halion corporeality toggle show WORLDSTATE_CORPOREALITY_TOGGLE = 5051,
}; };
template<class AI> template<class AI>