Scripts/Ulduar:

* Removed achievement hacks from Ignis the Furnace Master's script and scripted them properly
* Code style cleanups
This commit is contained in:
Shauren
2011-06-21 19:26:12 +02:00
parent fcea869353
commit 65233f8e66
3 changed files with 339 additions and 317 deletions
+4 -2
View File
@@ -1827,7 +1827,7 @@ UPDATE `outdoorpvp_template` SET `ScriptName`='outdoorpvp_si' WHERE `TypeId`=5;
UPDATE `outdoorpvp_template` SET `ScriptName`='outdoorpvp_ep' WHERE `TypeId`=6;
/* ACHIEVEMENTS */
DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (3693,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,1234,1239,5605,5606,12778,13036,13035,13037,12977,12967,12986,12982,12993,12780,13012,13011,13013,12062,12063,12064,12065,12183,12068,12060,12061,12822,12996,12972,12989,10062,10063,10054,10055,10046,10047,10048,10049,10050,10051,10044,10045,6446,7625,7628,5541,5542,5543,7573,7574,7265,7549,12971,12978,12979,12980,7598,7587,7264,7548) AND `type` IN (0,11);
DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (3693,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,1234,1239,5605,5606,12778,13036,13035,13037,12977,12967,12986,12982,12993,12780,13012,13011,13013,12062,12063,12064,12065,12183,12068,12060,12061,12822,12996,12972,12989,10062,10063,10054,10055,10046,10047,10048,10049,10050,10051,10044,10045,6446,7625,7628,5541,5542,5543,7573,7574,7265,7549,12971,12978,12979,12980,7598,7587,7264,7548,10068,10069) AND `type` IN (0,11);
INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`) VALUES
(3693,11,0,0, 'achievement_storm_glory'),
(3804,11,0,0, 'achievement_resilient_victory'),
@@ -1897,7 +1897,9 @@ INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,
(7598,11,0,0,'achievement_kings_bane'),
(7587,11,0,0,'achievement_void_dance'),
(7264,11,0,0,'achievement_safety_dance'),
(7548,11,0,0,'achievement_safety_dance');
(7548,11,0,0,'achievement_safety_dance'),
(10068,11,0,0,'achievement_ignis_shattered'),
(10069,11,0,0,'achievement_ignis_shattered');
/* SPELLS */
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
@@ -0,0 +1,4 @@
DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (10068,10069) AND `type` IN (0,11);
INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`) VALUES
(10068,11,0,0,'achievement_ignis_shattered'), -- Shattered (10 Player)
(10069,11,0,0,'achievement_ignis_shattered'); -- Shattered (25 Player)
@@ -23,71 +23,70 @@
enum Yells
{
SAY_AGGRO = -1603220,
SAY_SLAY_1 = -1603221,
SAY_SLAY_2 = -1603222,
SAY_DEATH = -1603223,
SAY_SUMMON = -1603224,
SAY_SLAG_POT = -1603225,
SAY_SCORCH_1 = -1603226,
SAY_SCORCH_2 = -1603227,
SAY_BERSERK = -1603228,
EMOTE_JETS = -1603229,
SAY_AGGRO = -1603220,
SAY_SLAY_1 = -1603221,
SAY_SLAY_2 = -1603222,
SAY_DEATH = -1603223,
SAY_SUMMON = -1603224,
SAY_SLAG_POT = -1603225,
SAY_SCORCH_1 = -1603226,
SAY_SCORCH_2 = -1603227,
SAY_BERSERK = -1603228,
EMOTE_JETS = -1603229,
};
enum Spells
{
SPELL_FLAME_JETS = 62680,
SPELL_SCORCH = 62546,
SPELL_SLAG_POT = 62717,
SPELL_SLAG_POT_DAMAGE = 65722,
SPELL_SLAG_IMBUED = 62836,
SPELL_ACTIVATE_CONSTRUCT = 62488,
SPELL_STRENGHT = 64473,
SPELL_GRAB = 62707,
SPELL_BERSERK = 47008
SPELL_FLAME_JETS = 62680,
SPELL_SCORCH = 62546,
SPELL_SLAG_POT = 62717,
SPELL_SLAG_POT_DAMAGE = 65722,
SPELL_SLAG_IMBUED = 62836,
SPELL_ACTIVATE_CONSTRUCT = 62488,
SPELL_STRENGHT = 64473,
SPELL_GRAB = 62707,
SPELL_BERSERK = 47008,
// Iron Construct
SPELL_HEAT = 65667,
SPELL_MOLTEN = 62373,
SPELL_BRITTLE = 62382,
SPELL_SHATTER = 62383,
SPELL_GROUND = 62548,
};
enum Events
{
EVENT_NONE,
EVENT_JET,
EVENT_SCORCH,
EVENT_SLAG_POT,
EVENT_GRAB_POT,
EVENT_CHANGE_POT,
EVENT_END_POT,
EVENT_CONSTRUCT,
EVENT_BERSERK,
ACTION_REMOVE_BUFF = 20
EVENT_JET = 1,
EVENT_SCORCH = 2,
EVENT_SLAG_POT = 3,
EVENT_GRAB_POT = 4,
EVENT_CHANGE_POT = 5,
EVENT_END_POT = 6,
EVENT_CONSTRUCT = 7,
EVENT_BERSERK = 8,
};
enum eCreatures
enum Actions
{
NPC_IRON_CONSTRUCT = 33121,
NPC_GROUND_SCORCH = 33221
ACTION_REMOVE_BUFF = 20,
};
enum ConstructSpells
enum Creatures
{
SPELL_HEAT = 65667,
SPELL_MOLTEN = 62373,
SPELL_BRITTLE = 62382,
SPELL_SHATTER = 62383,
SPELL_GROUND = 62548,
NPC_IRON_CONSTRUCT = 33121,
NPC_GROUND_SCORCH = 33221,
};
enum eAchievementData
enum AchievementData
{
ACHIEVEMENT_STOKIN_THE_FURNACE_10 = 2930,
ACHIEVEMENT_STOKIN_THE_FURNACE_25 = 2929,
ACHIEVEMENT_SHATTERED_10 = 2925,
ACHIEVEMENT_SHATTERED_25 = 2926,
DATA_SHATTERED = 29252926,
ACHIEVEMENT_IGNIS_START_EVENT = 20951,
};
#define MAX_ENCOUNTER_TIME 4 * 60 * 1000
#define CONSTRUCT_SPAWN_POINTS 20
const Position Pos[20] =
Position const ConstructSpawnPosition[CONSTRUCT_SPAWN_POINTS] =
{
{630.366f, 216.772f, 360.891f, 3.001970f},
{630.594f, 231.846f, 360.891f, 3.124140f},
@@ -108,320 +107,318 @@ const Position Pos[20] =
{543.316f, 337.468f, 360.886f, 6.195920f},
{543.280f, 239.674f, 360.890f, 6.265730f},
{543.265f, 217.147f, 360.891f, 0.174533f},
{543.256f, 224.831f, 360.891f, 0.122173f}
{543.256f, 224.831f, 360.891f, 0.122173f},
};
class boss_ignis : public CreatureScript
{
public:
boss_ignis() : CreatureScript("boss_ignis") { }
public:
boss_ignis() : CreatureScript("boss_ignis") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return GetUlduarAI<boss_ignis_AI>(pCreature);
}
struct boss_ignis_AI : public BossAI
{
boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, BOSS_IGNIS), vehicle(me->GetVehicleKit())
struct boss_ignis_AI : public BossAI
{
ASSERT(vehicle);
}
Vehicle *vehicle;
std::vector<Creature*> triggers;
bool Shattered;
uint64 SlagPotGUID;
uint32 EncounterTime;
uint32 ConstructTimer;
void Reset()
{
_Reset();
if (vehicle)
vehicle->RemoveAllPassengers();
}
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
DoScriptText(SAY_AGGRO, me);
events.ScheduleEvent(EVENT_JET, 30000);
events.ScheduleEvent(EVENT_SCORCH, 25000);
events.ScheduleEvent(EVENT_SLAG_POT, 35000);
events.ScheduleEvent(EVENT_CONSTRUCT, 15000);
events.ScheduleEvent(EVENT_END_POT, 40000);
events.ScheduleEvent(EVENT_BERSERK, 480000);
SlagPotGUID = 0;
EncounterTime = 0;
ConstructTimer = 0;
Shattered = false;
}
void JustDied(Unit* /*victim*/)
{
_JustDied();
DoScriptText(SAY_DEATH, me);
// Achievements
if (instance)
boss_ignis_AI(Creature* creature) : BossAI(creature, BOSS_IGNIS), _vehicle(me->GetVehicleKit())
{
// Shattered
if (Shattered)
instance->DoCompleteAchievement(RAID_MODE(ACHIEVEMENT_SHATTERED_10, ACHIEVEMENT_SHATTERED_25));
// Stokin' the Furnace
if (EncounterTime <= MAX_ENCOUNTER_TIME)
instance->DoCompleteAchievement(RAID_MODE(ACHIEVEMENT_STOKIN_THE_FURNACE_10, ACHIEVEMENT_STOKIN_THE_FURNACE_25));
ASSERT(_vehicle);
}
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING))
return;
EncounterTime += diff;
ConstructTimer += diff;
while(uint32 eventId = events.ExecuteEvent())
void Reset()
{
switch(eventId)
_Reset();
if (_vehicle)
_vehicle->RemoveAllPassengers();
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT);
}
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
DoScriptText(SAY_AGGRO, me);
events.ScheduleEvent(EVENT_JET, 30000);
events.ScheduleEvent(EVENT_SCORCH, 25000);
events.ScheduleEvent(EVENT_SLAG_POT, 35000);
events.ScheduleEvent(EVENT_CONSTRUCT, 15000);
events.ScheduleEvent(EVENT_END_POT, 40000);
events.ScheduleEvent(EVENT_BERSERK, 480000);
_slagPotGUID = 0;
_shattered = false;
_firstConstructKill = 0;
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT);
}
void JustDied(Unit* /*victim*/)
{
_JustDied();
DoScriptText(SAY_DEATH, me);
}
uint32 GetData(uint32 type)
{
if (type == DATA_SHATTERED)
return _shattered ? 1 : 0;
return 0;
}
void KilledUnit(Unit* /*victim*/)
{
if (!urand(0, 4))
DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
}
void JustSummoned(Creature* summon)
{
if (summon->GetEntry() == NPC_IRON_CONSTRUCT)
{
case EVENT_JET:
me->MonsterTextEmote(EMOTE_JETS, 0, true);
DoCastAOE(SPELL_FLAME_JETS);
events.RescheduleEvent(EVENT_JET, urand(35000, 40000));
break;
case EVENT_SLAG_POT:
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
DoScriptText(SAY_SLAG_POT, me);
SlagPotGUID = pTarget->GetGUID();
DoCast(pTarget, SPELL_GRAB);
events.DelayEvents(3000);
events.ScheduleEvent(EVENT_GRAB_POT, 500);
}
events.RescheduleEvent(EVENT_SLAG_POT, RAID_MODE(30000, 15000));
break;
case EVENT_GRAB_POT:
if (Unit* SlagPotTarget = Unit::GetUnit(*me, SlagPotGUID))
{
SlagPotTarget->EnterVehicle(me, 0);
events.CancelEvent(EVENT_GRAB_POT);
events.ScheduleEvent(EVENT_CHANGE_POT, 1000);
}
break;
case EVENT_CHANGE_POT:
if (Unit* SlagPotTarget = Unit::GetUnit(*me, SlagPotGUID))
{
SlagPotTarget->AddAura(SPELL_SLAG_POT, SlagPotTarget);
SlagPotTarget->EnterVehicle(me, 1);
events.CancelEvent(EVENT_CHANGE_POT);
events.ScheduleEvent(EVENT_END_POT, 10000);
}
break;
case EVENT_END_POT:
if (Unit* SlagPotTarget = Unit::GetUnit(*me, SlagPotGUID))
{
SlagPotTarget->ExitVehicle();
SlagPotTarget = NULL;
SlagPotGUID = 0;
events.CancelEvent(EVENT_END_POT);
}
break;
case EVENT_SCORCH:
DoScriptText(RAND(SAY_SCORCH_1, SAY_SCORCH_2), me);
if (Unit *pTarget = me->getVictim())
me->SummonCreature(NPC_GROUND_SCORCH, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 45000);
DoCast(SPELL_SCORCH);
events.RescheduleEvent(EVENT_SCORCH, 25000);
break;
case EVENT_CONSTRUCT:
DoScriptText(SAY_SUMMON, me);
DoSummon(NPC_IRON_CONSTRUCT, Pos[rand()%20], 30000, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT);
DoCast(SPELL_STRENGHT);
DoCast(me, SPELL_ACTIVATE_CONSTRUCT);
events.RescheduleEvent(EVENT_CONSTRUCT, RAID_MODE(40000, 30000));
break;
case EVENT_BERSERK:
DoCast(me, SPELL_BERSERK, true);
DoScriptText(SAY_BERSERK, me);
break;
summon->setFaction(16);
summon->SetReactState(REACT_AGGRESSIVE);
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED | UNIT_FLAG_STUNNED | UNIT_FLAG_DISABLE_MOVE);
}
summon->AI()->AttackStart(me->getVictim());
summon->AI()->DoZoneInCombat();
summons.Summon(summon);
}
DoMeleeAttackIfReady();
}
void KilledUnit(Unit* /*victim*/)
{
if (!(rand()%5))
DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
}
void JustSummoned(Creature *summon)
{
if (summon->GetEntry() == NPC_IRON_CONSTRUCT)
void DoAction(const int32 action)
{
summon->setFaction(16);
summon->SetReactState(REACT_AGGRESSIVE);
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED | UNIT_FLAG_STUNNED | UNIT_FLAG_DISABLE_MOVE);
}
summon->AI()->AttackStart(me->getVictim());
summon->AI()->DoZoneInCombat();
summons.Summon(summon);
}
if (action != ACTION_REMOVE_BUFF)
return;
void DoAction(const int32 action)
{
switch(action)
{
case ACTION_REMOVE_BUFF:
me->RemoveAuraFromStack(SPELL_STRENGHT);
// Shattered Achievement
if (ConstructTimer >= 5000)
ConstructTimer = 0;
else
Shattered = true;
break;
me->RemoveAuraFromStack(SPELL_STRENGHT);
// Shattered Achievement
time_t secondKill = sWorld->GetGameTime();
if ((secondKill - _firstConstructKill) < 5)
_shattered = true;
_firstConstructKill = secondKill;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_JET:
me->MonsterTextEmote(EMOTE_JETS, 0, true);
DoCast(me, SPELL_FLAME_JETS);
events.ScheduleEvent(EVENT_JET, urand(35000, 40000));
break;
case EVENT_SLAG_POT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
DoScriptText(SAY_SLAG_POT, me);
_slagPotGUID = target->GetGUID();
DoCast(target, SPELL_GRAB);
events.DelayEvents(3000);
events.ScheduleEvent(EVENT_GRAB_POT, 500);
}
events.ScheduleEvent(EVENT_SLAG_POT, RAID_MODE(30000, 15000));
break;
case EVENT_GRAB_POT:
if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID))
{
slagPotTarget->EnterVehicle(me, 0);
events.CancelEvent(EVENT_GRAB_POT);
events.ScheduleEvent(EVENT_CHANGE_POT, 1000);
}
break;
case EVENT_CHANGE_POT:
if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID))
{
slagPotTarget->AddAura(SPELL_SLAG_POT, slagPotTarget);
slagPotTarget->EnterVehicle(me, 1);
events.CancelEvent(EVENT_CHANGE_POT);
events.ScheduleEvent(EVENT_END_POT, 10000);
}
break;
case EVENT_END_POT:
if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID))
{
slagPotTarget->ExitVehicle();
slagPotTarget = NULL;
_slagPotGUID = 0;
events.CancelEvent(EVENT_END_POT);
}
break;
case EVENT_SCORCH:
DoScriptText(RAND(SAY_SCORCH_1, SAY_SCORCH_2), me);
if (Unit* target = me->getVictim())
me->SummonCreature(NPC_GROUND_SCORCH, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 45000);
DoCast(SPELL_SCORCH);
events.ScheduleEvent(EVENT_SCORCH, 25000);
break;
case EVENT_CONSTRUCT:
DoScriptText(SAY_SUMMON, me);
DoSummon(NPC_IRON_CONSTRUCT, ConstructSpawnPosition[urand(0, CONSTRUCT_SPAWN_POINTS - 1)], 30000, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT);
DoCast(SPELL_STRENGHT);
DoCast(me, SPELL_ACTIVATE_CONSTRUCT);
events.ScheduleEvent(EVENT_CONSTRUCT, RAID_MODE(40000, 30000));
break;
case EVENT_BERSERK:
DoCast(me, SPELL_BERSERK, true);
DoScriptText(SAY_BERSERK, me);
break;
}
}
DoMeleeAttackIfReady();
}
private:
uint64 _slagPotGUID;
Vehicle* _vehicle;
time_t _firstConstructKill;
bool _shattered;
};
CreatureAI* GetAI(Creature* creature) const
{
return GetUlduarAI<boss_ignis_AI>(creature);
}
};
};
class npc_iron_construct : public CreatureScript
{
public:
npc_iron_construct() : CreatureScript("npc_iron_construct") { }
public:
npc_iron_construct() : CreatureScript("npc_iron_construct") { }
CreatureAI *GetAI(Creature *creature) const
{
return new npc_iron_constructAI(creature);
}
struct npc_iron_constructAI : public ScriptedAI
{
npc_iron_constructAI(Creature* pCreature) : ScriptedAI(pCreature)
struct npc_iron_constructAI : public ScriptedAI
{
instance = pCreature->GetInstanceScript();
pCreature->SetReactState(REACT_PASSIVE);
}
InstanceScript* instance;
bool Brittled;
void Reset()
{
Brittled = false;
}
void DamageTaken(Unit* /*attacker*/, uint32& damage)
{
if (me->HasAura(SPELL_BRITTLE) && damage >= 5000)
npc_iron_constructAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
DoCast(SPELL_SHATTER);
if (Creature *pIgnis = me->GetCreature(*me, instance->GetData64(BOSS_IGNIS)))
if (pIgnis->AI())
pIgnis->AI()->DoAction(ACTION_REMOVE_BUFF);
me->DespawnOrUnsummon(1000);
creature->SetReactState(REACT_PASSIVE);
}
}
void UpdateAI(const uint32 /*uiDiff*/)
{
if (!UpdateVictim())
return;
if (Aura * aur = me->GetAura(SPELL_HEAT))
void Reset()
{
if (aur->GetStackAmount() >= 10)
_brittled = false;
}
void DamageTaken(Unit* /*attacker*/, uint32& damage)
{
if (me->HasAura(SPELL_BRITTLE) && damage >= 5000)
{
me->RemoveAura(SPELL_HEAT);
DoCast(SPELL_MOLTEN);
Brittled = false;
DoCast(SPELL_SHATTER);
if (Creature* ignis = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_IGNIS)))
if (ignis->AI())
ignis->AI()->DoAction(ACTION_REMOVE_BUFF);
me->DespawnOrUnsummon(1000);
}
}
// Water pools
if (me->IsInWater() && !Brittled && me->HasAura(SPELL_MOLTEN))
void UpdateAI(const uint32 /*uiDiff*/)
{
DoCast(SPELL_BRITTLE);
me->RemoveAura(SPELL_MOLTEN);
Brittled = true;
if (!UpdateVictim())
return;
if (Aura* aur = me->GetAura(SPELL_HEAT))
{
if (aur->GetStackAmount() >= 10)
{
me->RemoveAura(SPELL_HEAT);
DoCast(SPELL_MOLTEN);
_brittled = false;
}
}
// Water pools
if (me->IsInWater() && !_brittled && me->HasAura(SPELL_MOLTEN))
{
DoCast(SPELL_BRITTLE);
me->RemoveAura(SPELL_MOLTEN);
_brittled = true;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
private:
InstanceScript* _instance;
bool _brittled;
};
CreatureAI* GetAI(Creature* creature) const
{
return GetUlduarAI<npc_iron_constructAI>(creature);
}
};
};
class npc_scorch_ground : public CreatureScript
{
public:
npc_scorch_ground() : CreatureScript("npc_scorch_ground") { }
public:
npc_scorch_ground() : CreatureScript("npc_scorch_ground") { }
CreatureAI *GetAI(Creature *creature) const
{
return new npc_scorch_groundAI(creature);
}
struct npc_scorch_groundAI : public ScriptedAI
{
npc_scorch_groundAI(Creature* pCreature) : ScriptedAI(pCreature)
struct npc_scorch_groundAI : public ScriptedAI
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE |UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
pCreature->SetDisplayId(16925); //model 2 in db cannot overwrite wdb fields
}
uint64 ConstructGUID;
uint32 HeatTimer;
bool Heat;
void MoveInLineOfSight(Unit* pWho)
{
if (!Heat)
npc_scorch_groundAI(Creature* creature) : ScriptedAI(creature)
{
if (pWho->GetEntry() == NPC_IRON_CONSTRUCT)
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE |UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
creature->SetDisplayId(16925); //model 2 in db cannot overwrite wdb fields
}
void MoveInLineOfSight(Unit* unit)
{
if (!_heat)
{
if (!pWho->HasAura(SPELL_HEAT) || !pWho->HasAura(SPELL_MOLTEN))
if (unit->GetEntry() == NPC_IRON_CONSTRUCT)
{
ConstructGUID = pWho->GetGUID();
Heat=true;
if (!unit->HasAura(SPELL_HEAT) || !unit->HasAura(SPELL_MOLTEN))
{
_constructGUID = unit->GetGUID();
_heat = true;
}
}
}
}
}
void Reset()
{
Heat=false;
DoCast(me, SPELL_GROUND);
ConstructGUID=0;
HeatTimer=0;
}
void UpdateAI(const uint32 uiDiff)
{
if (Heat)
void Reset()
{
if(HeatTimer <= uiDiff)
{
Creature* Construct = me->GetCreature(*me , ConstructGUID);
if (Construct && !Construct->HasAura(SPELL_MOLTEN))
{
me->AddAura(SPELL_HEAT, Construct);
HeatTimer=1000;
}
}
else
HeatTimer -= uiDiff;
_heat = false;
DoCast(me, SPELL_GROUND);
_constructGUID = 0;
_heatTimer = 0;
}
void UpdateAI(const uint32 uiDiff)
{
if (_heat)
{
if(_heatTimer <= uiDiff)
{
Creature* construct = me->GetCreature(*me , _constructGUID);
if (construct && !construct->HasAura(SPELL_MOLTEN))
{
me->AddAura(SPELL_HEAT, construct);
_heatTimer = 1000;
}
}
else
_heatTimer -= uiDiff;
}
}
private:
uint64 _constructGUID;
uint32 _heatTimer;
bool _heat;
};
CreatureAI* GetAI(Creature* creature) const
{
return GetUlduarAI<npc_scorch_groundAI>(creature);
}
};
};
class spell_ignis_slag_pot : public SpellScriptLoader
@@ -431,13 +428,12 @@ class spell_ignis_slag_pot : public SpellScriptLoader
class spell_ignis_slag_pot_AuraScript : public AuraScript
{
PrepareAuraScript(spell_ignis_slag_pot_AuraScript)
PrepareAuraScript(spell_ignis_slag_pot_AuraScript);
bool Validate(SpellEntry const* /*spellEntry*/)
{
if (!sSpellStore.LookupEntry(SPELL_SLAG_POT_DAMAGE))
return false;
if (!sSpellStore.LookupEntry(SPELL_SLAG_POT))
return false;
if (!sSpellStore.LookupEntry(SPELL_SLAG_IMBUED))
return false;
return true;
@@ -451,13 +447,18 @@ class spell_ignis_slag_pot : public SpellScriptLoader
Unit* target = GetTarget();
aurEffCaster->CastSpell(target, SPELL_SLAG_POT_DAMAGE, true);
if (target->isAlive() && !GetDuration())
target->CastSpell(target, SPELL_SLAG_IMBUED, true);
}
void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
if (GetTarget()->isAlive())
GetTarget()->CastSpell(GetTarget(), SPELL_SLAG_IMBUED, true);
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_ignis_slag_pot_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
AfterEffectRemove += AuraEffectRemoveFn(spell_ignis_slag_pot_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
@@ -467,10 +468,25 @@ class spell_ignis_slag_pot : public SpellScriptLoader
}
};
class achievement_ignis_shattered : public AchievementCriteriaScript
{
public:
achievement_ignis_shattered() : AchievementCriteriaScript("achievement_ignis_shattered") { }
bool OnCheck(Player* /*source*/, Unit* target)
{
if (target && target->IsAIEnabled)
return target->GetAI()->GetData(DATA_SHATTERED);
return false;
}
};
void AddSC_boss_ignis()
{
new boss_ignis();
new npc_iron_construct();
new npc_scorch_ground();
new spell_ignis_slag_pot();
new achievement_ignis_shattered();
}