From edafd0a270d5b92457a385d3608e2a9b808e0e46 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 4 Mar 2022 17:35:08 -0500 Subject: [PATCH] Scripts/Spells: Fix shaman Earthquake Port From (https://github.com/TrinityCore/TrinityCore/commit/3e725e1d2521547ea651ef2b4e01c980c9b5ff3e) --- Source/Game/Spells/Spell.cs | 27 ++++------ Source/Game/Spells/SpellManager.cs | 6 +++ Source/Scripts/Spells/Shaman.cs | 86 ++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 17 deletions(-) diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 6e517e8cf..bf39d0d5b 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -2002,7 +2002,7 @@ namespace Game.Spells { return m_UniqueCorpseTargetInfo.Count(targetInfo => (targetInfo.EffectMask & (1u << (int)effect)) != 0); } - + public SpellMissInfo PreprocessSpellHit(Unit unit, TargetInfo hitInfo) { if (unit == null) @@ -7685,22 +7685,15 @@ namespace Game.Spells return m_delayMoment; } - public WorldObject GetCaster() - { - return m_caster; - } - public Unit GetOriginalCaster() - { - return m_originalCaster; - } - public SpellInfo GetSpellInfo() - { - return m_spellInfo; - } - public List GetPowerCost() - { - return m_powerCost; - } + public WorldObject GetCaster() { return m_caster; } + + public ObjectGuid GetOriginalCasterGUID() { return m_originalCasterGUID; } + + public Unit GetOriginalCaster() { return m_originalCaster; } + + public SpellInfo GetSpellInfo() { return m_spellInfo; } + + public List GetPowerCost() { return m_powerCost; } bool IsDelayableNoMore() { diff --git a/Source/Game/Spells/SpellManager.cs b/Source/Game/Spells/SpellManager.cs index 84953fc2d..7d010aafc 100644 --- a/Source/Game/Spells/SpellManager.cs +++ b/Source/Game/Spells/SpellManager.cs @@ -4338,6 +4338,12 @@ namespace Game.Entities }); }); + // Earthquake + ApplySpellFix(new [] { 61882 }, spellInfo => + { + spellInfo.NegativeEffects[2] = true; + }); + foreach (var spellInfo in mSpellInfoMap.Values) { // Fix range for trajectory triggered spell diff --git a/Source/Scripts/Spells/Shaman.cs b/Source/Scripts/Spells/Shaman.cs index 5155f16a5..4ea4c6eae 100644 --- a/Source/Scripts/Spells/Shaman.cs +++ b/Source/Scripts/Spells/Shaman.cs @@ -441,6 +441,92 @@ namespace Scripts.Spells.Shaman } } + // 61882 - Earthquake + [Script] // 8382 - AreaTriggerId + class areatrigger_sha_earthquake : AreaTriggerAI + { + TimeSpan _refreshTimer; + TimeSpan _period; + HashSet _stunnedUnits = new(); + + public areatrigger_sha_earthquake(AreaTrigger areatrigger) : base(areatrigger) + { + _refreshTimer = TimeSpan.Zero; + _period = TimeSpan.FromSeconds(1); + } + + public override void OnCreate() + { + Unit caster = at.GetCaster(); + if (caster != null) + { + AuraEffect earthquake = caster.GetAuraEffect(SpellIds.Earthquake, 1); + if (earthquake != null) + _period = TimeSpan.FromMilliseconds(earthquake.GetPeriod()); + } + } + + public override void OnUpdate(uint diff) + { + _refreshTimer -= TimeSpan.FromMilliseconds(diff); + while (_refreshTimer <= TimeSpan.Zero) + { + Unit caster = at.GetCaster(); + if (caster != null) + caster.CastSpell(at.GetPosition(), SpellIds.EarthquakeTick, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCaster(at.GetGUID())); + + _refreshTimer += _period; + } + } + + // Each target can only be stunned once by each earthquake - keep track of who we already stunned + public bool AddStunnedTarget(ObjectGuid guid) + { + return _stunnedUnits.Add(guid); + } + } + + [Script] // 77478 - Earthquake tick + class spell_sha_earthquake_tick : SpellScript + { + public override bool Validate(SpellInfo spellInfo) + { + return ValidateSpellInfo(SpellIds.EarthquakeKnockingDown) && spellInfo.GetEffects().Count > 1; + } + + void HandleDamageCalc(uint effIndex) + { + SetEffectValue((int)(GetCaster().SpellBaseDamageBonusDone(SpellSchoolMask.Nature) * 0.391f)); + } + + void HandleOnHit() + { + Unit target = GetHitUnit(); + if (target != null) + { + if (RandomHelper.randChance(GetEffectInfo(1).CalcValue())) + { + var areaTriggers = GetCaster().GetAreaTriggers(SpellIds.Earthquake); + var foundAreaTrigger = areaTriggers.Find(at => at.GetGUID() == GetSpell().GetOriginalCasterGUID()); + if (foundAreaTrigger != null) + { + areatrigger_sha_earthquake eq = foundAreaTrigger.GetAI(); + if (eq != null) + if (eq.AddStunnedTarget(target.GetGUID())) + GetCaster().CastSpell(target, SpellIds.EarthquakeKnockingDown, true); + } + } + } + } + + public override void Register() + { + OnEffectLaunchTarget.Add(new EffectHandler(HandleDamageCalc, 0, SpellEffectName.SchoolDamage)); + OnHit.Add(new HitHandler(HandleOnHit)); + } + } + // 117014 - Elemental Blast [Script] // 120588 - Elemental Blast Overload class spell_sha_elemental_blast : SpellScript