aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMachiavelli <machiavelli.trinity@gmail.com>2011-09-22 21:17:17 +0200
committerMachiavelli <machiavelli.trinity@gmail.com>2011-09-22 21:19:26 +0200
commit9ea40a4746c4d74e7de120f5efedcdc533a667c4 (patch)
tree43e948f645a4ddb7f5cf7a89147666e7f17f0158
parent154c7ce79c15971d1b5bae033a67f41bc33945fb (diff)
Scripts/Ulduar/Kologarn:
- Fix arm respawn and reinstall events - Fix possible erratic event timers - Fix Focused Eyebeams after recent spell system changes - Fix looting the chest after the encounter
-rw-r--r--sql/updates/world/2011_09_22_00_world_spell_script_names.sql3
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.h2
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp150
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp20
4 files changed, 90 insertions, 85 deletions
diff --git a/sql/updates/world/2011_09_22_00_world_spell_script_names.sql b/sql/updates/world/2011_09_22_00_world_spell_script_names.sql
new file mode 100644
index 00000000000..af75822087e
--- /dev/null
+++ b/sql/updates/world/2011_09_22_00_world_spell_script_names.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spell_script_names` WHERE `spell_id`=63342;
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(63342,'spell_kologarn_summon_focused_eyebeam');
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index aca6a5c6444..51ad500572b 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -36,6 +36,7 @@ class Vehicle
void Reset(bool evading = false);
void InstallAllAccessories(bool evading);
void ApplyAllImmunities();
+ void InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 type, uint32 summonTime); //! May be called from scripts
Unit* GetBase() const { return _me; }
VehicleEntry const* GetVehicleInfo() const { return _vehicleInfo; }
@@ -61,7 +62,6 @@ class Vehicle
private:
SeatMap::iterator GetSeatIteratorForPassenger(Unit* passenger);
void InitMovementInfoForBase();
- void InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 type, uint32 summonTime);
Unit* _me;
VehicleEntry const* _vehicleInfo;
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
index e75baffe600..aa419c2fdbc 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp
@@ -158,11 +158,10 @@ class boss_kologarn : public CreatureScript
left = apply;
if (!apply && isEncounterInProgress)
{
+ who->ToCreature()->DisappearAndDie();
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)
@@ -170,11 +169,10 @@ class boss_kologarn : public CreatureScript
right = apply;
if (!apply && isEncounterInProgress)
{
+ who->ToCreature()->DisappearAndDie();
DoScriptText(SAY_RIGHT_ARM_GONE, me);
events.ScheduleEvent(EVENT_RESPAWN_RIGHT_ARM, 40000);
}
- else
- instance->SetData64(DATA_RIGHT_ARM, who->GetGUID());
}
if (!isEncounterInProgress)
@@ -249,80 +247,69 @@ class boss_kologarn : public CreatureScript
if (me->HasUnitState(UNIT_STAT_CASTING))
return;
- switch (events.GetEvent())
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_MELEE_CHECK:
- if (!me->IsWithinMeleeRange(me->getVictim()))
- DoCast(SPELL_PETRIFY_BREATH);
- events.RepeatEvent(1000);
- break;
- case EVENT_SWEEP:
- if (left)
- DoCast(me->FindNearestCreature(NPC_ARM_SWEEP_STALKER, 500.0f, true), SPELL_ARM_SWEEP, true);
- events.RepeatEvent(25000);
- break;
- case EVENT_SMASH:
- if (left && right)
- DoCastVictim(SPELL_TWO_ARM_SMASH);
- else if (left || right)
- DoCastVictim(SPELL_ONE_ARM_SMASH);
- events.RepeatEvent(15000);
- break;
- case EVENT_STONE_SHOUT:
- DoCast(SPELL_STONE_SHOUT);
- events.RepeatEvent(2000);
- break;
- case EVENT_ENRAGE:
- DoCast(SPELL_BERSERK);
- DoScriptText(SAY_BERSERK, me);
- events.CancelEvent(EVENT_ENRAGE);
- break;
- case EVENT_RESPAWN_LEFT_ARM:
- {
- if (Creature* arm = Unit::GetCreature(*me, instance->GetData64(DATA_LEFT_ARM)))
- RespawnArm(arm->ToCreature());
- events.CancelEvent(EVENT_RESPAWN_LEFT_ARM);
- break;
- }
- case EVENT_RESPAWN_RIGHT_ARM:
- {
- if (Creature* arm = Unit::GetCreature(*me, instance->GetData64(DATA_RIGHT_ARM)))
- RespawnArm(arm->ToCreature());
- events.CancelEvent(EVENT_RESPAWN_RIGHT_ARM);
- break;
- }
- case EVENT_STONE_GRIP:
+ switch (eventId)
{
- if (right)
+ case EVENT_MELEE_CHECK:
+ if (!me->IsWithinMeleeRange(me->getVictim()))
+ DoCast(SPELL_PETRIFY_BREATH);
+ events.ScheduleEvent(EVENT_MELEE_CHECK, 1 * IN_MILLISECONDS);
+ break;
+ case EVENT_SWEEP:
+ if (left)
+ DoCast(me->FindNearestCreature(NPC_ARM_SWEEP_STALKER, 500.0f, true), SPELL_ARM_SWEEP, true);
+ events.ScheduleEvent(EVENT_SWEEP, 25 * IN_MILLISECONDS);
+ break;
+ case EVENT_SMASH:
+ if (left && right)
+ DoCastVictim(SPELL_TWO_ARM_SMASH);
+ else if (left || right)
+ DoCastVictim(SPELL_ONE_ARM_SMASH);
+ events.ScheduleEvent(EVENT_SMASH, 15 * IN_MILLISECONDS);
+ break;
+ case EVENT_STONE_SHOUT:
+ DoCast(SPELL_STONE_SHOUT);
+ events.ScheduleEvent(EVENT_STONE_SHOUT, 2 * IN_MILLISECONDS);
+ break;
+ case EVENT_ENRAGE:
+ DoCast(SPELL_BERSERK);
+ DoScriptText(SAY_BERSERK, me);
+ break;
+ case EVENT_RESPAWN_LEFT_ARM:
+ case EVENT_RESPAWN_RIGHT_ARM:
{
- DoCast(SPELL_STONE_GRIP);
- DoScriptText(SAY_GRAB_PLAYER, me);
+ if (vehicle)
+ {
+ int8 seat = eventId == EVENT_RESPAWN_LEFT_ARM ? 0 : 1;
+ uint32 entry = eventId == EVENT_RESPAWN_LEFT_ARM ? NPC_LEFT_ARM : NPC_RIGHT_ARM;
+ vehicle->InstallAccessory(entry, seat, true, TEMPSUMMON_MANUAL_DESPAWN, 0);
+ }
+ break;
}
- events.RepeatEvent(25000);
- }
- break;
- case EVENT_FOCUSED_EYEBEAM:
- if (Unit* eyebeamTargetUnit = SelectTarget(SELECT_TARGET_FARTHEST, 0, 0, true))
+ case EVENT_STONE_GRIP:
{
- eyebeamTarget = eyebeamTargetUnit->GetGUID();
- DoCast(SPELL_SUMMON_FOCUSED_EYEBEAM);
+ if (right)
+ {
+ DoCast(SPELL_STONE_GRIP);
+ DoScriptText(SAY_GRAB_PLAYER, me);
+ }
+ events.ScheduleEvent(EVENT_STONE_GRIP, 25 * IN_MILLISECONDS);
}
- events.RepeatEvent(urand(15000, 35000));
break;
+ case EVENT_FOCUSED_EYEBEAM:
+ if (Unit* eyebeamTargetUnit = SelectTarget(SELECT_TARGET_FARTHEST, 0, 0, true))
+ {
+ eyebeamTarget = eyebeamTargetUnit->GetGUID();
+ DoCast(me, SPELL_SUMMON_FOCUSED_EYEBEAM, true);
+ }
+ events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, urand(15, 35) * IN_MILLISECONDS);
+ break;
+ }
}
DoMeleeAttackIfReady();
}
-
- void RespawnArm(Creature* arm)
- {
- if (!arm->isAlive())
- arm->Respawn();
-
- int32 seatId = arm->GetEntry() == NPC_LEFT_ARM ? 0 : 1;
- arm->CastCustomSpell(SPELL_ARM_ENTER_VEHICLE, SPELLVALUE_BASE_POINT0, seatId+1, me, true);
- arm->CastSpell(arm, SPELL_ARM_ENTER_VISUAL, true);
- }
};
CreatureAI* GetAI(Creature* creature) const
@@ -629,6 +616,34 @@ class spell_kologarn_stone_shout : public SpellScriptLoader
}
};
+class spell_kologarn_summon_focused_eyebeam : public SpellScriptLoader
+{
+ public:
+ spell_kologarn_summon_focused_eyebeam() : SpellScriptLoader("spell_kologarn_summon_focused_eyebeam") { }
+
+ class spell_kologarn_summon_focused_eyebeam_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_kologarn_summon_focused_eyebeam_SpellScript);
+
+ void HandleForceCast(SpellEffIndex eff)
+ {
+ PreventHitDefaultEffect(eff);
+ GetCaster()->CastSpell(GetCaster(), GetSpellInfo()->Effects[eff].TriggerSpell, true);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_kologarn_summon_focused_eyebeam_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST);
+ OnEffect += SpellEffectFn(spell_kologarn_summon_focused_eyebeam_SpellScript::HandleForceCast, EFFECT_1, SPELL_EFFECT_FORCE_CAST);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_kologarn_summon_focused_eyebeam_SpellScript();
+ }
+};
+
void AddSC_boss_kologarn()
{
new boss_kologarn();
@@ -639,4 +654,5 @@ void AddSC_boss_kologarn()
new spell_ulduar_stone_grip_absorb();
new spell_ulduar_stone_grip();
new spell_kologarn_stone_shout();
+ new spell_kologarn_summon_focused_eyebeam();
}
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
index 748de08f5e0..70d7b5108b3 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
@@ -49,8 +49,6 @@ class instance_ulduar : public InstanceMapScript
uint64 XTToyPileGUIDs[4];
uint64 AssemblyGUIDs[3];
uint64 KologarnGUID;
- uint64 LeftArmGUID;
- uint64 RightArmGUID;
uint64 AuriayaGUID;
uint64 MimironGUID;
uint64 HodirGUID;
@@ -94,8 +92,6 @@ class instance_ulduar : public InstanceMapScript
ExpeditionCommanderGUID = 0;
XT002GUID = 0;
KologarnGUID = 0;
- LeftArmGUID = 0;
- RightArmGUID = 0;
AuriayaGUID = 0;
MimironGUID = 0;
HodirGUID = 0;
@@ -435,7 +431,10 @@ class instance_ulduar : public InstanceMapScript
if (state == DONE)
{
if (GameObject* gameObject = instance->GetGameObject(KologarnChestGUID))
+ {
gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
+ gameObject->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
HandleGameObject(KologarnBridgeGUID, false);
}
if (state == IN_PROGRESS)
@@ -501,15 +500,6 @@ class instance_ulduar : public InstanceMapScript
void SetData64(uint32 type, uint64 data)
{
- switch (type)
- {
- case DATA_LEFT_ARM:
- LeftArmGUID = data;
- break;
- case DATA_RIGHT_ARM:
- RightArmGUID = data;
- break;
- }
}
uint64 GetData64(uint32 data)
@@ -533,10 +523,6 @@ class instance_ulduar : public InstanceMapScript
return XTToyPileGUIDs[data - DATA_TOY_PILE_0];
case BOSS_KOLOGARN:
return KologarnGUID;
- case DATA_LEFT_ARM:
- return LeftArmGUID;
- case DATA_RIGHT_ARM:
- return RightArmGUID;
case BOSS_AURIAYA:
return AuriayaGUID;
case BOSS_MIMIRON: