Scripts/Ulduar:

* Fixed opening of Hodir's doors
* Fixed despawning of Toasty Fires and its spawning
* Immunity provided by Toasty Fire buff will now working
* Added instance Ulduar check for AIs ( like in Icecrown Citadel or Ruby Sanctum )
* Removed few redudant immunities
This commit is contained in:
Lopin
2011-05-30 20:24:57 +02:00
committed by Supabad
parent 91b572d669
commit 8f5440b864
15 changed files with 70 additions and 31 deletions
@@ -0,0 +1 @@
UPDATE `spell_linked_spell` SET `spell_trigger`=62821 WHERE `spell_trigger`=65280;
@@ -0,0 +1 @@
UPDATE `creature_template` SET `unit_flags`=4,`flags_extra`=2 where `entry`=33342;
@@ -76,7 +76,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const CreatureAI* GetAI(Creature* pCreature) const
{ {
return new boss_algalonAI(pCreature); return GetUlduarAI<boss_algalonAI>(pCreature);
} }
struct boss_algalonAI : public ScriptedAI struct boss_algalonAI : public ScriptedAI
@@ -204,7 +204,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const CreatureAI* GetAI(Creature* pCreature) const
{ {
return new boss_steelbreakerAI (pCreature); return GetUlduarAI<boss_steelbreakerAI>(pCreature);
} }
struct boss_steelbreakerAI : public ScriptedAI struct boss_steelbreakerAI : public ScriptedAI
@@ -350,7 +350,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const CreatureAI* GetAI(Creature* pCreature) const
{ {
return new boss_runemaster_molgeimAI (pCreature); return GetUlduarAI<boss_runemaster_molgeimAI>(pCreature);
} }
struct boss_runemaster_molgeimAI : public ScriptedAI struct boss_runemaster_molgeimAI : public ScriptedAI
@@ -591,7 +591,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const CreatureAI* GetAI(Creature* pCreature) const
{ {
return new boss_stormcaller_brundirAI (pCreature); return GetUlduarAI<boss_stormcaller_brundirAI>(pCreature);
} }
struct boss_stormcaller_brundirAI : public ScriptedAI struct boss_stormcaller_brundirAI : public ScriptedAI
@@ -238,9 +238,6 @@ class boss_flame_leviathan : public CreatureScript
Shutout = true; Shutout = true;
Unbroken = true; Unbroken = true;
// need to have correct immunities set in db
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); //deathgrip
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
} }
@@ -572,7 +569,7 @@ class boss_flame_leviathan : public CreatureScript
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new boss_flame_leviathanAI(creature); return GetUlduarAI<boss_flame_leviathanAI>(creature);
} }
}; };
@@ -339,7 +339,7 @@ class boss_freya : public CreatureScript
Creature* Elder[3]; Creature* Elder[3];
for (uint8 n = 0; n < 3; ++n) for (uint8 n = 0; n < 3; ++n)
{ {
Elder[n] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF + n) : 0); Elder[n] = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_BRIGHTLEAF + n));
if (Elder[n] && Elder[n]->isAlive()) if (Elder[n] && Elder[n]->isAlive())
{ {
Elder[n]->setFaction(35); Elder[n]->setFaction(35);
@@ -359,7 +359,7 @@ class boss_freya : public CreatureScript
Creature* Elder[3]; Creature* Elder[3];
for (uint8 n = 0; n < 3; ++n) for (uint8 n = 0; n < 3; ++n)
{ {
Elder[n] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF + n) : 0); Elder[n] = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_BRIGHTLEAF + n));
if (Elder[n] && Elder[n]->isAlive()) if (Elder[n] && Elder[n]->isAlive())
{ {
me->AddAura(SPELL_DRAINED_OF_POWER, Elder[n]); me->AddAura(SPELL_DRAINED_OF_POWER, Elder[n]);
@@ -663,7 +663,7 @@ class boss_freya : public CreatureScript
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new boss_freyaAI(creature); return GetUlduarAI<boss_freyaAI>(creature);
} }
}; };
@@ -780,7 +780,7 @@ class boss_elder_brightleaf : public CreatureScript
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new boss_elder_brightleafAI(creature); return GetUlduarAI<boss_elder_brightleafAI>(creature);
} }
}; };
@@ -901,7 +901,7 @@ class boss_elder_stonebark : public CreatureScript
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new boss_elder_stonebarkAI(creature); return GetUlduarAI<boss_elder_stonebarkAI>(creature);
} }
}; };
@@ -1009,7 +1009,7 @@ class boss_elder_ironbranch : public CreatureScript
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new boss_elder_ironbranchAI(creature); return GetUlduarAI<boss_elder_ironbranchAI>(creature);
} }
}; };
@@ -300,7 +300,7 @@ class boss_general_vezax : public CreatureScript
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new boss_general_vezaxAI(creature); return GetUlduarAI<boss_general_vezaxAI>(creature);
} }
}; };
@@ -97,6 +97,7 @@ enum HodirNPC
NPC_SNOWPACKED_ICICLE = 33174, NPC_SNOWPACKED_ICICLE = 33174,
NPC_ICICLE = 33169, NPC_ICICLE = 33169,
NPC_ICICLE_SNOWDRIFT = 33173, NPC_ICICLE_SNOWDRIFT = 33173,
NPC_TOASTY_FIRE = 33342,
}; };
enum HodirGameObjects enum HodirGameObjects
@@ -353,7 +354,7 @@ class boss_hodir : public CreatureScript
me->RemoveAllAttackers(); me->RemoveAllAttackers();
me->AttackStop(); me->AttackStop();
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE);
me->InterruptNonMeleeSpells(true); me->InterruptNonMeleeSpells(true);
me->StopMoving(); me->StopMoving();
me->GetMotionMaster()->Clear(); me->GetMotionMaster()->Clear();
@@ -484,7 +485,7 @@ class boss_hodir : public CreatureScript
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new boss_hodirAI (creature); return GetUlduarAI<boss_hodirAI>(creature);
}; };
}; };
@@ -783,7 +784,7 @@ class npc_hodir_mage : public CreatureScript
struct npc_hodir_mageAI : public ScriptedAI struct npc_hodir_mageAI : public ScriptedAI
{ {
npc_hodir_mageAI(Creature* creature) : ScriptedAI(creature) npc_hodir_mageAI(Creature* creature) : ScriptedAI(creature), summons(me)
{ {
instance = me->GetInstanceScript(); instance = me->GetInstanceScript();
} }
@@ -791,10 +792,23 @@ class npc_hodir_mage : public CreatureScript
void Reset() void Reset()
{ {
events.Reset(); events.Reset();
summons.DespawnAll();
events.ScheduleEvent(EVENT_CONJURE_FIRE, urand(10000, 12500)); events.ScheduleEvent(EVENT_CONJURE_FIRE, urand(10000, 12500));
events.ScheduleEvent(EVENT_MELT_ICE, 5000); events.ScheduleEvent(EVENT_MELT_ICE, 5000);
} }
void JustSummoned(Creature* summoned)
{
if (summoned->GetEntry() == NPC_TOASTY_FIRE)
summons.Summon(summoned);
}
void SummonedCreatureDespawn(Creature* summoned)
{
if (summoned->GetEntry() == NPC_TOASTY_FIRE)
summons.remove(summoned->GetGUID());
}
void UpdateAI(uint32 const diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED)) if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
@@ -810,8 +824,10 @@ class npc_hodir_mage : public CreatureScript
switch (eventId) switch (eventId)
{ {
case EVENT_CONJURE_FIRE: case EVENT_CONJURE_FIRE:
if (summons.size() >= RAID_MODE(2, 4))
break;
DoCast(me, SPELL_CONJURE_FIRE, true); DoCast(me, SPELL_CONJURE_FIRE, true);
events.ScheduleEvent(EVENT_CONJURE_FIRE, urand(35000, 40000)); events.ScheduleEvent(EVENT_CONJURE_FIRE, urand(15000, 20000));
break; break;
case EVENT_MELT_ICE: case EVENT_MELT_ICE:
if (Creature* FlashFreeze = me->FindNearestCreature(NPC_FLASH_FREEZE, 50.0f, true)) if (Creature* FlashFreeze = me->FindNearestCreature(NPC_FLASH_FREEZE, 50.0f, true))
@@ -833,6 +849,7 @@ class npc_hodir_mage : public CreatureScript
private: private:
InstanceScript* instance; InstanceScript* instance;
EventMap events; EventMap events;
SummonList summons;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -851,8 +868,6 @@ class npc_toasty_fire : public CreatureScript
npc_toasty_fireAI(Creature* creature) : ScriptedAI(creature) npc_toasty_fireAI(Creature* creature) : ScriptedAI(creature)
{ {
me->SetDisplayId(me->GetCreatureInfo()->Modelid2); me->SetDisplayId(me->GetCreatureInfo()->Modelid2);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_PASSIVE);
} }
void Reset() void Reset()
@@ -118,16 +118,14 @@ public:
CreatureAI* GetAI(Creature* pCreature) const CreatureAI* GetAI(Creature* pCreature) const
{ {
return new boss_ignis_AI (pCreature); return GetUlduarAI<boss_ignis_AI>(pCreature);
} }
struct boss_ignis_AI : public BossAI struct boss_ignis_AI : public BossAI
{ {
boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, BOSS_IGNIS), vehicle(me->GetVehicleKit()) boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, BOSS_IGNIS), vehicle(me->GetVehicleKit())
{ {
assert(vehicle); ASSERT(vehicle);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip jump effect
} }
Vehicle *vehicle; Vehicle *vehicle;
@@ -97,7 +97,7 @@ class boss_kologarn : public CreatureScript
CreatureAI* GetAI(Creature* pCreature) const CreatureAI* GetAI(Creature* pCreature) const
{ {
return new boss_kologarnAI (pCreature); return GetUlduarAI<boss_kologarnAI>(pCreature);
} }
struct boss_kologarnAI : public BossAI struct boss_kologarnAI : public BossAI
@@ -315,8 +315,6 @@ class boss_razorscale : public CreatureScript
{ {
// Do not let Razorscale be affected by Battle Shout buff // Do not let Razorscale be affected by Battle Shout buff
me->ApplySpellImmune(0, IMMUNITY_ID, (SPELL_BATTLE_SHOUT), true); me->ApplySpellImmune(0, IMMUNITY_ID, (SPELL_BATTLE_SHOUT), true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip
} }
Phases phase; Phases phase;
@@ -569,7 +567,7 @@ class boss_razorscale : public CreatureScript
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new boss_razorscaleAI(creature); return GetUlduarAI<boss_razorscaleAI>(creature);
} }
}; };
@@ -48,7 +48,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const CreatureAI* GetAI(Creature* pCreature) const
{ {
return new boss_thorimAI(pCreature); return GetUlduarAI<boss_thorimAI>(pCreature);
} }
struct boss_thorimAI : public BossAI struct boss_thorimAI : public BossAI
@@ -171,7 +171,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const CreatureAI* GetAI(Creature* pCreature) const
{ {
return new boss_xt002_AI(pCreature); return GetUlduarAI<boss_xt002_AI>(pCreature);
} }
struct boss_xt002_AI : public BossAI struct boss_xt002_AI : public BossAI
@@ -73,6 +73,8 @@ public:
uint64 ThorimChestGUID; uint64 ThorimChestGUID;
uint64 HodirChestGUID; uint64 HodirChestGUID;
uint64 FreyaChestGUID; uint64 FreyaChestGUID;
uint64 HodirDoorGUID;
uint64 HodirIceDoorGUID;
uint32 TeamInInstance; uint32 TeamInInstance;
@@ -106,6 +108,8 @@ public:
FreyaChestGUID = 0; FreyaChestGUID = 0;
LeviathanGateGUID = 0; LeviathanGateGUID = 0;
VezaxDoorGUID = 0; VezaxDoorGUID = 0;
HodirDoorGUID = 0;
HodirIceDoorGUID = 0;
TeamInInstance = 0; TeamInInstance = 0;
memset(Encounter, 0, sizeof(Encounter)); memset(Encounter, 0, sizeof(Encounter));
@@ -328,6 +332,12 @@ public:
case GO_MOLE_MACHINE: case GO_MOLE_MACHINE:
if (GetBossState(BOSS_RAZORSCALE) == IN_PROGRESS) if (GetBossState(BOSS_RAZORSCALE) == IN_PROGRESS)
gameObject->SetGoState(GO_STATE_ACTIVE); gameObject->SetGoState(GO_STATE_ACTIVE);
case GO_HODIR_DOOR:
HodirDoorGUID = gameObject->GetGUID();
break;
case GO_HODIR_ICE_DOOR:
HodirIceDoorGUID = gameObject->GetGUID();
break;
} }
} }
@@ -404,8 +414,12 @@ public:
break; break;
case BOSS_HODIR: case BOSS_HODIR:
if (state == DONE) if (state == DONE)
{
if (GameObject* gameObject = instance->GetGameObject(HodirChestGUID)) if (GameObject* gameObject = instance->GetGameObject(HodirChestGUID))
gameObject->SetRespawnTime(gameObject->GetRespawnDelay()); gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
HandleGameObject(HodirDoorGUID, true);
HandleGameObject(HodirIceDoorGUID, true);
}
break; break;
case BOSS_THORIM: case BOSS_THORIM:
if (state == DONE) if (state == DONE)
@@ -18,6 +18,8 @@
#ifndef DEF_ULDUAR_H #ifndef DEF_ULDUAR_H
#define DEF_ULDUAR_H #define DEF_ULDUAR_H
#define UlduarScriptName "instance_ulduar"
enum UlduarBosses enum UlduarBosses
{ {
MAX_ENCOUNTER = 20, MAX_ENCOUNTER = 20,
@@ -129,6 +131,8 @@ enum UlduarGameObjects
GO_RAZOR_HARPOON_3 = 194543, GO_RAZOR_HARPOON_3 = 194543,
GO_RAZOR_HARPOON_4 = 194519, GO_RAZOR_HARPOON_4 = 194519,
GO_RAZOR_BROKEN_HARPOON = 194565, GO_RAZOR_BROKEN_HARPOON = 194565,
GO_HODIR_DOOR = 194634,
GO_HODIR_ICE_DOOR = 194441,
}; };
enum UlduarTowerEvents enum UlduarTowerEvents
@@ -157,4 +161,15 @@ enum UlduarAchievementCriteria
ACHIEVEMENT_CRITERIA_QUICK_SHAVE_25 = 10063, ACHIEVEMENT_CRITERIA_QUICK_SHAVE_25 = 10063,
}; };
template<class AI>
CreatureAI* GetUlduarAI(Creature* creature)
{
if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
if (instance->GetInstanceScript())
if (instance->GetScriptId() == GetScriptId(UlduarScriptName))
return new AI(creature);
return NULL;
}
#endif #endif