Merge pull request #257 from jellemeeus/fix(Naxx40)lvl60slimeandsteed

Naxx40: Construct, Plague, Military, trash adjustments
This commit is contained in:
ZhengPeiRu21
2024-04-30 12:56:02 -06:00
committed by GitHub
11 changed files with 592 additions and 49 deletions

View File

@@ -179,16 +179,21 @@ public:
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_BERSERK:
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_ENRAGE:
{
Talk(EMOTE_ENRAGE);
me->CastSpell(me, SPELL_ENRAGE, true);
int32 bp1 = 99; // Enrage melee haste
int32 bp2 = 49; // Enrage damage percent
me->CastCustomSpell(me, SPELL_ENRAGE, &bp1, &bp2, 0, true);
events.RepeatEvent(22000);
break;
}
case EVENT_MORTAL_WOUND:
me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
events.RepeatEvent(10000);

View File

@@ -26,12 +26,13 @@
enum Spells
{
SPELL_POISON_CLOUD = 28240,
SPELL_POISON_CLOUD_POISON_DAMAGE = 28241,
SPELL_MUTATING_INJECTION = 28169,
SPELL_MUTATING_EXPLOSION = 28206,
SPELL_SLIME_SPRAY = 28157,
SPELL_POISON_CLOUD_DAMAGE_AURA = 28158,
SPELL_BERSERK = 26662,
SPELL_BOMBARD_SLIME = 28280
SPELL_BOMBARD_SLIME = 90003 // update summon entry
};
enum Emotes
@@ -170,10 +171,13 @@ public:
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_SLIME_SPRAY:
{
Talk(EMOTE_SLIME);
me->CastSpell(me->GetVictim(), SPELL_SLIME_SPRAY, false);
int32 modifiedSlimeSprayDamage = urand(3200, 3400);
me->CastCustomSpell(me->GetVictim(), SPELL_SLIME_SPRAY, &modifiedSlimeSprayDamage, 0, 0, false);
events.RepeatEvent(20000);
break;
}
case EVENT_MUTATING_INJECTION:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true, true, -SPELL_MUTATING_INJECTION))
{
@@ -275,14 +279,16 @@ public:
}
};
class spell_grobbulus_mutating_injection : public SpellScriptLoader
// This will overwrite the declared 10 and 25 man mutating injection to handle all versions of the spell script
class spell_grobbulus_mutating_injection_40 : public SpellScriptLoader
{
public:
spell_grobbulus_mutating_injection() : SpellScriptLoader("spell_grobbulus_mutating_injection") { }
spell_grobbulus_mutating_injection_40() : SpellScriptLoader("spell_grobbulus_mutating_injection") { }
class spell_grobbulus_mutating_injection_AuraScript : public AuraScript
class spell_grobbulus_mutating_injection_40_AuraScript : public AuraScript
{
PrepareAuraScript(spell_grobbulus_mutating_injection_AuraScript);
PrepareAuraScript(spell_grobbulus_mutating_injection_40_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
@@ -297,7 +303,15 @@ class spell_grobbulus_mutating_injection : public SpellScriptLoader
case AURA_REMOVE_BY_EXPIRE:
if (auto caster = GetCaster())
{
caster->CastSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, true);
if (caster->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC)
{
int32 modifiedMutatingExplosionDamage = 2379;
caster->CastCustomSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, &modifiedMutatingExplosionDamage, 0, 0, true);
}
else
{
caster->CastSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, true);
}
}
break;
default:
@@ -307,13 +321,52 @@ class spell_grobbulus_mutating_injection : public SpellScriptLoader
void Register() override
{
AfterEffectRemove += AuraEffectRemoveFn(spell_grobbulus_mutating_injection_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_grobbulus_mutating_injection_40_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_grobbulus_mutating_injection_AuraScript();
return new spell_grobbulus_mutating_injection_40_AuraScript();
}
};
class spell_grobbulus_poison_cloud_poison_40 : public SpellScriptLoader
{
public:
spell_grobbulus_poison_cloud_poison_40() : SpellScriptLoader("spell_grobbulus_poison_cloud_poison_40") { }
class spell_grobbulus_poison_cloud_poison_40_AuraScript : public AuraScript
{
PrepareAuraScript(spell_grobbulus_poison_cloud_poison_40_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_POISON_CLOUD_POISON_DAMAGE }); // Poison trigger
}
void HandleTriggerSpell(AuraEffect const* /*aurEff*/)
{
Unit* caster = GetCaster();
if (!caster || (caster->GetMap()->GetDifficulty() != RAID_DIFFICULTY_10MAN_HEROIC))
{
return;
}
PreventDefaultAction();
int32 bp0 = 1109;
caster->CastCustomSpell(GetTarget(), SPELL_POISON_CLOUD_POISON_DAMAGE, &bp0, 0, 0, true);
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_grobbulus_poison_cloud_poison_40_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_grobbulus_poison_cloud_poison_40_AuraScript();
}
};
@@ -321,6 +374,7 @@ void AddSC_boss_grobbulus_40()
{
new boss_grobbulus_40();
new boss_grobbulus_poison_cloud_40();
// new spell_grobbulus_mutating_injection();
new spell_grobbulus_mutating_injection_40();
// new spell_grobbulus_poison();
new spell_grobbulus_poison_cloud_poison_40();
}

