Ruby Sanctum:

- Scripted General Zarithrian
- Flame walls will now open after killing saviana and baltharus
- Fixed savianas timers
- Fixed some typos (baltarhus -> baltharus)
This commit is contained in:
kaelima
2011-06-04 14:41:45 +02:00
parent eb219ef5d8
commit bdc75eb856
9 changed files with 351 additions and 22 deletions

View File

@@ -0,0 +1,9 @@
SET @ENTRY := 39946;
UPDATE `creature_template` SET `lootid`=@ENTRY WHERE `entry`=39746;
UPDATE `creature_template` SET `lootid`=@ENTRY+1 WHERE `entry`=39751;
UPDATE `creature_template` SET `lootid`=@ENTRY+2 WHERE `entry`=39747;
DELETE FROM `creature_loot_template` WHERE `entry` BETWEEN @ENTRY AND @ENTRY+2;
INSERT INTO `creature_loot_template` (`entry`,`item`,`ChanceOrQuestChance`,`lootmode`,`groupid`,`mincountOrRef`,`maxcount`) VALUES
(@ENTRY,49426,100,1,0,1,1),
(@ENTRY+1,49426,100,1,0,1,1),
(@ENTRY+2,49426,100,1,0,1,1);

View File

@@ -0,0 +1,12 @@
DELETE FROM `creature_text` WHERE `entry`=39746;
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
(39746,0,0, 'Alexstrasza has chosen capable allies.... A pity that I must END YOU!',14,0,100,0,0,17512, 'Baltharus the Warborn'),
(39746,1,0, 'You thought you stood a chance?',14,0,50,0,0,17513, 'General Zarithrian'),
(39746,1,1, 'It''s for the best.',14,0,50,0,0,17514, 'General Zarithrian'),
(39746,2,0, 'Turn them to ash, minions!',14,0,100,0,0,17516, 'General Zarithrian'),
(39746,3,0, 'HALION! I...',14,0,100,0,0,17515, 'General Zarithrian');
UPDATE `creature_template` SET `ScriptName`= 'npc_baltharus_the_warborn_clone' WHERE `ScriptName`= 'npc_baltarhus_the_warborn_clone';
UPDATE `creature_template` SET `InhabitType`=3 WHERE `entry`=39794;
UPDATE `creature_template` SET `ScriptName`= 'boss_general_zarithrian' WHERE `entry`=39746;
UPDATE `creature_template` SET `ScriptName`= 'npc_onyx_flamecaller' WHERE `entry`=39814;

View File

@@ -484,6 +484,7 @@ void AddSC_instance_ruby_sanctum(); // Ruby Sanctum
void AddSC_ruby_sanctum();
void AddSC_boss_baltharus_the_warborn();
void AddSC_boss_saviana_ragefire();
void AddSC_boss_general_zarithrian();
void AddSC_dalaran();
void AddSC_borean_tundra();
@@ -1183,6 +1184,7 @@ void AddNorthrendScripts()
AddSC_ruby_sanctum();
AddSC_boss_baltharus_the_warborn();
AddSC_boss_saviana_ragefire();
AddSC_boss_general_zarithrian();
AddSC_dalaran();
AddSC_borean_tundra();

View File

@@ -49,6 +49,7 @@ set(scripts_STAT_SRCS
Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp
Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp

View File

@@ -221,14 +221,14 @@ class boss_baltharus_the_warborn : public CreatureScript
}
};
class npc_baltarhus_the_warborn_clone : public CreatureScript
class npc_baltharus_the_warborn_clone : public CreatureScript
{
public:
npc_baltarhus_the_warborn_clone() : CreatureScript("npc_baltarhus_the_warborn_clone") { }
npc_baltharus_the_warborn_clone() : CreatureScript("npc_baltharus_the_warborn_clone") { }
struct npc_baltarhus_the_warborn_cloneAI : public ScriptedAI
struct npc_baltharus_the_warborn_cloneAI : public ScriptedAI
{
npc_baltarhus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature)
npc_baltharus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature)
{
_instance = (InstanceScript*)creature->GetInstanceScript();
}
@@ -251,8 +251,8 @@ class npc_baltarhus_the_warborn_clone : public CreatureScript
{
// This is here because DamageTaken wont trigger if the damage is deadly.
if (_instance)
if (Creature* baltarhus = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_BALTHARUS_THE_WARBORN)))
killer->Kill(baltarhus);
if (Creature* baltharus = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_BALTHARUS_THE_WARBORN)))
killer->Kill(baltharus);
}
void UpdateAI(uint32 const diff)
@@ -295,7 +295,7 @@ class npc_baltarhus_the_warborn_clone : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
return GetRubySanctumAI<npc_baltarhus_the_warborn_cloneAI>(creature);
return GetRubySanctumAI<npc_baltharus_the_warborn_cloneAI>(creature);
}
};
@@ -384,7 +384,7 @@ class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader
void AddSC_boss_baltharus_the_warborn()
{
new boss_baltharus_the_warborn();
new npc_baltarhus_the_warborn_clone();
new npc_baltharus_the_warborn_clone();
new spell_baltharus_enervating_brand();
new spell_baltharus_enervating_brand_trigger();
}

