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
This commit is contained in:
Machiavelli
2011-09-22 21:17:17 +02:00
parent 154c7ce79c
commit 9ea40a4746
4 changed files with 90 additions and 85 deletions

View File

@@ -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');

View File

@@ -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;

View File

@@ -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:
switch (eventId)
{
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:
{
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();
}

View File

@@ -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: