mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-31 06:07:37 +01:00
Scripts/Icecrown Citaldel: Fixed spells cast by Professor Putricide during heroic Festergut and Rotface encounters
Closes #7641 Closes #8243
This commit is contained in:
@@ -206,15 +206,27 @@ class boss_festergut : public CreatureScript
|
||||
}
|
||||
case EVENT_VILE_GAS:
|
||||
{
|
||||
std::list<Unit*> targets;
|
||||
std::list<Unit*> ranged, melee;
|
||||
uint32 minTargets = RAID_MODE<uint32>(3, 8, 3, 8);
|
||||
SelectTargetList(targets, minTargets, SELECT_TARGET_RANDOM, -5.0f, true);
|
||||
float minDist = 0.0f;
|
||||
if (targets.size() >= minTargets)
|
||||
minDist = -5.0f;
|
||||
SelectTargetList(ranged, 25, SELECT_TARGET_RANDOM, -5.0f, true);
|
||||
SelectTargetList(melee, 25, SELECT_TARGET_RANDOM, 5.0f, true);
|
||||
while (ranged.size() < minTargets)
|
||||
{
|
||||
if (melee.empty())
|
||||
break;
|
||||
|
||||
Unit* target = Trinity::Containers::SelectRandomContainerElement(melee);
|
||||
ranged.push_back(target);
|
||||
melee.remove(target);
|
||||
}
|
||||
|
||||
if (!ranged.empty())
|
||||
{
|
||||
Trinity::Containers::RandomResizeList(ranged, RAID_MODE<uint32>(1, 3, 1, 3));
|
||||
for (std::list<Unit*>::iterator itr = ranged.begin(); itr != ranged.end(); ++itr)
|
||||
DoCast(*itr, SPELL_VILE_GAS);
|
||||
}
|
||||
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, minDist, true))
|
||||
DoCast(target, SPELL_VILE_GAS);
|
||||
events.ScheduleEvent(EVENT_VILE_GAS, urand(28000, 35000));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -55,10 +55,8 @@ enum Spells
|
||||
SPELL_GASEOUS_BLIGHT_LARGE = 69157,
|
||||
SPELL_GASEOUS_BLIGHT_MEDIUM = 69162,
|
||||
SPELL_GASEOUS_BLIGHT_SMALL = 69164,
|
||||
SPELL_MALLABLE_GOO_H = 70852,
|
||||
|
||||
// Rotface
|
||||
SPELL_VILE_GAS_H = 69240,
|
||||
SPELL_MALLEABLE_GOO_H = 72296,
|
||||
SPELL_MALLEABLE_GOO_SUMMON = 72299,
|
||||
|
||||
// Professor Putricide
|
||||
SPELL_SLIME_PUDDLE_TRIGGER = 70341,
|
||||
@@ -122,7 +120,6 @@ enum Events
|
||||
|
||||
// Rotface
|
||||
EVENT_ROTFACE_DIES = 3,
|
||||
EVENT_ROTFACE_VILE_GAS = 4,
|
||||
EVENT_ROTFACE_OOZE_FLOOD = 5,
|
||||
|
||||
// Professor Putricide
|
||||
@@ -305,6 +302,9 @@ class boss_professor_putricide : public CreatureScript
|
||||
summons.Summon(summon);
|
||||
switch (summon->GetEntry())
|
||||
{
|
||||
case NPC_MALLEABLE_OOZE_STALKER:
|
||||
DoCast(summon, SPELL_MALLEABLE_GOO_H);
|
||||
return;
|
||||
case NPC_GROWING_OOZE_PUDDLE:
|
||||
summon->CastSpell(summon, SPELL_GROW_STACKER, true);
|
||||
summon->CastSpell(summon, SPELL_SLIME_PUDDLE_AURA, true);
|
||||
@@ -424,7 +424,7 @@ class boss_professor_putricide : public CreatureScript
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
DoZoneInCombat(me);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(15000, 20000), 0, PHASE_FESTERGUT);
|
||||
events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(13000, 18000), 0, PHASE_FESTERGUT);
|
||||
break;
|
||||
case ACTION_FESTERGUT_GAS:
|
||||
Talk(SAY_FESTERGUT_GASEOUS_BLIGHT);
|
||||
@@ -441,8 +441,6 @@ class boss_professor_putricide : public CreatureScript
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
_oozeFloodStage = 0;
|
||||
DoZoneInCombat(me);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000), 0, PHASE_ROTFACE);
|
||||
// init random sequence of floods
|
||||
if (Creature* rotface = Unit::GetCreature(*me, instance->GetData64(DATA_ROTFACE)))
|
||||
{
|
||||
@@ -582,19 +580,13 @@ class boss_professor_putricide : public CreatureScript
|
||||
EnterEvadeMode();
|
||||
break;
|
||||
case EVENT_FESTERGUT_GOO:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
|
||||
DoCast(target, SPELL_MALLABLE_GOO_H, true); // triggered, to skip LoS check
|
||||
events.ScheduleEvent(EVENT_FESTERGUT_GOO, urand(15000, 20000), 0, PHASE_FESTERGUT);
|
||||
me->CastCustomSpell(SPELL_MALLEABLE_GOO_SUMMON, SPELLVALUE_MAX_TARGETS, 1, NULL, true);
|
||||
events.ScheduleEvent(EVENT_FESTERGUT_GOO, (Is25ManRaid() ? 10000 : 30000) + urand(0, 5000), 0, PHASE_FESTERGUT);
|
||||
break;
|
||||
case EVENT_ROTFACE_DIES:
|
||||
Talk(SAY_ROTFACE_DEATH);
|
||||
EnterEvadeMode();
|
||||
break;
|
||||
case EVENT_ROTFACE_VILE_GAS:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
|
||||
DoCast(target, SPELL_VILE_GAS_H, true); // triggered, to skip LoS check
|
||||
events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000), 0, PHASE_ROTFACE);
|
||||
break;
|
||||
case EVENT_ROTFACE_OOZE_FLOOD:
|
||||
DoAction(ACTION_ROTFACE_OOZE);
|
||||
events.ScheduleEvent(EVENT_ROTFACE_OOZE_FLOOD, 25000, 0, PHASE_ROTFACE);
|
||||
|
||||
@@ -46,6 +46,7 @@ enum Spells
|
||||
// Rotface
|
||||
SPELL_SLIME_SPRAY = 69508, // every 20 seconds
|
||||
SPELL_MUTATED_INFECTION = 69674, // hastens every 1:30
|
||||
SPELL_VILE_GAS_TRIGGER_SUMMON = 72287,
|
||||
|
||||
// Oozes
|
||||
SPELL_LITTLE_OOZE_COMBINE = 69537, // combine 2 Small Oozes
|
||||
@@ -64,6 +65,10 @@ enum Spells
|
||||
SPELL_MORTAL_WOUND = 71127,
|
||||
SPELL_DECIMATE = 71123,
|
||||
SPELL_AWAKEN_PLAGUED_ZOMBIES = 71159,
|
||||
|
||||
// Professor Putricide
|
||||
SPELL_VILE_GAS_H = 72272,
|
||||
SPELL_VILE_GAS_TRIGGER = 72285,
|
||||
};
|
||||
|
||||
#define MUTATED_INFECTION RAID_MODE<int32>(69674, 71224, 73022, 73023)
|
||||
@@ -74,13 +79,14 @@ enum Events
|
||||
EVENT_SLIME_SPRAY = 1,
|
||||
EVENT_HASTEN_INFECTIONS = 2,
|
||||
EVENT_MUTATED_INFECTION = 3,
|
||||
EVENT_VILE_GAS = 4,
|
||||
|
||||
// Precious
|
||||
EVENT_DECIMATE = 4,
|
||||
EVENT_MORTAL_WOUND = 5,
|
||||
EVENT_SUMMON_ZOMBIES = 6,
|
||||
EVENT_DECIMATE = 5,
|
||||
EVENT_MORTAL_WOUND = 6,
|
||||
EVENT_SUMMON_ZOMBIES = 7,
|
||||
|
||||
EVENT_STICKY_OOZE = 7,
|
||||
EVENT_STICKY_OOZE = 8,
|
||||
};
|
||||
|
||||
class boss_rotface : public CreatureScript
|
||||
@@ -102,6 +108,9 @@ class boss_rotface : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_SLIME_SPRAY, 20000);
|
||||
events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90000);
|
||||
events.ScheduleEvent(EVENT_MUTATED_INFECTION, 14000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_VILE_GAS, urand(22000, 27000));
|
||||
|
||||
infectionStage = 0;
|
||||
infectionCooldown = 14000;
|
||||
}
|
||||
@@ -119,7 +128,9 @@ class boss_rotface : public CreatureScript
|
||||
Talk(SAY_AGGRO);
|
||||
if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
|
||||
professor->AI()->DoAction(ACTION_ROTFACE_COMBAT);
|
||||
|
||||
DoZoneInCombat();
|
||||
DoCast(me, SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC, true);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
@@ -158,11 +169,17 @@ class boss_rotface : public CreatureScript
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) OVERRIDE
|
||||
|
||||
{
|
||||
// don't enter combat
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) OVERRIDE
|
||||
{
|
||||
if (summon->GetEntry() == NPC_VILE_GAS_STALKER)
|
||||
if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
|
||||
professor->CastSpell(summon, SPELL_VILE_GAS_H, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
{
|
||||
if (!UpdateVictim() || !CheckInRoom())
|
||||
@@ -197,6 +214,10 @@ class boss_rotface : public CreatureScript
|
||||
me->CastCustomSpell(SPELL_MUTATED_INFECTION, SPELLVALUE_MAX_TARGETS, 1, NULL, false);
|
||||
events.ScheduleEvent(EVENT_MUTATED_INFECTION, infectionCooldown);
|
||||
break;
|
||||
case EVENT_VILE_GAS:
|
||||
DoCastAOE(SPELL_VILE_GAS_TRIGGER);
|
||||
events.ScheduleEvent(EVENT_VILE_GAS, urand(30000, 35000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -231,6 +252,7 @@ class npc_little_ooze : public CreatureScript
|
||||
{
|
||||
DoCast(me, SPELL_LITTLE_OOZE_COMBINE, true);
|
||||
DoCast(me, SPELL_WEAK_RADIATING_OOZE, true);
|
||||
DoCast(me, SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC, true);
|
||||
events.ScheduleEvent(EVENT_STICKY_OOZE, 5000);
|
||||
me->AddThreat(summoner, 500000.0f);
|
||||
}
|
||||
@@ -775,6 +797,71 @@ class spell_rotface_unstable_ooze_explosion_suicide : public SpellScriptLoader
|
||||
}
|
||||
};
|
||||
|
||||
class spell_rotface_vile_gas_trigger : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_rotface_vile_gas_trigger() : SpellScriptLoader("spell_rotface_vile_gas_trigger") { }
|
||||
|
||||
class spell_rotface_vile_gas_trigger_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_rotface_vile_gas_trigger_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
std::list<WorldObject*> ranged, melee;
|
||||
std::list<WorldObject*>::iterator itr = targets.begin();
|
||||
while (itr != targets.end() && (*itr)->GetDistance(GetCaster()) < 5.0f)
|
||||
{
|
||||
melee.push_back((*itr)->ToUnit());
|
||||
++itr;
|
||||
}
|
||||
|
||||
while (itr != targets.end())
|
||||
{
|
||||
ranged.push_back((*itr)->ToUnit());
|
||||
++itr;
|
||||
}
|
||||
|
||||
uint32 minTargets = GetCaster()->GetMap()->Is25ManRaid() ? 8 : 3;
|
||||
while (ranged.size() < minTargets)
|
||||
{
|
||||
if (melee.empty())
|
||||
break;
|
||||
|
||||
WorldObject* target = Trinity::Containers::SelectRandomContainerElement(melee);
|
||||
ranged.push_back(target);
|
||||
melee.remove(target);
|
||||
}
|
||||
|
||||
if (!ranged.empty())
|
||||
Trinity::Containers::RandomResizeList(ranged, GetCaster()->GetMap()->Is25ManRaid() ? 3 : 1);
|
||||
|
||||
targets.swap(ranged);
|
||||
}
|
||||
|
||||
void HandleDummy(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetCaster()->CastSpell(GetHitUnit(), SPELL_VILE_GAS_TRIGGER_SUMMON);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_vile_gas_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_rotface_vile_gas_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_rotface_vile_gas_trigger_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_rotface()
|
||||
{
|
||||
new boss_rotface();
|
||||
@@ -789,4 +876,5 @@ void AddSC_boss_rotface()
|
||||
new spell_rotface_unstable_ooze_explosion_init();
|
||||
new spell_rotface_unstable_ooze_explosion();
|
||||
new spell_rotface_unstable_ooze_explosion_suicide();
|
||||
new spell_rotface_vile_gas_trigger();
|
||||
}
|
||||
|
||||
@@ -183,12 +183,14 @@ enum CreaturesIds
|
||||
// Festergut
|
||||
NPC_FESTERGUT = 36626,
|
||||
NPC_GAS_DUMMY = 36659,
|
||||
NPC_MALLEABLE_OOZE_STALKER = 38556,
|
||||
|
||||
// Rotface
|
||||
NPC_ROTFACE = 36627,
|
||||
NPC_OOZE_SPRAY_STALKER = 37986,
|
||||
NPC_PUDDLE_STALKER = 37013,
|
||||
NPC_UNSTABLE_EXPLOSION_STALKER = 38107,
|
||||
NPC_VILE_GAS_STALKER = 38548,
|
||||
|
||||
// Professor Putricide
|
||||
NPC_PROFESSOR_PUTRICIDE = 36678,
|
||||
|
||||
Reference in New Issue
Block a user