View File

@@ -0,0 +1,292 @@
/*
* Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ScriptPCH.h"
#include "ScriptedEscortAI.h"
#include "ruby_sanctum.h"
enum Texts
{
SAY_AGGRO = 0, // Alexstrasza has chosen capable allies.... A pity that I must END YOU!
SAY_KILL = 1, // You thought you stood a chance? - It's for the best.
SAY_ADDS = 2, // Turn them to ash, minions!
SAY_DEATH = 3, // HALION! I...
};
enum Spells
{
// General Zarithrian
SPELL_INTIMIDATING_ROAR = 74384,
SPELL_CLEAVE_ARMOR = 74367,
// Zarithrian Spawn Stalker
SPELL_SUMMON_FLAMECALLER = 74398,
// Onyx Flamecaller
SPELL_BLAST_NOVA = 74392,
SPELL_LAVA_GOUT = 74394,
};
enum Events
{
// General Zarithrian
EVENT_CLEAVE = 1,
EVENT_INTIDMDATING_ROAR = 2,
EVENT_SUMMON_ADDS = 3,
// Onyx Flamecaller
EVENT_BLAST_NOVA = 4,
EVENT_LAVA_GOUT = 5,
};
uint32 const MAX_PATH_FLAMECALLER_WAYPOINTS = 12;
Position const FlamecallerWaypoints[MAX_PATH_FLAMECALLER_WAYPOINTS*2] =
{
// East
{3042.971f, 419.8809f, 86.94320f, 0.0f},
{3043.971f, 419.8809f, 86.94320f, 0.0f},
{3044.885f, 428.8281f, 86.19320f, 0.0f},
{3045.494f, 434.7930f, 85.56398f, 0.0f},
{3045.900f, 438.7695f, 84.81398f, 0.0f},
{3045.657f, 456.8290f, 85.95601f, 0.0f},
{3043.657f, 459.0790f, 87.20601f, 0.0f},
{3042.157f, 460.5790f, 87.70601f, 0.0f},
{3040.907f, 462.0790f, 88.45601f, 0.0f},
{3038.907f, 464.0790f, 89.20601f, 0.0f},
{3025.907f, 478.0790f, 89.70601f, 0.0f},
{3003.832f, 501.2510f, 89.47303f, 0.0f},
// West
{3062.596f, 636.9980f, 82.50338f, 0.0f},
{3062.514f, 624.9980f, 83.70634f, 0.0f},
{3062.486f, 620.9980f, 84.33134f, 0.0f},
{3062.445f, 613.9930f, 84.45634f, 0.0f},
{3062.445f, 613.9930f, 84.45634f, 0.0f},
{3059.208f, 610.6501f, 85.39581f, 0.0f},
{3055.958f, 606.9001f, 86.14581f, 0.0f},
{3046.458f, 596.4001f, 86.89581f, 0.0f},
{3043.958f, 593.4001f, 87.64581f, 0.0f},
{3040.458f, 589.9001f, 88.39581f, 0.0f},
{3034.458f, 583.1501f, 88.89581f, 0.0f},
{3014.970f, 561.8073f, 88.83527f, 0.0f},
};
class boss_general_zarithrian : public CreatureScript
{
public:
boss_general_zarithrian() : CreatureScript("boss_general_zarithrian") { }
struct boss_general_zarithrianAI : public BossAI
{
boss_general_zarithrianAI(Creature* creature) : BossAI(creature, DATA_GENERAL_ZARITHRIAN)
{
}
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_CLEAVE, 15000);
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000);
events.ScheduleEvent(EVENT_SUMMON_ADDS, 40000);
}
void JustReachedHome()
{
_JustReachedHome();
instance->SetBossState(DATA_GENERAL_ZARITHRIAN, FAIL);
}
// Override to not set adds in combat yet.
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
}
void JustDied(Unit* /*killer*/)
{
_JustDied();
Talk(SAY_DEATH);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_KILL);
}
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)
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SUMMON_ADDS:
{
if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHIAN_SPAWN_STALKER_1)))
stalker1->AI()->DoCast(stalker1, SPELL_SUMMON_FLAMECALLER);
if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHIAN_SPAWN_STALKER_2)))
stalker2->AI()->DoCast(stalker2, SPELL_SUMMON_FLAMECALLER);
Talk(SAY_ADDS);
events.ScheduleEvent(EVENT_SUMMON_ADDS, 42000);
break;
}
case EVENT_INTIDMDATING_ROAR:
DoCast(me, SPELL_INTIMIDATING_ROAR, true);
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000);
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE_ARMOR);
events.ScheduleEvent(EVENT_CLEAVE, 15000);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return GetRubySanctumAI<boss_general_zarithrianAI>(creature);
}
};
class npc_onyx_flamecaller : public CreatureScript
{
public:
npc_onyx_flamecaller() : CreatureScript("npc_onyx_flamecaller") { }
struct npc_onyx_flamecallerAI : public npc_escortAI
{
npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature)
{
_instance = creature->GetInstanceScript();
npc_escortAI::SetDespawnAtEnd(false);
}
void Reset()
{
_lavaGoutCount = 0;
me->setActive(true);
AddWaypoints();
Start(true, true);
}
void EnterCombat(Unit* /*who*/)
{
_events.Reset();
_events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
_events.ScheduleEvent(EVENT_LAVA_GOUT, 5000);
}
void EnterEvadeMode()
{
// Prevent EvadeMode
}
void IsSummonedBy(Unit* /*summoner*/)
{
// Let Zarithrian count as summoner. _instance cant be null since we got GetRubySanctumAI
if (Creature* zarithrian = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GENERAL_ZARITHRIAN)))
zarithrian->AI()->JustSummoned(me);
}
void WaypointReached(uint32 pointId)
{
if (pointId == MAX_PATH_FLAMECALLER_WAYPOINTS || pointId == MAX_PATH_FLAMECALLER_WAYPOINTS*2)
{
DoZoneInCombat();
SetEscortPaused(true);
}
}
void AddWaypoints()
{
if (me->GetPositionY() < 500.0f)
{
for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++)
AddWaypoint(i, FlamecallerWaypoints[i].GetPositionX(), FlamecallerWaypoints[i].GetPositionY(), FlamecallerWaypoints[i].GetPositionZ());
}
else
{
for (uint8 i = 0, j = MAX_PATH_FLAMECALLER_WAYPOINTS; j < MAX_PATH_FLAMECALLER_WAYPOINTS*2; j++, i++)
AddWaypoint(i, FlamecallerWaypoints[j].GetPositionX(), FlamecallerWaypoints[j].GetPositionY(), FlamecallerWaypoints[j].GetPositionZ());
}
}
void UpdateEscortAI(uint32 const diff)
{
if (!UpdateVictim())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_BLAST_NOVA:
DoCastAOE(SPELL_BLAST_NOVA);
_events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
break;
case EVENT_LAVA_GOUT:
if (_lavaGoutCount >= 3)
{
_lavaGoutCount = 0;
_events.ScheduleEvent(EVENT_LAVA_GOUT, 8000);
break;
}
DoCastVictim(SPELL_LAVA_GOUT);
_lavaGoutCount++;
_events.ScheduleEvent(EVENT_LAVA_GOUT, 1500);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
bool _movementComplete;
InstanceScript* _instance;
uint8 _lavaGoutCount;
};
CreatureAI* GetAI(Creature* creature) const
{
return GetRubySanctumAI<npc_onyx_flamecallerAI>(creature);
}
};
void AddSC_boss_general_zarithrian()
{
new boss_general_zarithrian();
new npc_onyx_flamecaller();
}

