diff options
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, |
