Scripts/Ulduar:

- Fix Focused Eyebeams
- Fix Arm Sweep
- Fix respawning and re-entering of arms

DB/Templates:
- Fix speed, modelId and trigger state of Focused Eyebeams
- Set NullAI to semi-triggers; Rubble Stalker, Kologarn Pit Kill Bunny
This commit is contained in:
Machiavelli
2011-02-23 01:45:22 +01:00
parent 44fc35bb07
commit 0ec88a642c
7 changed files with 142 additions and 39 deletions
+1
View File
@@ -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_summoning' WHERE `entry`=33051;
UPDATE `creature_template` SET `ScriptName`= 'mob_rune_of_power' WHERE entry = 33705; 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 `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`='boss_general_vezax' WHERE `entry`=33271;
UPDATE `creature_template` SET `ScriptName`='npc_saronite_vapors' WHERE `entry`=33488; UPDATE `creature_template` SET `ScriptName`='npc_saronite_vapors' WHERE `entry`=33488;
UPDATE `creature_template` SET `ScriptName`='npc_saronite_animus' WHERE `entry`=33524; UPDATE `creature_template` SET `ScriptName`='npc_saronite_animus' WHERE `entry`=33524;
@@ -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);
@@ -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');
@@ -0,0 +1 @@
UPDATE `vehicle_accessory` SET `summontype`=8, `summontimer`=0 WHERE `entry`=32930;
@@ -19,29 +19,36 @@
#include "ulduar.h" #include "ulduar.h"
#include "Vehicle.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_ARM_DEAD_DAMAGE RAID_MODE(63629,63979)
#define SPELL_TWO_ARM_SMASH RAID_MODE(63356,64003) #define SPELL_TWO_ARM_SMASH RAID_MODE(63356,64003)
#define SPELL_ONE_ARM_SMASH RAID_MODE(63573,64006) #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_STONE_SHOUT RAID_MODE(63716,64005)
#define SPELL_PETRIFY_BREATH RAID_MODE(62030,63980) #define SPELL_PETRIFY_BREATH RAID_MODE(62030,63980)
#define SPELL_STONE_GRIP RAID_MODE(62166,63981) #define SPELL_STONE_GRIP RAID_MODE(62166,63981)
#define SPELL_STONE_GRIP_CANCEL 65594
#define NPC_RUBBLE_STALKER RAID_MODE(33809,33942)
#define SPELL_SUMMON_RUBBLE 63633 #define SPELL_SUMMON_RUBBLE 63633
#define SPELL_FALLING_RUBBLE 63821 #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_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 SPELL_BERSERK 47008 // guess
#define NPC_LEFT_ARM RAID_MODE(32933,33910) #define NPC_RUBBLE_STALKER 33809
#define NPC_RIGHT_ARM RAID_MODE(32934,33911) #define NPC_ARM_SWEEP_STALKER 33661
enum Events enum Events
{ {
@@ -52,7 +59,7 @@ enum Events
EVENT_SWEEP, EVENT_SWEEP,
EVENT_STONE_SHOUT, EVENT_STONE_SHOUT,
EVENT_STONE_GRIP, EVENT_STONE_GRIP,
EVENT_RIGHT_ARM_DEAD, EVENT_FOCUSED_EYEBEAM,
EVENT_RESPAWN_LEFT_ARM, EVENT_RESPAWN_LEFT_ARM,
EVENT_RESPAWN_RIGHT_ARM, EVENT_RESPAWN_RIGHT_ARM,
EVENT_ENRAGE, EVENT_ENRAGE,
@@ -92,6 +99,7 @@ public:
left(false), right(false) left(false), right(false)
{ {
ASSERT(vehicle); ASSERT(vehicle);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
SetCombatMovement(false); SetCombatMovement(false);
@@ -100,6 +108,7 @@ public:
Vehicle *vehicle; Vehicle *vehicle;
bool left, right; bool left, right;
uint64 eyebeamTarget;
void EnterCombat(Unit * who) void EnterCombat(Unit * who)
{ {
@@ -107,7 +116,9 @@ public:
events.ScheduleEvent(EVENT_MELEE_CHECK, 6000); events.ScheduleEvent(EVENT_MELEE_CHECK, 6000);
events.ScheduleEvent(EVENT_SMASH, 5000); events.ScheduleEvent(EVENT_SMASH, 5000);
events.ScheduleEvent(EVENT_SWEEP, 19000);
events.ScheduleEvent(EVENT_STONE_GRIP, 25000); events.ScheduleEvent(EVENT_STONE_GRIP, 25000);
events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 21000);
events.ScheduleEvent(EVENT_ENRAGE, 600000); events.ScheduleEvent(EVENT_ENRAGE, 600000);
Unit* arm = NULL; Unit* arm = NULL;
@@ -122,8 +133,13 @@ public:
void Reset() void Reset()
{ {
_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*/) void JustDied(Unit * /*victim*/)
@@ -143,20 +159,30 @@ public:
{ {
left = apply; left = apply;
if (!apply) if (!apply)
{
DoScriptText(SAY_LEFT_ARM_GONE, me); 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) else if (who->GetEntry() == NPC_RIGHT_ARM)
{ {
right = apply; right = apply;
if (!apply) if (!apply)
{
DoScriptText(SAY_RIGHT_ARM_GONE, me); DoScriptText(SAY_RIGHT_ARM_GONE, me);
events.ScheduleEvent(EVENT_RESPAWN_RIGHT_ARM, 40000);
}
else
instance->SetData64(DATA_RIGHT_ARM, who->GetGUID());
} }
if (!apply) if (!apply)
{ {
who->CastSpell(me, SPELL_ARM_DEAD_DAMAGE, true); 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)) if (Creature* rubbleStalker = me->FindNearestCreature(NPC_RUBBLE_STALKER, 20.0f))
{ {
@@ -170,22 +196,48 @@ public:
if (!right && !left) if (!right && !left)
events.ScheduleEvent(EVENT_STONE_SHOUT, 5000); 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) if (instance)
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_DISARMED_START_EVENT); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_DISARMED_START_EVENT);
} }
else
if (apply)
events.CancelEvent(EVENT_STONE_SHOUT); 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) void UpdateAI(const uint32 diff)
{ {
if (!me->getVictim() && instance->GetBossState(TYPE_KOLOGARN) == NOT_STARTED) if (!UpdateVictim())
return; return;
events.Update(diff); events.Update(diff);
@@ -195,18 +247,14 @@ public:
switch (events.GetEvent()) 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: case EVENT_MELEE_CHECK:
if (!me->IsWithinMeleeRange(me->getVictim())) if (!me->IsWithinMeleeRange(me->getVictim()))
DoCast(SPELL_PETRIFY_BREATH); DoCast(SPELL_PETRIFY_BREATH);
events.RepeatEvent(1000); events.RepeatEvent(1000);
break; break;
case EVENT_SWEEP: case EVENT_SWEEP:
DoCast(SPELL_ARM_SWEEP); DoCast(me->FindNearestCreature(NPC_ARM_SWEEP_STALKER, 500.0f, true), SPELL_ARM_SWEEP, true);
events.RepeatEvent(15000); events.RepeatEvent(25000);
break; break;
case EVENT_SMASH: case EVENT_SMASH:
if (left && right) if (left && right)
@@ -222,18 +270,19 @@ public:
case EVENT_ENRAGE: case EVENT_ENRAGE:
DoCast(SPELL_BERSERK); DoCast(SPELL_BERSERK);
DoScriptText(SAY_BERSERK, me); DoScriptText(SAY_BERSERK, me);
events.CancelEvent(EVENT_ENRAGE);
break; break;
case EVENT_RESPAWN_LEFT_ARM: case EVENT_RESPAWN_LEFT_ARM:
{ {
if (Unit* arm = me->FindNearestCreature(NPC_LEFT_ARM, 20.0f, false)) if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_LEFT_ARM) : 0))
RespawnArm(arm); RespawnArm(arm->ToCreature());
events.CancelEvent(EVENT_RESPAWN_LEFT_ARM); events.CancelEvent(EVENT_RESPAWN_LEFT_ARM);
break; break;
} }
case EVENT_RESPAWN_RIGHT_ARM: case EVENT_RESPAWN_RIGHT_ARM:
{ {
if (Unit* arm = me->FindNearestCreature(NPC_RIGHT_ARM, 20.0f, false)) if (Creature* arm = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_RIGHT_ARM) : 0))
RespawnArm(arm); RespawnArm(arm->ToCreature());
events.CancelEvent(EVENT_RESPAWN_RIGHT_ARM); events.CancelEvent(EVENT_RESPAWN_RIGHT_ARM);
break; break;
} }
@@ -259,17 +308,27 @@ public:
events.RepeatEvent(25000); events.RepeatEvent(25000);
} }
break; 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(); DoMeleeAttackIfReady();
} }
void RespawnArm(Unit* arm) void RespawnArm(Creature* arm)
{ {
arm->ToCreature()->Respawn(); if (!arm->isAlive())
arm->ToCreature()->SetInCombatWithZone(); arm->Respawn();
arm->CastSpell(me, SPELL_ARM_ENTER_VEHICLE, true); arm->EnterVehicle(vehicle);
arm->CastSpell(arm, SPELL_ARM_ENTER_VISUAL, true);
} }
}; };
}; };
@@ -58,6 +58,10 @@ public:
uint64 uiXT002GUID; uint64 uiXT002GUID;
uint64 uiAssemblyGUIDs[3]; uint64 uiAssemblyGUIDs[3];
uint64 uiKologarnGUID; uint64 uiKologarnGUID;
uint64 uiFocusedEyebeamGUID;
uint64 uiFocusedEyebeamRightGUID;
uint64 uiLeftArmGUID;
uint64 uiRightArmGUID;
uint64 uiAuriayaGUID; uint64 uiAuriayaGUID;
uint64 uiMimironGUID; uint64 uiMimironGUID;
uint64 uiHodirGUID; uint64 uiHodirGUID;
@@ -83,6 +87,10 @@ public:
uiExpCommanderGUID = 0; uiExpCommanderGUID = 0;
uiXT002GUID = 0; uiXT002GUID = 0;
uiKologarnGUID = 0; uiKologarnGUID = 0;
uiFocusedEyebeamGUID = 0;
uiFocusedEyebeamRightGUID = 0;
uiLeftArmGUID = 0;
uiRightArmGUID = 0;
uiAuriayaGUID = 0; uiAuriayaGUID = 0;
uiMimironGUID = 0; uiMimironGUID = 0;
uiHodirGUID = 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) uint64 GetData64(uint32 data)
{ {
switch(data) switch(data)
@@ -319,6 +340,8 @@ public:
case TYPE_RAZORSCALE: return uiRazorscaleGUID; case TYPE_RAZORSCALE: return uiRazorscaleGUID;
case TYPE_XT002: return uiXT002GUID; case TYPE_XT002: return uiXT002GUID;
case TYPE_KOLOGARN: return uiKologarnGUID; case TYPE_KOLOGARN: return uiKologarnGUID;
case DATA_LEFT_ARM: return uiLeftArmGUID;
case DATA_RIGHT_ARM: return uiRightArmGUID;
case TYPE_AURIAYA: return uiAuriayaGUID; case TYPE_AURIAYA: return uiAuriayaGUID;
case TYPE_MIMIRON: return uiMimironGUID; case TYPE_MIMIRON: return uiMimironGUID;
case TYPE_HODIR: return uiHodirGUID; case TYPE_HODIR: return uiHodirGUID;
@@ -38,16 +38,19 @@ enum eTypes
TYPE_ALGALON = 13, TYPE_ALGALON = 13,
TYPE_COLOSSUS = 14, TYPE_COLOSSUS = 14,
// Assembly of Iorn
DATA_STEELBREAKER, DATA_STEELBREAKER,
DATA_MOLGEIM, DATA_MOLGEIM,
DATA_BRUNDIR, DATA_BRUNDIR,
DATA_EXP_COMMANDER, DATA_EXP_COMMANDER,
DATA_RIGHT_ARM,
// Kologarn:
DATA_LEFT_ARM, DATA_LEFT_ARM,
DATA_RIGHT_ARM,
}; };
enum eBossNPCs enum eNPCs
{ {
NPC_LEVIATHAN = 33113, NPC_LEVIATHAN = 33113,
NPC_IGNIS = 33118, NPC_IGNIS = 33118,
@@ -58,6 +61,10 @@ enum eBossNPCs
NPC_MOLGEIM = 32927, NPC_MOLGEIM = 32927,
NPC_BRUNDIR = 32857, NPC_BRUNDIR = 32857,
NPC_KOLOGARN = 32930, NPC_KOLOGARN = 32930,
NPC_FOCUSED_EYEBEAM = 33632,
NPC_FOCUSED_EYEBEAM_RIGHT = 33802,
NPC_LEFT_ARM = 32933,
NPC_RIGHT_ARM = 32934,
NPC_AURIAYA = 33515, NPC_AURIAYA = 33515,
NPC_MIMIRON = 33350, NPC_MIMIRON = 33350,
NPC_HODIR = 32845, NPC_HODIR = 32845,