View File

@@ -75,15 +75,15 @@ class boss_saviana_ragefire : public CreatureScript
{
_Reset();
me->SetReactState(REACT_AGGRESSIVE);
events.ScheduleEvent(EVENT_ENRAGE, 20000, EVENT_GROUP_LAND_PHASE);
events.ScheduleEvent(EVENT_FLAME_BREATH, 30000, EVENT_GROUP_LAND_PHASE);
events.ScheduleEvent(EVENT_FLIGHT, 50000);
}
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_ENRAGE, 20000, EVENT_GROUP_LAND_PHASE);
events.ScheduleEvent(EVENT_FLAME_BREATH, 14000, EVENT_GROUP_LAND_PHASE);
events.ScheduleEvent(EVENT_FLIGHT, 60000);
}
void JustDied(Unit* /*killer*/)
@@ -212,7 +212,7 @@ class spell_saviana_conflagration_init : public SpellScriptLoader
{
PreventHitDefaultEffect(effIndex);
GetCaster()->CastSpell(GetHitUnit(), SPELL_FLAME_BEACON, true);
GetCaster()->CastSpell(GetHitUnit(), SPELL_CONFLAGRATION_2, true);
GetCaster()->CastSpell(GetHitUnit(), SPELL_CONFLAGRATION_2, false);
}
void Register()

