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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user