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
{
return new boss_algalonAI(pCreature);
return GetUlduarAI<boss_algalonAI>(pCreature);
}
struct boss_algalonAI : public ScriptedAI
@@ -204,7 +204,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_steelbreakerAI (pCreature);
return GetUlduarAI<boss_steelbreakerAI>(pCreature);
}
struct boss_steelbreakerAI : public ScriptedAI
@@ -350,7 +350,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_runemaster_molgeimAI (pCreature);
return GetUlduarAI<boss_runemaster_molgeimAI>(pCreature);
}
struct boss_runemaster_molgeimAI : public ScriptedAI
@@ -591,7 +591,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_stormcaller_brundirAI (pCreature);
return GetUlduarAI<boss_stormcaller_brundirAI>(pCreature);
}
struct boss_stormcaller_brundirAI : public ScriptedAI
@@ -238,9 +238,6 @@ class boss_flame_leviathan : public CreatureScript
Shutout = 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->SetReactState(REACT_PASSIVE);
}
@@ -572,7 +569,7 @@ class boss_flame_leviathan : public CreatureScript
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];
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())
{
Elder[n]->setFaction(35);
@@ -359,7 +359,7 @@ class boss_freya : public CreatureScript
Creature* Elder[3];
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())
{
me->AddAura(SPELL_DRAINED_OF_POWER, Elder[n]);
@@ -663,7 +663,7 @@ class boss_freya : public CreatureScript
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
{
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
{
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
{
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
{
return new boss_general_vezaxAI(creature);
return GetUlduarAI<boss_general_vezaxAI>(creature);
}
};
@@ -97,6 +97,7 @@ enum HodirNPC
NPC_SNOWPACKED_ICICLE = 33174,
NPC_ICICLE = 33169,
NPC_ICICLE_SNOWDRIFT = 33173,
NPC_TOASTY_FIRE = 33342,
};
enum HodirGameObjects
@@ -353,7 +354,7 @@ class boss_hodir : public CreatureScript
me->RemoveAllAttackers();
me->AttackStop();
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->StopMoving();
me->GetMotionMaster()->Clear();
@@ -484,7 +485,7 @@ class boss_hodir : public CreatureScript
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
{
npc_hodir_mageAI(Creature* creature) : ScriptedAI(creature)
npc_hodir_mageAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
instance = me->GetInstanceScript();
}
@@ -791,10 +792,23 @@ class npc_hodir_mage : public CreatureScript
void Reset()
{
events.Reset();
summons.DespawnAll();
events.ScheduleEvent(EVENT_CONJURE_FIRE, urand(10000, 12500));
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)
{
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)
{
case EVENT_CONJURE_FIRE:
if (summons.size() >= RAID_MODE(2, 4))
break;
DoCast(me, SPELL_CONJURE_FIRE, true);
events.ScheduleEvent(EVENT_CONJURE_FIRE, urand(35000, 40000));
events.ScheduleEvent(EVENT_CONJURE_FIRE, urand(15000, 20000));
break;
case EVENT_MELT_ICE:
if (Creature* FlashFreeze = me->FindNearestCreature(NPC_FLASH_FREEZE, 50.0f, true))
@@ -833,6 +849,7 @@ class npc_hodir_mage : public CreatureScript
private:
InstanceScript* instance;
EventMap events;
SummonList summons;
};
CreatureAI* GetAI(Creature* creature) const
@@ -851,8 +868,6 @@ class npc_toasty_fire : public CreatureScript
npc_toasty_fireAI(Creature* creature) : ScriptedAI(creature)
{
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()
@@ -118,16 +118,14 @@ public:
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_ignis_AI (pCreature);
return GetUlduarAI<boss_ignis_AI>(pCreature);
}
struct boss_ignis_AI : public BossAI
{
boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, BOSS_IGNIS), vehicle(me->GetVehicleKit())
{
assert(vehicle);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip jump effect
ASSERT(vehicle);
}
Vehicle *vehicle;
@@ -97,7 +97,7 @@ class boss_kologarn : public CreatureScript
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_kologarnAI (pCreature);
return GetUlduarAI<boss_kologarnAI>(pCreature);
}
struct boss_kologarnAI : public BossAI
@@ -315,8 +315,6 @@ class boss_razorscale : public CreatureScript
{
// Do not let Razorscale be affected by Battle Shout buff
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;
@@ -569,7 +567,7 @@ class boss_razorscale : public CreatureScript
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
{
return new boss_thorimAI(pCreature);
return GetUlduarAI<boss_thorimAI>(pCreature);
}
struct boss_thorimAI : public BossAI
@@ -171,7 +171,7 @@ public:
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_xt002_AI(pCreature);
return GetUlduarAI<boss_xt002_AI>(pCreature);
}
struct boss_xt002_AI : public BossAI
@@ -73,6 +73,8 @@ public:
uint64 ThorimChestGUID;
uint64 HodirChestGUID;
uint64 FreyaChestGUID;
uint64 HodirDoorGUID;
uint64 HodirIceDoorGUID;
uint32 TeamInInstance;
@@ -106,6 +108,8 @@ public:
FreyaChestGUID = 0;
LeviathanGateGUID = 0;
VezaxDoorGUID = 0;
HodirDoorGUID = 0;
HodirIceDoorGUID = 0;
TeamInInstance = 0;
memset(Encounter, 0, sizeof(Encounter));
@@ -328,6 +332,12 @@ public:
case GO_MOLE_MACHINE:
if (GetBossState(BOSS_RAZORSCALE) == IN_PROGRESS)
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;
case BOSS_HODIR:
if (state == DONE)
{
if (GameObject* gameObject = instance->GetGameObject(HodirChestGUID))
gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
HandleGameObject(HodirDoorGUID, true);
HandleGameObject(HodirIceDoorGUID, true);
}
break;
case BOSS_THORIM:
if (state == DONE)
@@ -18,6 +18,8 @@
#ifndef DEF_ULDUAR_H
#define DEF_ULDUAR_H
#define UlduarScriptName "instance_ulduar"
enum UlduarBosses
{
MAX_ENCOUNTER = 20,
@@ -129,6 +131,8 @@ enum UlduarGameObjects
GO_RAZOR_HARPOON_3 = 194543,
GO_RAZOR_HARPOON_4 = 194519,
GO_RAZOR_BROKEN_HARPOON = 194565,
GO_HODIR_DOOR = 194634,
GO_HODIR_ICE_DOOR = 194441,
};
enum UlduarTowerEvents
@@ -157,4 +161,15 @@ enum UlduarAchievementCriteria
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