View File

@@ -28,7 +28,7 @@ DoorData const doorData[] =
class instance_ruby_sanctum : public InstanceMapScript
{
public:
instance_ruby_sanctum() : InstanceMapScript("instance_ruby_sanctum", 724) { }
instance_ruby_sanctum() : InstanceMapScript(RSScriptName, 724) { }
struct instance_ruby_sanctum_InstanceMapScript : public InstanceScript
{
@@ -44,6 +44,7 @@ class instance_ruby_sanctum : public InstanceMapScript
XerestraszaGUID = 0;
BaltharusSharedHealth = 0;
FlameWallsGUID = 0;
memset(ZarithianSpawnStalkerGUID, 0, 2*sizeof(uint64));
}
void OnCreatureCreate(Creature* creature)
@@ -68,6 +69,12 @@ class instance_ruby_sanctum : public InstanceMapScript
case NPC_XERESTRASZA:
XerestraszaGUID = creature->GetGUID();
break;
case NPC_ZARITHIAN_SPAWN_STALKER:
if (!ZarithianSpawnStalkerGUID[0])
ZarithianSpawnStalkerGUID[0] = creature->GetGUID();
else
ZarithianSpawnStalkerGUID[1] = creature->GetGUID();
break;
default:
break;
}
@@ -116,6 +123,10 @@ class instance_ruby_sanctum : public InstanceMapScript
return CrystalChannelTargetGUID;
case DATA_XERESTRASZA:
return XerestraszaGUID;
case DATA_ZARITHIAN_SPAWN_STALKER_1:
return ZarithianSpawnStalkerGUID[0];
case DATA_ZARITHIAN_SPAWN_STALKER_2:
return ZarithianSpawnStalkerGUID[1];
default:
break;
}
@@ -134,12 +145,9 @@ class instance_ruby_sanctum : public InstanceMapScript
{
if (state == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE)
{
// GO_FLAME_WALLS
if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID))
{
flameWalls->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
flameWalls->SetGoState(GO_STATE_READY);
}
HandleGameObject(FlameWallsGUID, true, flameWalls);
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID))
zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
}
@@ -150,15 +158,17 @@ class instance_ruby_sanctum : public InstanceMapScript
if (state == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
{
if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID))
{
flameWalls->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
flameWalls->SetGoState(GO_STATE_READY);
}
HandleGameObject(FlameWallsGUID, true, flameWalls);
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID))
zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
}
break;
}
case DATA_GENERAL_ZARITHRIAN:
if (GameObject* flameWalls = instance->GetGameObject(FlameWallsGUID))
HandleGameObject(FlameWallsGUID, state != IN_PROGRESS, flameWalls);
break;
default:
break;
}
@@ -242,6 +252,7 @@ class instance_ruby_sanctum : public InstanceMapScript
uint64 XerestraszaGUID;
uint64 FlameWallsGUID;
uint32 BaltharusSharedHealth;
uint64 ZarithianSpawnStalkerGUID[2];
};
InstanceScript* GetInstanceScript(InstanceMap* map) const

View File

@@ -37,6 +37,8 @@ enum DataTypes
DATA_XERESTRASZA = 4,
DATA_CRYSTAL_CHANNEL_TARGET = 5,
DATA_BALTHARUS_SHARED_HEALTH = 6,
DATA_ZARITHIAN_SPAWN_STALKER_1 = 7,
DATA_ZARITHIAN_SPAWN_STALKER_2 = 8,
};
enum SharedActions