View File

@@ -18,6 +18,11 @@
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "SpellAuraEffects.h"
#include "SpellInfo.h"
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include "naxxramas.h"
enum Says
@@ -36,6 +41,7 @@ enum Spells
SPELL_SPELL_DISRUPTION = 29310,
SPELL_DECREPIT_FEVER = 29998,
SPELL_PLAGUE_CLOUD = 29350,
SPELL_PLAGUE_CLOUD_TRIGGER = 30122,
SPELL_TELEPORT_SELF = 30211
};
@@ -187,9 +193,12 @@ public:
events.RepeatEvent(10000);
break;
case EVENT_DECEPIT_FEVER:
me->CastSpell(me, SPELL_DECREPIT_FEVER, false);
{
int32 bp1 = 499;
me->CastCustomSpell(me, SPELL_DECREPIT_FEVER, 0, &bp1, 0, false, nullptr, nullptr, ObjectGuid::Empty);
events.RepeatEvent(urand(22000, 25000));
break;
}
case EVENT_PLAGUE_CLOUD:
me->CastSpell(me, SPELL_PLAGUE_CLOUD, false);
break;
@@ -245,7 +254,80 @@ public:
};
};
class spell_heigan_plague_cloud_40 : public SpellScriptLoader
{
public:
spell_heigan_plague_cloud_40() : SpellScriptLoader("spell_heigan_plague_cloud_40") { }
class spell_heigan_plague_cloud_40_AuraScript : public AuraScript
{
PrepareAuraScript(spell_heigan_plague_cloud_40_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_PLAGUE_CLOUD_TRIGGER });
}
void HandleTriggerSpell(AuraEffect const* /*aurEff*/)
{
Unit* caster = GetCaster();
if (!caster || (caster->GetMap()->GetDifficulty() != RAID_DIFFICULTY_10MAN_HEROIC))
{
return;
}
PreventDefaultAction();
int32 bp0 = 4000;
caster->CastCustomSpell(caster, SPELL_PLAGUE_CLOUD_TRIGGER, &bp0, 0, 0, true);
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_heigan_plague_cloud_40_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_heigan_plague_cloud_40_AuraScript();
}
};
class spell_heigan_eruption_40 : public SpellScriptLoader
{
public:
spell_heigan_eruption_40() : SpellScriptLoader("spell_heigan_eruption_40") { }
class spell_heigan_eruption_40_SpellScript : public SpellScript
{
PrepareSpellScript(spell_heigan_eruption_40_SpellScript);
void HandleDamageCalc(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
if (!caster || (caster->GetMap()->GetDifficulty() != RAID_DIFFICULTY_10MAN_HEROIC))
{
return;
}
uint32 damage = urand(3500, 4500);
SetHitDamage(damage);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_heigan_eruption_40_SpellScript::HandleDamageCalc, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_heigan_eruption_40_SpellScript();
}
};
void AddSC_boss_heigan_40()
{
new boss_heigan_40();
new spell_heigan_plague_cloud_40();
new spell_heigan_eruption_40();
}

View File

@@ -22,7 +22,7 @@
enum Spells
{
SPELL_NECROTIC_AURA = 55593,
SPELL_SUMMON_SPORE = 29234,
SPELL_SUMMON_SPORE = 90006,
SPELL_DEATHBLOOM = 29865,
SPELL_INEVITABLE_DOOM = 29204,
SPELL_BERSERK = 26662
@@ -159,14 +159,21 @@ public:
events.RepeatEvent(20000);
break;
case EVENT_DEATHBLOOM:
me->CastSpell(me, SPELL_DEATHBLOOM, false);
{
//me->CastSpell(me, SPELL_DEATHBLOOM, false);
int32 bp0 = 33; // TODO: Amplitude should be 6k, but is 1k. 200 dmg after 6 seconds
me->CastCustomSpell(me, SPELL_DEATHBLOOM, &bp0, 0, 0, false);
events.RepeatEvent(30000);
break;
}
case EVENT_INEVITABLE_DOOM:
me->CastSpell(me, SPELL_INEVITABLE_DOOM, false);
{
int32 bp0 = 2549;
me->CastCustomSpell(me, SPELL_INEVITABLE_DOOM, &bp0, 0, 0, false);
doomCounter++;
events.RepeatEvent(doomCounter < 6 ? 30000 : 15000);
break;
}
case EVENT_BERSERK:
me->CastSpell(me, SPELL_BERSERK, true);
break;

View File

@@ -17,6 +17,8 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
#include "naxxramas.h"
enum Says
@@ -35,6 +37,7 @@ enum Says
enum Spells
{
SPELL_CURSE_OF_THE_PLAGUEBRINGER = 29213,
SPELL_REVENGE_OF_THE_PLAGUEBRINGER = 29214,
SPELL_CRIPPLE = 29212,
SPELL_SUMMON_PLAGUED_WARRIORS = 29237,
SPELL_TELEPORT = 29216,
@@ -103,7 +106,7 @@ public:
me->SetControlled(false, UNIT_STATE_ROOT);
events.Reset();
events.ScheduleEvent(EVENT_MOVE_TO_BALCONY, 110000);
events.ScheduleEvent(EVENT_CURSE, 15000);
//events.ScheduleEvent(EVENT_CURSE, urand(50000, 60000)); // more curses, down from 150s to 50-60s
events.ScheduleEvent(EVENT_SUMMON_PLAGUED_WARRIOR_ANNOUNCE, 10000);
if (Is25ManRaid())
{
@@ -232,9 +235,9 @@ public:
case EVENT_CURSE:
if (events.GetPhaseMask() == 0)
{
me->CastCustomSpell(SPELL_CURSE_OF_THE_PLAGUEBRINGER, SPELLVALUE_MAX_TARGETS, 10, me, false);
me->CastCustomSpell(SPELL_CURSE_OF_THE_PLAGUEBRINGER, SPELLVALUE_MAX_TARGETS, 10, me, false); // TODO: Increase to 20 on 40man
}
events.RepeatEvent(25000);
events.RepeatEvent(25000); // 50-60 seconds in 40man
break;
case EVENT_SUMMON_PLAGUED_WARRIOR_ANNOUNCE:
Talk(SAY_SUMMON);
@@ -297,7 +300,51 @@ public:
};
};
class spell_gothik_curse_of_the_plaguebringer_40 : public SpellScriptLoader
{
public:
spell_gothik_curse_of_the_plaguebringer_40() : SpellScriptLoader("spell_gothik_curse_of_the_plaguebringer_40") { }
class spell_gothik_curse_of_the_plaguebringer_40_AuraScript : public AuraScript
{
PrepareAuraScript(spell_gothik_curse_of_the_plaguebringer_40_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_REVENGE_OF_THE_PLAGUEBRINGER }); // Revenge of the Plaguebringer
}
void HandleTriggerSpell(AuraEffect const* /*aurEff*/)
{
Unit* caster = GetCaster();
if (!caster || (caster->GetMap()->GetDifficulty() != RAID_DIFFICULTY_10MAN_HEROIC))
{
return;
}
PreventDefaultAction();
CustomSpellValues values;
int32 bp0 = 1757; // instant damage
int32 bp1 = 874; // periodic damage
values.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0);
values.AddSpellMod(SPELLVALUE_BASE_POINT1, bp1);
values.AddSpellMod(SPELLVALUE_RADIUS_MOD, 3500); // 35yd
GetTarget()->CastCustomSpell(SPELL_REVENGE_OF_THE_PLAGUEBRINGER, values, GetTarget(), TRIGGERED_NONE, nullptr, nullptr, GetCasterGUID());
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gothik_curse_of_the_plaguebringer_40_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_gothik_curse_of_the_plaguebringer_40_AuraScript();
}
};
void AddSC_boss_noth_40()
{
new boss_noth_40();
new spell_gothik_curse_of_the_plaguebringer_40();
}

