Scripts/Spells: Fix shaman Earthquake (#27620)

Co-authored-by: Shauren <shauren.trinity@gmail.com>
This commit is contained in:
Robingad
2022-01-27 23:18:46 +02:00
committed by GitHub
parent 2b7545378a
commit 3e725e1d25
4 changed files with 102 additions and 1 deletions

View File

@@ -0,0 +1,10 @@
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_sha_earthquake_tick';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(77478, 'spell_sha_earthquake_tick'); -- Earthquake
UPDATE `areatrigger_create_properties` SET `ScriptName`='areatrigger_sha_earthquake' WHERE `Id`=3691;
DELETE FROM `spell_proc` WHERE `SpellId` IN (273221);
INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES
(273221,0x00,11,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x0,0x0,0x0,0,0,0,0); -- Aftershock

View File

@@ -607,6 +607,7 @@ class TC_GAME_API Spell
CurrentSpellTypes GetCurrentContainer() const;
WorldObject* GetCaster() const { return m_caster; }
ObjectGuid GetOriginalCasterGUID() const { return m_originalCasterGUID; }
Unit* GetOriginalCaster() const { return m_originalCaster; }
SpellInfo const* GetSpellInfo() const { return m_spellInfo; }
Difficulty GetCastDifficulty() const;

View File

@@ -4655,6 +4655,12 @@ void SpellMgr::LoadSpellInfoCorrections()
});
});
// Earthquake
ApplySpellFix({ 61882 }, [](SpellInfo* spellInfo)
{
spellInfo->NegativeEffects[EFFECT_2] = true;
});
for (SpellInfo const& s : mSpellInfoMap)
{
SpellInfo* spellInfo = &const_cast<SpellInfo&>(s);

View File

@@ -45,6 +45,9 @@ enum ShamanSpells
SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_ENERGIZE = 218558,
SPELL_SHAMAN_CHAINED_HEAL = 70809,
SPELL_SHAMAN_CRASH_LIGHTNING_CLEAVE = 187878,
SPELL_SHAMAN_EARTHQUAKE = 61882,
SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN = 77505,
SPELL_SHAMAN_EARTHQUAKE_TICK = 77478,
SPELL_SHAMAN_EARTH_SHIELD_HEAL = 204290,
SPELL_SHAMAN_EARTHEN_RAGE_PASSIVE = 170374,
SPELL_SHAMAN_EARTHEN_RAGE_PERIODIC = 170377,
@@ -55,8 +58,8 @@ enum ShamanSpells
SPELL_SHAMAN_ELEMENTAL_BLAST_ENERGIZE = 344645,
SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE = 173183,
SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY = 173184,
SPELL_SHAMAN_ELEMENTAL_MASTERY = 16166,
SPELL_SHAMAN_ELEMENTAL_BLAST_OVERLOAD = 120588,
SPELL_SHAMAN_ELEMENTAL_MASTERY = 16166,
SPELL_SHAMAN_ENERGY_SURGE = 40465,
SPELL_SHAMAN_EXHAUSTION = 57723,
SPELL_SHAMAN_FLAME_SHOCK = 8050,
@@ -456,6 +459,85 @@ class spell_sha_earthen_rage_proc_aura : public AuraScript
}
};
// 61882 - Earthquake
// 8382 - AreaTriggerId
struct areatrigger_sha_earthquake : AreaTriggerAI
{
areatrigger_sha_earthquake(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger), _refreshTimer(0s), _period(1s) { }
void OnCreate() override
{
if (Unit* caster = at->GetCaster())
if (AuraEffect const* earthquake = caster->GetAuraEffect(SPELL_SHAMAN_EARTHQUAKE, EFFECT_1))
_period = Milliseconds(earthquake->GetPeriod());
}
void OnUpdate(uint32 diff) override
{
_refreshTimer -= Milliseconds(diff);
while (_refreshTimer <= 0s)
{
if (Unit* caster = at->GetCaster())
caster->CastSpell(at->GetPosition(), SPELL_SHAMAN_EARTHQUAKE_TICK, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
.SetOriginalCaster(at->GetGUID()));
_refreshTimer += _period;
}
}
// Each target can only be stunned once by each earthquake - keep track of who we already stunned
bool AddStunnedTarget(ObjectGuid const& guid)
{
return _stunnedUnits.insert(guid).second;
}
private:
Milliseconds _refreshTimer;
Milliseconds _period;
GuidUnorderedSet _stunnedUnits;
};
// 77478 - Earthquake tick
class spell_sha_earthquake_tick : public SpellScript
{
PrepareSpellScript(spell_sha_earthquake_tick);
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN }) && spellInfo->GetEffects().size() > EFFECT_1;
}
void HandleDamageCalc(SpellEffIndex /*effIndex*/)
{
SetEffectValue(GetCaster()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE) * 0.391f);
}
void HandleOnHit()
{
if (Unit* target = GetHitUnit())
{
if (roll_chance_i(GetEffectInfo(EFFECT_1).CalcValue()))
{
std::vector<AreaTrigger*> areaTriggers = GetCaster()->GetAreaTriggers(SPELL_SHAMAN_EARTHQUAKE);
auto itr = std::find_if(areaTriggers.begin(), areaTriggers.end(), [&](AreaTrigger const* at)
{
return at->GetGUID() == GetSpell()->GetOriginalCasterGUID();
});
if (itr != areaTriggers.end())
if (areatrigger_sha_earthquake* eq = CAST_AI(areatrigger_sha_earthquake, (*itr)->AI()))
if (eq->AddStunnedTarget(target->GetGUID()))
GetCaster()->CastSpell(target, SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN, true);
}
}
}
void Register() override
{
OnEffectLaunchTarget += SpellEffectFn(spell_sha_earthquake_tick::HandleDamageCalc, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
OnHit += SpellHitFn(spell_sha_earthquake_tick::HandleOnHit);
}
};
// 117014 - Elemental Blast
// 120588 - Elemental Blast Overload
class spell_sha_elemental_blast : public SpellScript
@@ -1606,6 +1688,8 @@ void AddSC_shaman_spell_scripts()
RegisterAuraScript(spell_sha_earth_shield);
RegisterAuraScript(spell_sha_earthen_rage_passive);
RegisterAuraScript(spell_sha_earthen_rage_proc_aura);
RegisterAreaTriggerAI(areatrigger_sha_earthquake);
RegisterSpellScript(spell_sha_earthquake_tick);
RegisterSpellScript(spell_sha_elemental_blast);
RegisterSpellScript(spell_sha_flametongue_weapon);
RegisterAuraScript(spell_sha_flametongue_weapon_aura);