aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/scripts/world_scripts_full.sql1
-rw-r--r--sql/updates/world/2011_02_23_1_world_creature_template.sql5
-rw-r--r--sql/updates/world/2011_02_23_2_world_conditions.sql7
-rw-r--r--sql/updates/world/2011_02_23_3_world_vehicle_accessory.sql1
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp133
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp23
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h11
7 files changed, 142 insertions, 39 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql
index 58a90f99a36..5196757abee 100644
--- a/sql/scripts/world_scripts_full.sql
+++ b/sql/scripts/world_scripts_full.sql
@@ -1535,6 +1535,7 @@ UPDATE `creature_template` SET `ScriptName`='mob_lightning_elemental' WHERE `ent
UPDATE `creature_template` SET `ScriptName`='mob_rune_of_summoning' WHERE `entry`=33051;
UPDATE `creature_template` SET `ScriptName`= 'mob_rune_of_power' WHERE entry = 33705;
UPDATE `creature_template` SET `ScriptName`='boss_kologarn' WHERE `entry`=32930;
+UPDATE `creature_template` SET `AIName`='NullAI' WHERE `entry` IN(33742,33809,33942);
UPDATE `creature_template` SET `ScriptName`='boss_general_vezax' WHERE `entry`=33271;
UPDATE `creature_template` SET `ScriptName`='npc_saronite_vapors' WHERE `entry`=33488;
UPDATE `creature_template` SET `ScriptName`='npc_saronite_animus' WHERE `entry`=33524;
diff --git a/sql/updates/world/2011_02_23_1_world_creature_template.sql b/sql/updates/world/2011_02_23_1_world_creature_template.sql
new file mode 100644
index 00000000000..95e366cc962
--- /dev/null
+++ b/sql/updates/world/2011_02_23_1_world_creature_template.sql
@@ -0,0 +1,5 @@
+-- Correct run speed, models, and trigger flag
+UPDATE `creature_template` SET `speed_run`=5.5/7, `modelid1`=1126, `modelid2`=11686, `flags_extra`= `flags_extra`|128 WHERE `entry` IN(33632,33802);
+
+-- NullAI for semi-triggers (flags_extra|128 would make them unattackable by certain spells needed for the encounter)
+UPDATE `creature_template` SET `AIName`='NullAI' WHERE `entry` IN(33742,33809,33942); \ No newline at end of file
diff --git a/sql/updates/world/2011_02_23_2_world_conditions.sql b/sql/updates/world/2011_02_23_2_world_conditions.sql
new file mode 100644
index 00000000000..4b80454e162
--- /dev/null
+++ b/sql/updates/world/2011_02_23_2_world_conditions.sql
@@ -0,0 +1,7 @@
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`Comment`) VALUES
+(13,0,63676,18,1,32930,'Focused Eyebeam Visual (Left) Target'),
+(13,0,63702,18,1,32930,'Focused Eyebeam Visual (Right) Target'),
+(13,0,63629,18,1,32930,'Arm Dead Damage Kologarn (10m) Target'),
+(13,0,63979,18,1,32930,'Arm Dead Damage Kologarn (25m) Target'),
+(13,0,63766,18,1,33661,'Arm Sweep (10m) Target'),
+(13,0,63983,18,1,33661,'Arm Sweep (25m) Target');
diff --git a/sql/updates/world/2011_02_23_3_world_vehicle_accessory.sql b/sql/updates/world/2011_02_23_3_world_vehicle_accessory.sql
new file mode 100644
index 00000000000..5d56e0c4fab
--- /dev/null
+++ b/sql/updates/world/2011_02_23_3_world_vehicle_accessory.sql
@@ -0,0 +1 @@
+UPDATE `vehicle_accessory` SET `summontype`=8, `summontimer`=0 WHERE `entry`=32930;
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
index 4b2dab9032e..4128c6940cb 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
@@ -19,29 +19,36 @@
#include "ulduar.h"
#include "Vehicle.h"
+/* ScriptData
+SDName: boss_kologarn
+SD%Complete: 80
+SDComment: TODO: Achievements, begin/end animations
+SDCategory: Ulduar
+EndScriptData */
+
#define SPELL_ARM_DEAD_DAMAGE RAID_MODE(63629,63979)
#define SPELL_TWO_ARM_SMASH RAID_MODE(63356,64003)
#define SPELL_ONE_ARM_SMASH RAID_MODE(63573,64006)
+#define SPELL_ARM_SWEEP RAID_MODE(63766,63983)
#define SPELL_STONE_SHOUT RAID_MODE(63716,64005)
#define SPELL_PETRIFY_BREATH RAID_MODE(62030,63980)
-
#define SPELL_STONE_GRIP RAID_MODE(62166,63981)
-
-#define NPC_RUBBLE_STALKER RAID_MODE(33809,33942)
+#define SPELL_STONE_GRIP_CANCEL 65594
#define SPELL_SUMMON_RUBBLE 63633
#define SPELL_FALLING_RUBBLE 63821
-
-#define SPELL_STONE_GRIP_CANCEL 65594
-
-#define SPELL_ARM_SWEEP RAID_MODE(63766,63983)
-
#define SPELL_ARM_ENTER_VEHICLE 65343
-#define SPELL_ARM_VISUAL 64753
+#define SPELL_ARM_ENTER_VISUAL 64753
+
+#define SPELL_SUMMON_FOCUSED_EYEBEAM 63342
+#define SPELL_FOCUSED_EYEBEAM_PERIODIC RAID_MODE(63347,63977)
+#define SPELL_FOCUSED_EYEBEAM_VISUAL 63369
+#define SPELL_FOCUSED_EYEBEAM_VISUAL_LEFT 63676
+#define SPELL_FOCUSED_EYEBEAM_VISUAL_RIGHT 63702
#define SPELL_BERSERK 47008 // guess
-#define NPC_LEFT_ARM RAID_MODE(32933,33910)
-#define NPC_RIGHT_ARM RAID_MODE(32934,33911)
+#define NPC_RUBBLE_STALKER 33809
+#define NPC_ARM_SWEEP_STALKER 33661
enum Events
{
@@ -52,7 +59,7 @@ enum Events
EVENT_SWEEP,
EVENT_STONE_SHOUT,
EVENT_STONE_GRIP,
- EVENT_RIGHT_ARM_DEAD,
+ EVENT_FOCUSED_EYEBEAM,
EVENT_RESPAWN_LEFT_ARM,
EVENT_RESPAWN_RIGHT_ARM,
EVENT_ENRAGE,
@@ -92,6 +99,7 @@ public:
left(false), right(false)
{
ASSERT(vehicle);
+
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
SetCombatMovement(false);
@@ -100,6 +108,7 @@ public:
Vehicle *vehicle;
bool left, right;
+ uint64 eyebeamTarget;
void EnterCombat(Unit * who)
{
@@ -107,7 +116,9 @@ public:
events.ScheduleEvent(EVENT_MELEE_CHECK, 6000);
events.ScheduleEvent(EVENT_SMASH, 5000);
+ events.ScheduleEvent(EVENT_SWEEP, 19000);
events.ScheduleEvent(EVENT_STONE_GRIP, 25000);
+ events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 21000);
events.ScheduleEvent(EVENT_ENRAGE, 600000);
Unit* arm = NULL;
@@ -122,8 +133,13 @@ public:
void Reset()
{
_Reset();
- events.ScheduleEvent(EVENT_INSTALL_ACCESSORIES, 1000);
-
+
+ if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_LEFT_ARM) : 0))
+ RespawnArm(arm);
+ if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_RIGHT_ARM) : 0))
+ RespawnArm(arm);
+
+ eyebeamTarget = 0;
}
void JustDied(Unit * /*victim*/)
@@ -143,20 +159,30 @@ public:
{
left = apply;
if (!apply)
+ {
DoScriptText(SAY_LEFT_ARM_GONE, me);
+ events.ScheduleEvent(EVENT_RESPAWN_LEFT_ARM, 40000);
+ }
+ else
+ instance->SetData64(DATA_LEFT_ARM, who->GetGUID());
}
else if (who->GetEntry() == NPC_RIGHT_ARM)
{
right = apply;
if (!apply)
+ {
DoScriptText(SAY_RIGHT_ARM_GONE, me);
+ events.ScheduleEvent(EVENT_RESPAWN_RIGHT_ARM, 40000);
+ }
+ else
+ instance->SetData64(DATA_RIGHT_ARM, who->GetGUID());
}
if (!apply)
{
who->CastSpell(me, SPELL_ARM_DEAD_DAMAGE, true);
- DoScriptText(SAY_RIGHT_ARM_GONE, me);
+ who->GetMotionMaster()->MoveTargetedHome();
if (Creature* rubbleStalker = me->FindNearestCreature(NPC_RUBBLE_STALKER, 20.0f))
{
@@ -170,22 +196,48 @@ public:
if (!right && !left)
events.ScheduleEvent(EVENT_STONE_SHOUT, 5000);
- if (who->GetEntry() == NPC_LEFT_ARM)
- events.ScheduleEvent(EVENT_RESPAWN_LEFT_ARM, 40000);
- else if (who->GetEntry() == NPC_RIGHT_ARM)
- events.ScheduleEvent(EVENT_RESPAWN_RIGHT_ARM, 40000);
-
if (instance)
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_DISARMED_START_EVENT);
}
-
- if (apply)
+ else
events.CancelEvent(EVENT_STONE_SHOUT);
}
+ void JustSummoned(Creature *summon)
+ {
+ switch (summon->GetEntry())
+ {
+ case NPC_FOCUSED_EYEBEAM:
+ summon->CastSpell(me, SPELL_FOCUSED_EYEBEAM_VISUAL_LEFT, true);
+ break;
+ case NPC_FOCUSED_EYEBEAM_RIGHT:
+ summon->CastSpell(me, SPELL_FOCUSED_EYEBEAM_VISUAL_RIGHT, true);
+ break;
+ default:
+ return;
+ }
+
+ summon->CastSpell(summon, SPELL_FOCUSED_EYEBEAM_PERIODIC, true);
+ summon->CastSpell(summon, SPELL_FOCUSED_EYEBEAM_VISUAL, true);
+ summon->SetReactState(REACT_PASSIVE);
+ summon->SetFlag(UNIT_FIELD_ATTACK_POWER, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
+ // One of the above spells is a channeled spell, we need to clear this unit state for MoveChase to work
+ summon->ClearUnitState(UNIT_STAT_CASTING);
+
+ // Victim gets 67351
+ if (eyebeamTarget)
+ {
+ if (Unit* target = Unit::GetUnit(*summon, eyebeamTarget))
+ {
+ summon->Attack(target, false);
+ summon->GetMotionMaster()->MoveChase(target);
+ }
+ }
+ }
+
void UpdateAI(const uint32 diff)
{
- if (!me->getVictim() && instance->GetBossState(TYPE_KOLOGARN) == NOT_STARTED)
+ if (!UpdateVictim())
return;
events.Update(diff);
@@ -195,18 +247,14 @@ public:
switch (events.GetEvent())
{
- case EVENT_INSTALL_ACCESSORIES: // Delayed install, this is needed for IsInWorldCheck in Vehicle code to trigger PassengerBoarded
- vehicle->InstallAllAccessories(me->GetEntry());
- events.CancelEvent(EVENT_INSTALL_ACCESSORIES);
- break;
case EVENT_MELEE_CHECK:
if (!me->IsWithinMeleeRange(me->getVictim()))
DoCast(SPELL_PETRIFY_BREATH);
events.RepeatEvent(1000);
break;
case EVENT_SWEEP:
- DoCast(SPELL_ARM_SWEEP);
- events.RepeatEvent(15000);
+ DoCast(me->FindNearestCreature(NPC_ARM_SWEEP_STALKER, 500.0f, true), SPELL_ARM_SWEEP, true);
+ events.RepeatEvent(25000);
break;
case EVENT_SMASH:
if (left && right)
@@ -222,18 +270,19 @@ public:
case EVENT_ENRAGE:
DoCast(SPELL_BERSERK);
DoScriptText(SAY_BERSERK, me);
+ events.CancelEvent(EVENT_ENRAGE);
break;
case EVENT_RESPAWN_LEFT_ARM:
{
- if (Unit* arm = me->FindNearestCreature(NPC_LEFT_ARM, 20.0f, false))
- RespawnArm(arm);
+ if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_LEFT_ARM) : 0))
+ RespawnArm(arm->ToCreature());
events.CancelEvent(EVENT_RESPAWN_LEFT_ARM);
break;
}
case EVENT_RESPAWN_RIGHT_ARM:
{
- if (Unit* arm = me->FindNearestCreature(NPC_RIGHT_ARM, 20.0f, false))
- RespawnArm(arm);
+ if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_RIGHT_ARM) : 0))
+ RespawnArm(arm->ToCreature());
events.CancelEvent(EVENT_RESPAWN_RIGHT_ARM);
break;
}
@@ -259,17 +308,27 @@ public:
events.RepeatEvent(25000);
}
break;
+ case EVENT_FOCUSED_EYEBEAM:
+ Unit* eyebeamTargetUnit = SelectTarget(SELECT_TARGET_RANDOM);
+ if (!eyebeamTargetUnit)
+ return;
+
+ eyebeamTarget = eyebeamTargetUnit->GetGUID();
+ DoCast(SPELL_SUMMON_FOCUSED_EYEBEAM);
+ events.RepeatEvent(urand(15000, 35000));
+ break;
}
DoMeleeAttackIfReady();
}
- void RespawnArm(Unit* arm)
+ void RespawnArm(Creature* arm)
{
- arm->ToCreature()->Respawn();
- arm->ToCreature()->SetInCombatWithZone();
+ if (!arm->isAlive())
+ arm->Respawn();
- arm->CastSpell(me, SPELL_ARM_ENTER_VEHICLE, true);
+ arm->EnterVehicle(vehicle);
+ arm->CastSpell(arm, SPELL_ARM_ENTER_VISUAL, true);
}
};
};
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
index 175a20de871..3dd37899429 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
@@ -58,6 +58,10 @@ public:
uint64 uiXT002GUID;
uint64 uiAssemblyGUIDs[3];
uint64 uiKologarnGUID;
+ uint64 uiFocusedEyebeamGUID;
+ uint64 uiFocusedEyebeamRightGUID;
+ uint64 uiLeftArmGUID;
+ uint64 uiRightArmGUID;
uint64 uiAuriayaGUID;
uint64 uiMimironGUID;
uint64 uiHodirGUID;
@@ -83,6 +87,10 @@ public:
uiExpCommanderGUID = 0;
uiXT002GUID = 0;
uiKologarnGUID = 0;
+ uiFocusedEyebeamGUID = 0;
+ uiFocusedEyebeamRightGUID = 0;
+ uiLeftArmGUID = 0;
+ uiRightArmGUID = 0;
uiAuriayaGUID = 0;
uiMimironGUID = 0;
uiHodirGUID = 0;
@@ -310,6 +318,19 @@ public:
}
}
+ void SetData64(uint32 type, uint64 data)
+ {
+ switch (type)
+ {
+ case DATA_LEFT_ARM:
+ uiLeftArmGUID = data;
+ break;
+ case DATA_RIGHT_ARM:
+ uiRightArmGUID = data;
+ break;
+ }
+ }
+
uint64 GetData64(uint32 data)
{
switch(data)
@@ -319,6 +340,8 @@ public:
case TYPE_RAZORSCALE: return uiRazorscaleGUID;
case TYPE_XT002: return uiXT002GUID;
case TYPE_KOLOGARN: return uiKologarnGUID;
+ case DATA_LEFT_ARM: return uiLeftArmGUID;
+ case DATA_RIGHT_ARM: return uiRightArmGUID;
case TYPE_AURIAYA: return uiAuriayaGUID;
case TYPE_MIMIRON: return uiMimironGUID;
case TYPE_HODIR: return uiHodirGUID;
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
index 3fafe76eea3..9d27aefb52d 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h
@@ -38,16 +38,19 @@ enum eTypes
TYPE_ALGALON = 13,
TYPE_COLOSSUS = 14,
+ // Assembly of Iorn
DATA_STEELBREAKER,
DATA_MOLGEIM,
DATA_BRUNDIR,
DATA_EXP_COMMANDER,
- DATA_RIGHT_ARM,
+
+ // Kologarn:
DATA_LEFT_ARM,
+ DATA_RIGHT_ARM,
};
-enum eBossNPCs
+enum eNPCs
{
NPC_LEVIATHAN = 33113,
NPC_IGNIS = 33118,
@@ -58,6 +61,10 @@ enum eBossNPCs
NPC_MOLGEIM = 32927,
NPC_BRUNDIR = 32857,
NPC_KOLOGARN = 32930,
+ NPC_FOCUSED_EYEBEAM = 33632,
+ NPC_FOCUSED_EYEBEAM_RIGHT = 33802,
+ NPC_LEFT_ARM = 32933,
+ NPC_RIGHT_ARM = 32934,
NPC_AURIAYA = 33515,
NPC_MIMIRON = 33350,
NPC_HODIR = 32845,