Scripts/Icecrown Citaldel: Fixed spells cast by Professor Putricide during heroic Festergut and Rotface encounters

Closes #7641
Closes #8243
This commit is contained in:
Shauren
2013-08-30 23:00:43 +02:00
parent 157eb82ab1
commit 16eefd18fa
6 changed files with 129 additions and 28 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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();
}

View File

@@ -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,