Scripts/Ulduar:
* Removed achievement hacks from Ignis the Furnace Master's script and scripted them properly * Code style cleanups
This commit is contained in:
@@ -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)
|
||||
@@ -45,31 +45,9 @@ enum Spells
|
||||
SPELL_ACTIVATE_CONSTRUCT = 62488,
|
||||
SPELL_STRENGHT = 64473,
|
||||
SPELL_GRAB = 62707,
|
||||
SPELL_BERSERK = 47008
|
||||
};
|
||||
SPELL_BERSERK = 47008,
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
enum eCreatures
|
||||
{
|
||||
NPC_IRON_CONSTRUCT = 33121,
|
||||
NPC_GROUND_SCORCH = 33221
|
||||
};
|
||||
|
||||
enum ConstructSpells
|
||||
{
|
||||
// Iron Construct
|
||||
SPELL_HEAT = 65667,
|
||||
SPELL_MOLTEN = 62373,
|
||||
SPELL_BRITTLE = 62382,
|
||||
@@ -77,17 +55,38 @@ enum ConstructSpells
|
||||
SPELL_GROUND = 62548,
|
||||
};
|
||||
|
||||
enum eAchievementData
|
||||
enum Events
|
||||
{
|
||||
ACHIEVEMENT_STOKIN_THE_FURNACE_10 = 2930,
|
||||
ACHIEVEMENT_STOKIN_THE_FURNACE_25 = 2929,
|
||||
ACHIEVEMENT_SHATTERED_10 = 2925,
|
||||
ACHIEVEMENT_SHATTERED_25 = 2926,
|
||||
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,
|
||||
};
|
||||
|
||||
#define MAX_ENCOUNTER_TIME 4 * 60 * 1000
|
||||
enum Actions
|
||||
{
|
||||
ACTION_REMOVE_BUFF = 20,
|
||||
};
|
||||
|
||||
const Position Pos[20] =
|
||||
enum Creatures
|
||||
{
|
||||
NPC_IRON_CONSTRUCT = 33121,
|
||||
NPC_GROUND_SCORCH = 33221,
|
||||
};
|
||||
|
||||
enum AchievementData
|
||||
{
|
||||
DATA_SHATTERED = 29252926,
|
||||
ACHIEVEMENT_IGNIS_START_EVENT = 20951,
|
||||
};
|
||||
|
||||
#define CONSTRUCT_SPAWN_POINTS 20
|
||||
|
||||
Position const ConstructSpawnPosition[CONSTRUCT_SPAWN_POINTS] =
|
||||
{
|
||||
{630.366f, 216.772f, 360.891f, 3.001970f},
|
||||
{630.594f, 231.846f, 360.891f, 3.124140f},
|
||||
@@ -108,7 +107,7 @@ 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
|
||||
@@ -116,32 +115,20 @@ class boss_ignis : public CreatureScript
|
||||
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())
|
||||
boss_ignis_AI(Creature* creature) : BossAI(creature, BOSS_IGNIS), _vehicle(me->GetVehicleKit())
|
||||
{
|
||||
ASSERT(vehicle);
|
||||
ASSERT(_vehicle);
|
||||
}
|
||||
|
||||
Vehicle *vehicle;
|
||||
|
||||
std::vector<Creature*> triggers;
|
||||
|
||||
bool Shattered;
|
||||
uint64 SlagPotGUID;
|
||||
uint32 EncounterTime;
|
||||
uint32 ConstructTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
if (vehicle)
|
||||
vehicle->RemoveAllPassengers();
|
||||
if (_vehicle)
|
||||
_vehicle->RemoveAllPassengers();
|
||||
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
@@ -154,27 +141,57 @@ public:
|
||||
events.ScheduleEvent(EVENT_CONSTRUCT, 15000);
|
||||
events.ScheduleEvent(EVENT_END_POT, 40000);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 480000);
|
||||
SlagPotGUID = 0;
|
||||
EncounterTime = 0;
|
||||
ConstructTimer = 0;
|
||||
Shattered = false;
|
||||
_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);
|
||||
|
||||
// Achievements
|
||||
if (instance)
|
||||
{
|
||||
// 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));
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
void DoAction(const int32 action)
|
||||
{
|
||||
if (action != ACTION_REMOVE_BUFF)
|
||||
return;
|
||||
|
||||
me->RemoveAuraFromStack(SPELL_STRENGHT);
|
||||
// Shattered Achievement
|
||||
time_t secondKill = sWorld->GetGameTime();
|
||||
if ((secondKill - _firstConstructKill) < 5)
|
||||
_shattered = true;
|
||||
_firstConstructKill = secondKill;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -187,68 +204,65 @@ public:
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
EncounterTime += diff;
|
||||
ConstructTimer += diff;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_JET:
|
||||
me->MonsterTextEmote(EMOTE_JETS, 0, true);
|
||||
DoCastAOE(SPELL_FLAME_JETS);
|
||||
events.RescheduleEvent(EVENT_JET, urand(35000, 40000));
|
||||
DoCast(me, SPELL_FLAME_JETS);
|
||||
events.ScheduleEvent(EVENT_JET, urand(35000, 40000));
|
||||
break;
|
||||
case EVENT_SLAG_POT:
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
{
|
||||
DoScriptText(SAY_SLAG_POT, me);
|
||||
SlagPotGUID = pTarget->GetGUID();
|
||||
DoCast(pTarget, SPELL_GRAB);
|
||||
_slagPotGUID = target->GetGUID();
|
||||
DoCast(target, SPELL_GRAB);
|
||||
events.DelayEvents(3000);
|
||||
events.ScheduleEvent(EVENT_GRAB_POT, 500);
|
||||
}
|
||||
events.RescheduleEvent(EVENT_SLAG_POT, RAID_MODE(30000, 15000));
|
||||
events.ScheduleEvent(EVENT_SLAG_POT, RAID_MODE(30000, 15000));
|
||||
break;
|
||||
case EVENT_GRAB_POT:
|
||||
if (Unit* SlagPotTarget = Unit::GetUnit(*me, SlagPotGUID))
|
||||
if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID))
|
||||
{
|
||||
SlagPotTarget->EnterVehicle(me, 0);
|
||||
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))
|
||||
if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID))
|
||||
{
|
||||
SlagPotTarget->AddAura(SPELL_SLAG_POT, SlagPotTarget);
|
||||
SlagPotTarget->EnterVehicle(me, 1);
|
||||
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))
|
||||
if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID))
|
||||
{
|
||||
SlagPotTarget->ExitVehicle();
|
||||
SlagPotTarget = NULL;
|
||||
SlagPotGUID = 0;
|
||||
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);
|
||||
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.RescheduleEvent(EVENT_SCORCH, 25000);
|
||||
events.ScheduleEvent(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);
|
||||
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.RescheduleEvent(EVENT_CONSTRUCT, RAID_MODE(40000, 30000));
|
||||
events.ScheduleEvent(EVENT_CONSTRUCT, RAID_MODE(40000, 30000));
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
DoCast(me, SPELL_BERSERK, true);
|
||||
@@ -256,43 +270,22 @@ public:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (!(rand()%5))
|
||||
DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
|
||||
}
|
||||
private:
|
||||
uint64 _slagPotGUID;
|
||||
Vehicle* _vehicle;
|
||||
time_t _firstConstructKill;
|
||||
bool _shattered;
|
||||
|
||||
void JustSummoned(Creature *summon)
|
||||
{
|
||||
if (summon->GetEntry() == NPC_IRON_CONSTRUCT)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return GetUlduarAI<boss_ignis_AI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_iron_construct : public CreatureScript
|
||||
@@ -300,25 +293,16 @@ class npc_iron_construct : public CreatureScript
|
||||
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)
|
||||
npc_iron_constructAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
|
||||
{
|
||||
instance = pCreature->GetInstanceScript();
|
||||
pCreature->SetReactState(REACT_PASSIVE);
|
||||
creature->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
bool Brittled;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Brittled = false;
|
||||
_brittled = false;
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage)
|
||||
@@ -326,9 +310,9 @@ public:
|
||||
if (me->HasAura(SPELL_BRITTLE) && damage >= 5000)
|
||||
{
|
||||
DoCast(SPELL_SHATTER);
|
||||
if (Creature *pIgnis = me->GetCreature(*me, instance->GetData64(BOSS_IGNIS)))
|
||||
if (pIgnis->AI())
|
||||
pIgnis->AI()->DoAction(ACTION_REMOVE_BUFF);
|
||||
if (Creature* ignis = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_IGNIS)))
|
||||
if (ignis->AI())
|
||||
ignis->AI()->DoAction(ACTION_REMOVE_BUFF);
|
||||
|
||||
me->DespawnOrUnsummon(1000);
|
||||
}
|
||||
@@ -345,52 +329,55 @@ public:
|
||||
{
|
||||
me->RemoveAura(SPELL_HEAT);
|
||||
DoCast(SPELL_MOLTEN);
|
||||
Brittled = false;
|
||||
_brittled = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Water pools
|
||||
if (me->IsInWater() && !Brittled && me->HasAura(SPELL_MOLTEN))
|
||||
if (me->IsInWater() && !_brittled && me->HasAura(SPELL_MOLTEN))
|
||||
{
|
||||
DoCast(SPELL_BRITTLE);
|
||||
me->RemoveAura(SPELL_MOLTEN);
|
||||
Brittled = true;
|
||||
_brittled = true;
|
||||
}
|
||||
|
||||
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") { }
|
||||
|
||||
CreatureAI *GetAI(Creature *creature) const
|
||||
{
|
||||
return new npc_scorch_groundAI(creature);
|
||||
}
|
||||
|
||||
struct npc_scorch_groundAI : public ScriptedAI
|
||||
{
|
||||
npc_scorch_groundAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
npc_scorch_groundAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
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
|
||||
creature->SetDisplayId(16925); //model 2 in db cannot overwrite wdb fields
|
||||
}
|
||||
|
||||
uint64 ConstructGUID;
|
||||
uint32 HeatTimer;
|
||||
bool Heat;
|
||||
|
||||
void MoveInLineOfSight(Unit* pWho)
|
||||
void MoveInLineOfSight(Unit* unit)
|
||||
{
|
||||
if (!Heat)
|
||||
if (!_heat)
|
||||
{
|
||||
if (pWho->GetEntry() == NPC_IRON_CONSTRUCT)
|
||||
if (unit->GetEntry() == NPC_IRON_CONSTRUCT)
|
||||
{
|
||||
if (!pWho->HasAura(SPELL_HEAT) || !pWho->HasAura(SPELL_MOLTEN))
|
||||
if (!unit->HasAura(SPELL_HEAT) || !unit->HasAura(SPELL_MOLTEN))
|
||||
{
|
||||
ConstructGUID = pWho->GetGUID();
|
||||
Heat=true;
|
||||
_constructGUID = unit->GetGUID();
|
||||
_heat = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -398,30 +385,40 @@ public:
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Heat=false;
|
||||
_heat = false;
|
||||
DoCast(me, SPELL_GROUND);
|
||||
ConstructGUID=0;
|
||||
HeatTimer=0;
|
||||
_constructGUID = 0;
|
||||
_heatTimer = 0;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff)
|
||||
{
|
||||
if (Heat)
|
||||
if (_heat)
|
||||
{
|
||||
if(HeatTimer <= uiDiff)
|
||||
if(_heatTimer <= uiDiff)
|
||||
{
|
||||
Creature* Construct = me->GetCreature(*me , ConstructGUID);
|
||||
if (Construct && !Construct->HasAura(SPELL_MOLTEN))
|
||||
Creature* construct = me->GetCreature(*me , _constructGUID);
|
||||
if (construct && !construct->HasAura(SPELL_MOLTEN))
|
||||
{
|
||||
me->AddAura(SPELL_HEAT, Construct);
|
||||
HeatTimer=1000;
|
||||
me->AddAura(SPELL_HEAT, construct);
|
||||
_heatTimer = 1000;
|
||||
}
|
||||
}
|
||||
else
|
||||
HeatTimer -= uiDiff;
|
||||
_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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user