View File

@@ -155,7 +155,8 @@ public:
}
if (finalTarget)
{
me->CastSpell(finalTarget, SPELL_HATEFUL_STRIKE, false);
int32 dmg = urand(22100,22850);
me->CastCustomSpell(finalTarget, SPELL_HATEFUL_STRIKE, &dmg, 0, 0, false);
}
events.RepeatEvent(1200);
break;

View File

@@ -135,9 +135,9 @@ public:
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_UNBALANCING_STRIKE, 20000);
events.ScheduleEvent(EVENT_UNBALANCING_STRIKE, 20000); // TODO: This can be 30 seconds to match vanilla
events.ScheduleEvent(EVENT_DISRUPTING_SHOUT, 15000);
events.ScheduleEvent(EVENT_JAGGED_KNIFE, 10000);
//events.ScheduleEvent(EVENT_JAGGED_KNIFE, 10000); // New wrath mechanic
summons.DoZoneInCombat();
}
@@ -157,9 +157,17 @@ public:
events.RepeatEvent(20000);
break;
case EVENT_DISRUPTING_SHOUT:
me->CastSpell(me, SPELL_DISRUPTING_SHOUT, false);
{
// TODO: Custom patch needed to implement power burn, or remove visual effect
// 45yd that ignores line of sight
CustomSpellValues values;
int32 customDisruptingShoutDamage = 2200; // some value as we ignore LoS without patch
values.AddSpellMod(SPELLVALUE_BASE_POINT0, customDisruptingShoutDamage);
values.AddSpellMod(SPELLVALUE_RADIUS_MOD, 4500); // 45yd
me->CastCustomSpell(SPELL_DISRUPTING_SHOUT, values, me, TRIGGERED_NONE, nullptr, nullptr, ObjectGuid::Empty);
events.RepeatEvent(15000);
break;
}
case EVENT_JAGGED_KNIFE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 45.0f))
{

View File

@@ -61,7 +61,7 @@ enum Spells
SPELL_STALAGG_CHAIN = 28096,
// Feugen
SPELL_STATIC_FIELD = 28135,
SPELL_STATIC_FIELD = 90041, // power burn 500
SPELL_FEUGEN_CHAIN = 28111,
// Thaddius
@@ -338,9 +338,15 @@ public:
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_THADDIUS_CHAIN_LIGHTNING:
me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false);
{
CustomSpellValues values;
int32 customChainLightningDamage = 1850; // (1850, 2150), die 675
values.AddSpellMod(SPELLVALUE_BASE_POINT0, customChainLightningDamage);
values.AddSpellMod(SPELLVALUE_MAX_TARGETS, 15);
me->CastCustomSpell(SPELL_CHAIN_LIGHTNING, values, me->GetVictim(), TRIGGERED_NONE, nullptr, nullptr, ObjectGuid::Empty);
events.RepeatEvent(15000);
break;
}
case EVENT_THADDIUS_POLARITY_SHIFT:
me->CastSpell(me, SPELL_POLARITY_SHIFT, false);
events.RepeatEvent(30000);
@@ -358,7 +364,8 @@ public:
{
if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat))
{
me->CastSpell(target, SPELL_BALL_LIGHTNING, false);
int32 customBallLightningDamage = 6000;
me->CastCustomSpell(target, SPELL_BALL_LIGHTNING, &customBallLightningDamage, 0, 0, false);
}
}
}
@@ -582,7 +589,8 @@ public:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 1000.f, true))
{
cr->CastStop(SPELL_TESLA_SHOCK);
cr->CastSpell(target, SPELL_TESLA_SHOCK, true);
int32 customTeslaShockDamage = 4374;
cr->CastCustomSpell(target, SPELL_TESLA_SHOCK, &customTeslaShockDamage, 0, 0, true);
}
events.RepeatEvent(1500);
break;
@@ -601,14 +609,15 @@ public:
};
};
class spell_thaddius_pos_neg_charge : public SpellScriptLoader
// This will overwrite the declared 10 and 25 man pos_neg_charge to handle all versions of the spell script
class spell_thaddius_pos_neg_charge_40 : public SpellScriptLoader
{
public:
spell_thaddius_pos_neg_charge() : SpellScriptLoader("spell_thaddius_pos_neg_charge") { }
spell_thaddius_pos_neg_charge_40() : SpellScriptLoader("spell_thaddius_pos_neg_charge") { }
class spell_thaddius_pos_neg_charge_SpellScript : public SpellScript
class spell_thaddius_pos_neg_charge_40_SpellScript : public SpellScript
{
PrepareSpellScript(spell_thaddius_pos_neg_charge_SpellScript);
PrepareSpellScript(spell_thaddius_pos_neg_charge_40_SpellScript);
void HandleTargets(std::list<WorldObject*>& targets)
{
@@ -651,18 +660,23 @@ public:
{
target->GetInstanceScript()->SetData(DATA_CHARGES_CROSSED, 0);
}
// Adjust damage to 2000 from 4500 for naxx40
if (target->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC)
{
SetHitDamage(2000);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_thaddius_pos_neg_charge_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_thaddius_pos_neg_charge_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
OnEffectHitTarget += SpellEffectFn(spell_thaddius_pos_neg_charge_40_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_thaddius_pos_neg_charge_40_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_thaddius_pos_neg_charge_SpellScript();
return new spell_thaddius_pos_neg_charge_40_SpellScript();
}
};
@@ -766,7 +780,7 @@ void AddSC_boss_thaddius_40()
new boss_thaddius_40();
new boss_thaddius_summon_40();
// new npc_tesla();
// new spell_thaddius_pos_neg_charge();
new spell_thaddius_pos_neg_charge_40();
// new spell_thaddius_polarity_shift();
// new at_thaddius_entrance();
}