From 727e0100a191d17092c81eb7fc305a228a5c3299 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sun, 3 Oct 2021 13:55:43 -0400 Subject: [PATCH] Core/Spells: Send OriginalCastId in SMSG_SPELL_START and SMSG_SPELL_GO for triggered spells in 'game' project Port From (https://github.com/TrinityCore/TrinityCore/commit/555b2d40ecc22eb0ea4bf913b534ffa7197fa6fe) --- .../Game/Entities/AreaTrigger/AreaTrigger.cs | 3 +- Source/Game/Entities/Object/ObjectGuid.cs | 6 +- Source/Game/Entities/Object/WorldObject.cs | 2 +- Source/Game/Entities/StatSystem.cs | 4 +- Source/Game/Entities/Unit/Unit.Combat.cs | 4 +- Source/Game/Entities/Unit/Unit.Spells.cs | 4 +- Source/Game/Entities/Unit/Unit.cs | 2 +- Source/Game/Spells/Auras/Aura.cs | 21 ++-- Source/Game/Spells/Auras/AuraEffect.cs | 27 +++-- Source/Game/Spells/Spell.cs | 41 +++++-- Source/Game/Spells/SpellEffects.cs | 113 +++++++++++------- Source/Scripts/Spells/Warlock.cs | 2 +- 12 files changed, 139 insertions(+), 90 deletions(-) diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index 4b3991b2a..a84900d00 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -642,7 +642,8 @@ namespace Game.Entities switch (action.ActionType) { case AreaTriggerActionTypes.Cast: - caster.CastSpell(unit, action.Param, true); + caster.CastSpell(unit, action.Param, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_areaTriggerData.CreatingEffectGUID._value.IsCast() ? m_areaTriggerData.CreatingEffectGUID : ObjectGuid.Empty)); break; case AreaTriggerActionTypes.AddAura: caster.AddAura(action.Param, unit); diff --git a/Source/Game/Entities/Object/ObjectGuid.cs b/Source/Game/Entities/Object/ObjectGuid.cs index 61880fd6a..dd52d77b7 100644 --- a/Source/Game/Entities/Object/ObjectGuid.cs +++ b/Source/Game/Entities/Object/ObjectGuid.cs @@ -160,9 +160,9 @@ namespace Game.Entities public bool IsAnyTypeGameObject() { return IsGameObject() || IsMOTransport(); } public bool IsParty() { return GetHigh() == HighGuid.Party; } public bool IsGuild() { return GetHigh() == HighGuid.Guild; } - bool IsSceneObject() { return GetHigh() == HighGuid.SceneObject; } - bool IsConversation() { return GetHigh() == HighGuid.Conversation; } - bool IsCast() { return GetHigh() == HighGuid.Cast; } + public bool IsSceneObject() { return GetHigh() == HighGuid.SceneObject; } + public bool IsConversation() { return GetHigh() == HighGuid.Conversation; } + public bool IsCast() { return GetHigh() == HighGuid.Cast; } public TypeId GetTypeId() { return GetTypeId(GetHigh()); } bool HasEntry() { return HasEntry(GetHigh()); } diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index c92a52b98..bc5e3ab51 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -2248,7 +2248,7 @@ namespace Game.Entities return; } - Spell spell = new Spell(this, info, args.TriggerFlags, args.OriginalCaster); + Spell spell = new Spell(this, info, args.TriggerFlags, args.OriginalCaster, args.OriginalCastId); foreach (var pair in args.SpellValueOverrides) spell.SetSpellValue(pair.Key, pair.Value); diff --git a/Source/Game/Entities/StatSystem.cs b/Source/Game/Entities/StatSystem.cs index cbdba4468..38b274d9b 100644 --- a/Source/Game/Entities/StatSystem.cs +++ b/Source/Game/Entities/StatSystem.cs @@ -706,9 +706,7 @@ namespace Game.Entities break; } - CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); - args.TriggeringAura = effect; - CastSpell(this, triggerSpell, args); + CastSpell(this, triggerSpell, new CastSpellExtraArgs(effect)); } } } diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index c2e92ace2..367fe9353 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -570,9 +570,7 @@ namespace Game.Entities } else { - CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); - args.TriggeringAura = meleeAttackAuraEffect; - CastSpell(victim, meleeAttackSpellId, args); + CastSpell(victim, meleeAttackSpellId, new CastSpellExtraArgs(meleeAttackAuraEffect)); HitInfo hitInfo = HitInfo.AffectsVictim | HitInfo.NoAnimation; if (attType == WeaponAttackType.OffAttack) diff --git a/Source/Game/Entities/Unit/Unit.Spells.cs b/Source/Game/Entities/Unit/Unit.Spells.cs index cd0305be9..89f5f744c 100644 --- a/Source/Game/Entities/Unit/Unit.Spells.cs +++ b/Source/Game/Entities/Unit/Unit.Spells.cs @@ -2920,7 +2920,7 @@ namespace Game.Entities if (aura.IsSingleTarget()) aura.UnregisterSingleTarget(); - AuraCreateInfo createInfo = new(aura.GetCastGUID(), aura.GetSpellInfo(), aura.GetCastDifficulty(), effMask, stealer); + AuraCreateInfo createInfo = new(aura.GetCastId(), aura.GetSpellInfo(), aura.GetCastDifficulty(), effMask, stealer); createInfo.SetCasterGUID(aura.GetCasterGUID()); createInfo.SetBaseAmount(baseDamage); @@ -3903,7 +3903,7 @@ namespace Game.Entities { Unit caster = aura.GetCaster(); if (caster && caster.IsTypeId(TypeId.Player)) - Spell.SendCastResult(caster.ToPlayer(), aura.GetSpellInfo(), aura.GetSpellVisual(), aura.GetCastGUID(), SpellCastResult.AuraBounced); + Spell.SendCastResult(caster.ToPlayer(), aura.GetSpellInfo(), aura.GetSpellVisual(), aura.GetCastId(), SpellCastResult.AuraBounced); } aura.Remove(); diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index c106478a1..7c1b8e2f8 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -3401,7 +3401,7 @@ namespace Game.Entities uint split_absorb = 0; DealDamageMods(damageInfo.GetAttacker(), caster, ref splitDamage, ref split_absorb); - SpellNonMeleeDamage log = new(damageInfo.GetAttacker(), caster, itr.GetSpellInfo(), itr.GetBase().GetSpellVisual(), damageInfo.GetSchoolMask(), itr.GetBase().GetCastGUID()); + SpellNonMeleeDamage log = new(damageInfo.GetAttacker(), caster, itr.GetSpellInfo(), itr.GetBase().GetSpellVisual(), damageInfo.GetSchoolMask(), itr.GetBase().GetCastId()); CleanDamage cleanDamage = new(splitDamage, 0, WeaponAttackType.BaseAttack, MeleeHitOutcome.Normal); DealDamage(damageInfo.GetAttacker(), caster, splitDamage, cleanDamage, DamageEffectType.Direct, damageInfo.GetSchoolMask(), itr.GetSpellInfo(), false); log.damage = splitDamage; diff --git a/Source/Game/Spells/Auras/Aura.cs b/Source/Game/Spells/Auras/Aura.cs index 73d677170..8e00c2ce5 100644 --- a/Source/Game/Spells/Auras/Aura.cs +++ b/Source/Game/Spells/Auras/Aura.cs @@ -242,7 +242,7 @@ namespace Game.Spells Aura aura = GetBase(); AuraDataInfo auraData = auraInfo.AuraData.Value; - auraData.CastID = aura.GetCastGUID(); + auraData.CastID = aura.GetCastId(); auraData.SpellID = (int)aura.GetId(); auraData.Visual= aura.GetSpellVisual(); auraData.Flags = GetFlags(); @@ -329,7 +329,7 @@ namespace Game.Spells { m_spellInfo = createInfo._spellInfo; m_castDifficulty = createInfo._castDifficulty; - m_castGuid = createInfo._castId; + m_castId = createInfo._castId; m_casterGuid = createInfo.CasterGUID; m_castItemGuid = createInfo.CastItemGUID; m_castItemId = createInfo.CastItemId; @@ -1212,7 +1212,7 @@ namespace Game.Spells else if (spellArea.flags.HasAnyFlag(SpellAreaFlag.AutoCast)) { if (!target.HasAura(spellArea.spellId)) - target.CastSpell(target, spellArea.spellId, new CastSpellExtraArgs(true)); + target.CastSpell(target, spellArea.spellId, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(GetCastId())); } } } @@ -1246,7 +1246,9 @@ namespace Game.Spells if (spell < 0) target.RemoveAurasDueToSpell((uint)-spell); else if (removeMode != AuraRemoveMode.Death) - target.CastSpell(target, (uint)spell, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(GetCasterGUID())); + target.CastSpell(target, (uint)spell, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCaster(GetCasterGUID()) + .SetOriginalCastId(GetCastId())); } } spellTriggered = Global.SpellMgr.GetSpellLinked((int)GetId() + (int)SpellLinkedType.Aura); @@ -1294,11 +1296,11 @@ namespace Game.Spells break; case 33572: // Gronn Lord's Grasp, becomes stoned if (GetStackAmount() >= 5 && !target.HasAura(33652)) - target.CastSpell(target, 33652, new CastSpellExtraArgs(true)); + target.CastSpell(target, 33652, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(GetCastId())); break; case 50836: //Petrifying Grip, becomes stoned if (GetStackAmount() >= 5 && !target.HasAura(50812)) - target.CastSpell(target, 50812, new CastSpellExtraArgs(true)); + target.CastSpell(target, 50812, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(GetCastId())); break; case 60970: // Heroic Fury (remove Intercept cooldown) if (target.IsTypeId(TypeId.Player)) @@ -1371,6 +1373,7 @@ namespace Game.Spells { float multiplier = aurEff.GetAmount(); CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); + args.SetOriginalCastId(GetCastId()); args.AddSpellMod(SpellValueMod.BasePoint0, MathFunctions.CalculatePct(caster.GetMaxPower(PowerType.Mana), multiplier)); caster.CastSpell(caster, 47755, args); } @@ -1433,7 +1436,7 @@ namespace Game.Spells if (target.HasAura(70755)) { if (apply) - target.CastSpell(target, 71166, new CastSpellExtraArgs(true)); + target.CastSpell(target, 71166, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(GetCastId())); else target.RemoveAurasDueToSpell(71166); } @@ -2280,7 +2283,7 @@ namespace Game.Spells public SpellInfo GetSpellInfo() { return m_spellInfo; } public uint GetId() { return m_spellInfo.Id; } public Difficulty GetCastDifficulty() { return m_castDifficulty; } - public ObjectGuid GetCastGUID() { return m_castGuid; } + public ObjectGuid GetCastId() { return m_castId; } public ObjectGuid GetCasterGUID() { return m_casterGuid; } public ObjectGuid GetCastItemGUID() { return m_castItemGuid; } public uint GetCastItemId() { return m_castItemId; } @@ -2553,7 +2556,7 @@ namespace Game.Spells List m_loadedScripts = new(); SpellInfo m_spellInfo; Difficulty m_castDifficulty; - ObjectGuid m_castGuid; + ObjectGuid m_castId; ObjectGuid m_casterGuid; ObjectGuid m_castItemGuid; uint m_castItemId; diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index 8f77a69c2..de055362b 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -2117,7 +2117,7 @@ namespace Game.Spells { var mountCapability = CliDB.MountCapabilityStorage.LookupByKey(GetAmount()); if (mountCapability != null) - target.CastSpell(target, mountCapability.ModSpellAuraID, new CastSpellExtraArgs(true)); + target.CastSpell(target, mountCapability.ModSpellAuraID, new CastSpellExtraArgs(this)); } } else @@ -4270,14 +4270,14 @@ namespace Game.Spells break; case 91604: // Restricted Flight Area if (aurApp.GetRemoveMode() == AuraRemoveMode.Expire) - target.CastSpell(target, 58601, new CastSpellExtraArgs(true)); + target.CastSpell(target, 58601, new CastSpellExtraArgs(this)); break; } break; case SpellFamilyNames.Deathknight: // Summon Gargoyle (Dismiss Gargoyle at remove) if (GetId() == 61777) - target.CastSpell(target, (uint)GetAmount(), new CastSpellExtraArgs(true)); + target.CastSpell(target, (uint)GetAmount(), new CastSpellExtraArgs(this)); break; default: break; @@ -4309,7 +4309,8 @@ namespace Game.Spells CastSpellExtraArgs args = new(); args.TriggerFlags = TriggerCastFlags.FullMask; args.OriginalCaster = GetCasterGUID(); - args.CastDifficulty = spell.Difficulty; + args.OriginalCastId = GetBase().GetCastId(); + args.CastDifficulty = GetBase().GetCastDifficulty(); for (uint i = 0; i < spell.StackAmount; ++i) caster.CastSpell(target, spell.Id, args); @@ -4327,7 +4328,8 @@ namespace Game.Spells SpellInfo spell = Global.SpellMgr.GetSpellInfo(spellId, GetBase().GetCastDifficulty()); CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); args.OriginalCaster = GetCasterGUID(); - args.CastDifficulty = spell.Difficulty; + args.OriginalCastId = GetBase().GetCastId(); + args.CastDifficulty = GetBase().GetCastDifficulty(); for (uint i = 0; i < spell.StackAmount; ++i) caster.CastSpell(target, spell.Id, args); @@ -4383,7 +4385,7 @@ namespace Game.Spells target.PlayDirectSound(14970, target.ToPlayer()); // continue in 58205 else - target.CastSpell(target, 58205, new CastSpellExtraArgs(true)); + target.CastSpell(target, 58205, new CastSpellExtraArgs(this)); } break; // LK Intro VO (2) @@ -4645,7 +4647,7 @@ namespace Game.Spells break; } - target.CastSpell(target, triggerSpell, new CastSpellExtraArgs(true)); + target.CastSpell(target, triggerSpell, new CastSpellExtraArgs(this)); } [AuraEffectHandler(AuraType.TriggerSpellOnPowerAmount)] @@ -4674,7 +4676,7 @@ namespace Game.Spells break; } - target.CastSpell(target, triggerSpell, new CastSpellExtraArgs(true)); + target.CastSpell(target, triggerSpell, new CastSpellExtraArgs(this)); } [AuraEffectHandler(AuraType.OpenStable)] @@ -5066,7 +5068,7 @@ namespace Game.Spells uint resist = damageInfo.GetResist(); // SendSpellNonMeleeDamageLog expects non-absorbed/non-resisted damage - SpellNonMeleeDamage log = new(caster, target, GetSpellInfo(), GetBase().GetSpellVisual(), GetSpellInfo().GetSchoolMask(), GetBase().GetCastGUID()); + SpellNonMeleeDamage log = new(caster, target, GetSpellInfo(), GetBase().GetSpellVisual(), GetSpellInfo().GetSchoolMask(), GetBase().GetCastId()); log.damage = damage; log.originalDamage = (uint)dmg; log.absorb = absorb; @@ -5338,7 +5340,7 @@ namespace Game.Spells SpellInfo spellProto = GetSpellInfo(); // maybe has to be sent different to client, but not by SMSG_PERIODICAURALOG - SpellNonMeleeDamage damageInfo = new(caster, target, spellProto, GetBase().GetSpellVisual(), spellProto.SchoolMask, GetBase().GetCastGUID()); + SpellNonMeleeDamage damageInfo = new(caster, target, spellProto, GetBase().GetSpellVisual(), spellProto.SchoolMask, GetBase().GetCastId()); // no SpellDamageBonus for burn mana caster.CalculateSpellDamageTaken(damageInfo, (int)(gain * dmgMultiplier), spellProto); @@ -5438,7 +5440,7 @@ namespace Game.Spells return; } - SpellNonMeleeDamage damageInfo = new(target, triggerTarget, GetSpellInfo(), GetBase().GetSpellVisual(), GetSpellInfo().SchoolMask, GetBase().GetCastGUID()); + SpellNonMeleeDamage damageInfo = new(target, triggerTarget, GetSpellInfo(), GetBase().GetSpellVisual(), GetSpellInfo().SchoolMask, GetBase().GetCastId()); int damage = (int)target.SpellDamageBonusDone(triggerTarget, GetSpellInfo(), (uint)GetAmount(), DamageEffectType.SpellDirect, GetSpellEffectInfo()); damage = (int)triggerTarget.SpellDamageBonusTaken(target, GetSpellInfo(), (uint)damage, DamageEffectType.SpellDirect); target.CalculateSpellDamageTaken(damageInfo, damage, GetSpellInfo()); @@ -5615,8 +5617,7 @@ namespace Game.Spells // on apply cast summon spell if (apply) { - CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); - args.TriggeringAura = this; + CastSpellExtraArgs args = new(this); args.CastDifficulty = triggerSpellInfo.Difficulty; target.CastSpell(target, triggerSpellInfo.Id, args); } diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 74f5d8377..ca2908ee8 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -36,13 +36,14 @@ namespace Game.Spells { public partial class Spell : IDisposable { - public Spell(WorldObject caster, SpellInfo info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID = default) + public Spell(WorldObject caster, SpellInfo info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID = default, ObjectGuid originalCastId = default) { m_spellInfo = info; m_caster = (info.HasAttribute(SpellAttr6.CastByCharmer) && caster.GetCharmerOrOwner() != null ? caster.GetCharmerOrOwner() : caster); m_spellValue = new SpellValue(m_spellInfo, caster); m_castItemLevel = -1; m_castId = ObjectGuid.Create(HighGuid.Cast, SpellCastSource.Normal, m_caster.GetMapId(), m_spellInfo.Id, m_caster.GetMap().GenerateLowGuid(HighGuid.Cast)); + m_originalCastId = originalCastId; m_SpellVisual.SpellXSpellVisualID = caster.GetCastSpellXSpellVisualId(m_spellInfo); m_customError = SpellCustomErrors.None; @@ -2106,7 +2107,9 @@ namespace Game.Spells { if (CanExecuteTriggersOnHit(effMask, hit.triggeredByAura) && RandomHelper.randChance(hit.chance)) { - m_caster.CastSpell(unit, hit.triggeredSpell.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetCastDifficulty(hit.triggeredSpell.Difficulty)); + m_caster.CastSpell(unit, hit.triggeredSpell.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_castId) + .SetCastDifficulty(hit.triggeredSpell.Difficulty)); Log.outDebug(LogFilter.Spells, "Spell {0} triggered spell {1} by SPELL_AURA_ADD_TARGET_TRIGGER aura", m_spellInfo.Id, hit.triggeredSpell.Id); // SPELL_AURA_ADD_TARGET_TRIGGER auras shouldn't trigger auras without duration @@ -2139,7 +2142,7 @@ namespace Game.Spells if (id < 0) unit.RemoveAurasDueToSpell((uint)-id); else - unit.CastSpell(unit, (uint)id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(m_caster.GetGUID())); + unit.CastSpell(unit, (uint)id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(m_caster.GetGUID()).SetOriginalCastId(m_castId)); } } } @@ -2727,7 +2730,7 @@ namespace Game.Spells unitCaster.RemoveAurasDueToSpell((uint)-spellId); } else - m_caster.CastSpell(m_targets.GetUnitTarget() ?? m_caster, (uint)spellId, new CastSpellExtraArgs(true)); + m_caster.CastSpell(m_targets.GetUnitTarget() ?? m_caster, (uint)spellId, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); } } @@ -5027,7 +5030,11 @@ namespace Game.Spells { Pet pet = unitCaster.ToPlayer().GetPet(); if (pet != null) - pet.CastSpell(pet, 32752, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(pet.GetGUID())); + { + pet.CastSpell(pet, 32752, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCaster(pet.GetGUID()) + .SetOriginalCastId(m_castId)); + } } } else if (!m_spellInfo.HasAttribute(SpellAttr1.DismissPet)) @@ -6058,7 +6065,7 @@ namespace Game.Spells return SpellCastResult.DontReport; } else if (m_spellInfo.GetEffects().Count > 1) - player.CastSpell(m_caster, (uint)m_spellInfo.GetEffect(1).CalcValue(), new CastSpellExtraArgs(false)); // move this to anywhere + player.CastSpell(m_caster, (uint)m_spellInfo.GetEffect(1).CalcValue(), new CastSpellExtraArgs().SetOriginalCastId(m_castId)); // move this to anywhere return SpellCastResult.DontReport; } } @@ -7389,7 +7396,7 @@ namespace Game.Spells public bool m_fromClient; public SpellCastFlagsEx m_castFlagsEx; public SpellMisc m_misc; - public Networking.Packets.SpellCastVisual m_SpellVisual; + public SpellCastVisual m_SpellVisual; public SpellCastTargets m_targets; public sbyte m_comboPointGain; public SpellCustomErrors m_customError; @@ -7947,7 +7954,7 @@ namespace Game.Spells // Check for SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER if (MissCondition == SpellMissInfo.None && spell.m_spellInfo.HasAttribute(SpellAttr7.InterruptOnlyNonplayer) && !unit.IsPlayer()) - caster.CastSpell(unit, 32747, true); + caster.CastSpell(unit, 32747, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(spell.m_castId)); if (_spellHitTarget) { @@ -8481,9 +8488,11 @@ namespace Game.Spells public AuraEffect TriggeringAura; public ObjectGuid OriginalCaster = ObjectGuid.Empty; public Difficulty CastDifficulty; + public ObjectGuid OriginalCastId = ObjectGuid.Empty; public Dictionary SpellValueOverrides = new(); public CastSpellExtraArgs() { } + public CastSpellExtraArgs(bool triggered) { TriggerFlags = triggered ? TriggerCastFlags.FullMask : TriggerCastFlags.None; @@ -8503,7 +8512,7 @@ namespace Game.Spells public CastSpellExtraArgs(AuraEffect eff) { TriggerFlags = TriggerCastFlags.FullMask; - TriggeringAura = eff; + SetTriggeringAura(eff); } public CastSpellExtraArgs(Difficulty castDifficulty) @@ -8521,26 +8530,40 @@ namespace Game.Spells TriggerFlags = flag; return this; } + public CastSpellExtraArgs SetCastItem(Item item) { CastItem = item; return this; } + public CastSpellExtraArgs SetTriggeringAura(AuraEffect triggeringAura) { TriggeringAura = triggeringAura; + if (triggeringAura != null) + OriginalCastId = triggeringAura.GetBase().GetCastId(); + return this; } + public CastSpellExtraArgs SetOriginalCaster(ObjectGuid guid) { OriginalCaster = guid; return this; } + public CastSpellExtraArgs SetCastDifficulty(Difficulty castDifficulty) { CastDifficulty = castDifficulty; return this; } + + public CastSpellExtraArgs SetOriginalCastId(ObjectGuid castId) + { + OriginalCastId = castId; + return this; + } + public CastSpellExtraArgs AddSpellMod(SpellValueMod mod, int val) { SpellValueOverrides.Add(mod, val); diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index eaa23badb..bb8a3511a 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -289,7 +289,7 @@ namespace Game.Spells unitTarget.RemoveAurasByType(AuraType.ModStun); // Cast Lesser Invisibility - unitTarget.CastSpell(unitTarget, 7870, true); + unitTarget.CastSpell(unitTarget, 7870, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; } // Brittle Armor - (need add max stack of 24575 Brittle Armor) @@ -301,7 +301,7 @@ namespace Game.Spells return; for (uint j = 0; j < spell.StackAmount; ++j) - m_caster.CastSpell(unitTarget, spell.Id, true); + m_caster.CastSpell(unitTarget, spell.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; } // Mercurial Shield - (need add max stack of 26464 Mercurial Shield) @@ -313,7 +313,7 @@ namespace Game.Spells return; for (uint j = 0; j < spell.StackAmount; ++j) - m_caster.CastSpell(unitTarget, spell.Id, true); + m_caster.CastSpell(unitTarget, spell.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; } } @@ -361,6 +361,7 @@ namespace Game.Spells CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); args.SetOriginalCaster(m_originalCasterGUID); + args.SetOriginalCastId(m_castId); // set basepoints for trigger with value effect if (effectInfo.Effect == SpellEffectName.TriggerSpellWithValue) for (int i = 0; i < SpellConst.MaxEffects; ++i) @@ -416,6 +417,7 @@ namespace Game.Spells CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); args.SetOriginalCaster(m_originalCasterGUID); + args.SetOriginalCastId(m_castId); // set basepoints for trigger with value effect if (effectInfo.Effect == SpellEffectName.TriggerMissileSpellWithValue) for (int i = 0; i < SpellConst.MaxEffects; ++i) @@ -459,6 +461,7 @@ namespace Game.Spells { CastSpellExtraArgs args1 = new(TriggerCastFlags.FullMask); args1.SetOriginalCaster(m_originalCasterGUID); + args1.SetOriginalCastId(m_castId); args1.AddSpellMod(SpellValueMod.BasePoint0, damage); unitTarget.CastSpell(unitTarget, spellInfo.Id, args1); return; @@ -469,11 +472,14 @@ namespace Game.Spells switch (spellInfo.Id) { case 72298: // Malleable Goo Summon - unitTarget.CastSpell(unitTarget, spellInfo.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(m_originalCasterGUID)); + unitTarget.CastSpell(unitTarget, spellInfo.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCaster(m_originalCasterGUID) + .SetOriginalCastId(m_castId)); return; } CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); + args.SetOriginalCastId(m_castId); // set basepoints for trigger with value effect if (effectInfo.Effect == SpellEffectName.ForceCastWithValue) for (int i = 0; i < SpellConst.MaxEffects; ++i) @@ -498,7 +504,7 @@ namespace Game.Spells Finish(); - m_caster.CastSpell((Unit)null, spellInfo.Id, new CastSpellExtraArgs(false)); + m_caster.CastSpell((Unit)null, spellInfo.Id, new CastSpellExtraArgs().SetOriginalCastId(m_castId)); } void CalculateJumpSpeeds(SpellEffectInfo effInfo, float dist, out float speedXY, out float speedZ) @@ -611,9 +617,9 @@ namespace Game.Spells if (r >= 70) // 7/12 success { if (r < 100) // 4/12 evil twin - m_caster.CastSpell(m_caster, 23445, true); + m_caster.CastSpell(m_caster, 23445, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); else // 1/12 fire - m_caster.CastSpell(m_caster, 23449, true); + m_caster.CastSpell(m_caster, 23449, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); } return; } @@ -627,36 +633,44 @@ namespace Game.Spells { case 1: // soul split - evil - m_caster.CastSpell(m_caster, 36900, true); + m_caster.CastSpell(m_caster, 36900, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_castId)); break; case 2: // soul split - good - m_caster.CastSpell(m_caster, 36901, true); + m_caster.CastSpell(m_caster, 36901, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_castId)); break; case 3: // Increase the size - m_caster.CastSpell(m_caster, 36895, true); + m_caster.CastSpell(m_caster, 36895, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_castId)); break; case 4: // Decrease the size - m_caster.CastSpell(m_caster, 36893, true); + m_caster.CastSpell(m_caster, 36893, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_castId)); break; case 5: // Transform { if (m_caster.ToPlayer().GetTeam() == Team.Alliance) - m_caster.CastSpell(m_caster, 36897, true); + m_caster.CastSpell(m_caster, 36897, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_castId)); else - m_caster.CastSpell(m_caster, 36899, true); + m_caster.CastSpell(m_caster, 36899, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_castId)); break; } case 6: // chicken - m_caster.CastSpell(m_caster, 36940, true); + m_caster.CastSpell(m_caster, 36940, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_castId)); break; case 7: // evil twin - m_caster.CastSpell(m_caster, 23445, true); + m_caster.CastSpell(m_caster, 23445, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCastId(m_castId)); break; } } @@ -672,23 +686,23 @@ namespace Game.Spells { case 1: // soul split - evil - m_caster.CastSpell(m_caster, 36900, true); + m_caster.CastSpell(m_caster, 36900, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); break; case 2: // soul split - good - m_caster.CastSpell(m_caster, 36901, true); + m_caster.CastSpell(m_caster, 36901, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); break; case 3: // Increase the size - m_caster.CastSpell(m_caster, 36895, true); + m_caster.CastSpell(m_caster, 36895, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); break; case 4: // Transform { if (m_caster.ToPlayer().GetTeam() == Team.Alliance) - m_caster.CastSpell(m_caster, 36897, true); + m_caster.CastSpell(m_caster, 36897, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); else - m_caster.CastSpell(m_caster, 36899, true); + m_caster.CastSpell(m_caster, 36899, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); break; } } @@ -1761,6 +1775,7 @@ namespace Game.Spells } CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); + args.SetOriginalCastId(m_castId); // if we have small value, it indicates seat position if (basePoints > 0 && basePoints < SharedConst.MaxVehicleSeats) @@ -2744,7 +2759,7 @@ namespace Game.Spells uint spell_id = RandomHelper.Rand32(20) != 0 ? 8854u : 8855u; - m_caster.CastSpell(m_caster, spell_id, new CastSpellExtraArgs(true)); + m_caster.CastSpell(m_caster, spell_id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; } // Brittle Armor - need remove one 24575 Brittle Armor aura @@ -2778,7 +2793,7 @@ namespace Game.Spells return; // Shadow Flame - m_caster.CastSpell(unitTarget, 22682, new CastSpellExtraArgs(true)); + m_caster.CastSpell(unitTarget, 22682, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; } // Mirren's Drinking Hat @@ -2850,7 +2865,7 @@ namespace Game.Spells if (m_caster.ToPlayer().GetItemByPos(bag, slot).GetCount() == 1) m_caster.ToPlayer().RemoveItem(bag, slot, true); else m_caster.ToPlayer().GetItemByPos(bag, slot).SetCount(m_caster.ToPlayer().GetItemByPos(bag, slot).GetCount() - 1); // Spell 42518 (Braufest - Gratisprobe des Braufest herstellen) - m_caster.CastSpell(m_caster, 42518, new CastSpellExtraArgs(true)); + m_caster.CastSpell(m_caster, 42518, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; } break; @@ -2862,7 +2877,7 @@ namespace Game.Spells //Workaround for Range ... should be global for every ScriptEffect float radius = effectInfo.CalcRadius(); if (unitTarget != null && unitTarget.IsTypeId(TypeId.Player) && unitTarget.GetDistance(m_caster) >= radius && !unitTarget.HasAura(46394) && unitTarget != m_caster) - unitTarget.CastSpell(unitTarget, 46394, new CastSpellExtraArgs(true)); + unitTarget.CastSpell(unitTarget, 46394, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); break; } @@ -2880,7 +2895,7 @@ namespace Game.Spells case 2: spellId = 46738; break; case 3: spellId = 46736; break; } - unitTarget.CastSpell(unitTarget, spellId, new CastSpellExtraArgs(true)); + unitTarget.CastSpell(unitTarget, spellId, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); break; } // 5, 000 Gold @@ -2925,7 +2940,7 @@ namespace Game.Spells default: return; } - unitTarget.CastSpell(unitTarget, iTmpSpellId, new CastSpellExtraArgs(true)); + unitTarget.CastSpell(unitTarget, iTmpSpellId, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); Creature npc = unitTarget.ToCreature(); npc.LoadEquipment(); return; @@ -2947,9 +2962,9 @@ namespace Game.Spells if (unitTarget == null) return; if (unitTarget.HasAura(51845)) - unitTarget.CastSpell(m_caster, 51856, new CastSpellExtraArgs(true)); + unitTarget.CastSpell(m_caster, 51856, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); else - m_caster.CastSpell(unitTarget, 51855, new CastSpellExtraArgs(true)); + m_caster.CastSpell(unitTarget, 51855, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); break; } // Summon Ghouls On Scarlet Crusade @@ -2963,7 +2978,7 @@ namespace Game.Spells for (byte i = 0; i < 15; ++i) { m_caster.GetRandomPoint(destTarget, radius, out x, out y, out z); - m_caster.CastSpell(new Position(x, y, z), 54522, new CastSpellExtraArgs(true)); + m_caster.CastSpell(new Position(x, y, z), 54522, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); } break; } @@ -2974,11 +2989,11 @@ namespace Game.Spells return; case 52479: // Gift of the Harvester if (unitTarget != null && unitCaster != null) - unitCaster.CastSpell(unitTarget, Convert.ToBoolean(RandomHelper.IRand(0, 1)) ? (uint)damage : 52505, new CastSpellExtraArgs(true)); + unitCaster.CastSpell(unitTarget, Convert.ToBoolean(RandomHelper.IRand(0, 1)) ? (uint)damage : 52505, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; case 53110: // Devour Humanoid if (unitTarget != null) - unitTarget.CastSpell(m_caster, (uint)damage, new CastSpellExtraArgs(true)); + unitTarget.CastSpell(m_caster, (uint)damage, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; case 57347: // Retrieving (Wintergrasp RP-GG pickup spell) { @@ -3009,7 +3024,7 @@ namespace Game.Spells uint questID = (uint)m_spellInfo.GetEffect(1).CalcValue(); if (unitTarget.ToPlayer().GetQuestStatus(questID) == QuestStatus.Complete) - unitTarget.CastSpell(unitTarget, spellID, new CastSpellExtraArgs(true)); + unitTarget.CastSpell(unitTarget, spellID, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; } @@ -3041,10 +3056,10 @@ namespace Game.Spells // return from top if (unitTarget.ToPlayer().GetAreaId() == 4637) - unitTarget.CastSpell(unitTarget, 59316, new CastSpellExtraArgs(true)); + unitTarget.CastSpell(unitTarget, 59316, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); // teleport atop else - unitTarget.CastSpell(unitTarget, 59314, new CastSpellExtraArgs(true)); + unitTarget.CastSpell(unitTarget, 59314, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); return; } @@ -3062,8 +3077,8 @@ namespace Game.Spells if (parent != null) { // @todo a hack, range = 11, should after some time cast, otherwise too far - unitCaster.CastSpell(parent, 62496, new CastSpellExtraArgs(true)); - unitTarget.CastSpell(parent, (uint)damage); // DIFFICULTY_NONE, so effect always valid + unitCaster.CastSpell(parent, 62496, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + unitTarget.CastSpell(parent, (uint)damage, new CastSpellExtraArgs().SetOriginalCastId(m_castId)); // DIFFICULTY_NONE, so effect always valid } } } @@ -3093,7 +3108,9 @@ namespace Game.Spells Aura chargesAura = m_caster.ToCreature().GetAura(59907); if (chargesAura != null) { - m_caster.CastSpell(unitTarget, spell_heal, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(m_caster.ToCreature().ToTempSummon().GetSummonerGUID())); + m_caster.CastSpell(unitTarget, spell_heal, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCaster(m_caster.ToCreature().ToTempSummon().GetSummonerGUID()) + .SetOriginalCastId(m_castId)); if (chargesAura.ModCharges(-1)) m_caster.ToCreature().ToTempSummon().UnSummon(); } @@ -3122,6 +3139,7 @@ namespace Game.Spells if (totem != null && totem.IsTotem()) { CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); + args.SetOriginalCastId(m_castId); args.AddSpellMod(SpellValueMod.BasePoint0, damage); m_caster.CastSpell(totem, 55277, args); } @@ -3154,8 +3172,8 @@ namespace Game.Spells 45683 // Polymorph }; - m_caster.CastSpell(m_caster, spellPlayer[RandomHelper.IRand(0, 4)], true); - unitTarget.CastSpell(unitTarget, spellTarget[RandomHelper.IRand(0, 4)], true); + m_caster.CastSpell(m_caster, spellPlayer[RandomHelper.IRand(0, 4)], new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + unitTarget.CastSpell(unitTarget, spellTarget[RandomHelper.IRand(0, 4)], new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); break; } } @@ -3400,7 +3418,7 @@ namespace Game.Spells GlyphPropertiesRecord glyphProperties = CliDB.GlyphPropertiesStorage.LookupByKey(glyphId); if (glyphProperties != null) - player.CastSpell(player, glyphProperties.SpellID, true); + player.CastSpell(player, glyphProperties.SpellID, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); ActiveGlyphs activeGlyphs = new(); activeGlyphs.Glyphs.Add(new GlyphBinding(m_misc.SpellId, (ushort)glyphId)); @@ -3489,7 +3507,7 @@ namespace Game.Spells { currentDrunk = 100; if (RandomHelper.randChance() < 25.0f) - player.CastSpell(player, 67468, false); // Drunken Vomit + player.CastSpell(player, 67468, new CastSpellExtraArgs().SetOriginalCastId(m_castId)); // Drunken Vomit } else currentDrunk += (byte)drunkMod; @@ -3536,6 +3554,7 @@ namespace Game.Spells // @todo fix crash when a spell has two effects, both pointed at the same item target CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); + args.SetOriginalCastId(m_castId); args.AddSpellMod(SpellValueMod.BasePoint0, pct); m_caster.CastSpell(pet, effectInfo.TriggerSpell, args); } @@ -3922,7 +3941,9 @@ namespace Game.Spells unitCaster.Attack(unitTarget, true); if (effectInfo.TriggerSpell != 0) - m_caster.CastSpell(unitTarget, effectInfo.TriggerSpell, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(m_originalCasterGUID)); + m_caster.CastSpell(unitTarget, effectInfo.TriggerSpell, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCaster(m_originalCasterGUID) + .SetOriginalCastId(m_castId)); } } @@ -3950,7 +3971,9 @@ namespace Game.Spells else if (effectHandleMode == SpellEffectHandleMode.Hit) { if (effectInfo.TriggerSpell != 0) - m_caster.CastSpell(destTarget, effectInfo.TriggerSpell, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(m_originalCasterGUID)); + m_caster.CastSpell(destTarget, effectInfo.TriggerSpell, new CastSpellExtraArgs(TriggerCastFlags.FullMask) + .SetOriginalCaster(m_originalCasterGUID) + .SetOriginalCastId(m_castId)); } } @@ -4235,6 +4258,7 @@ namespace Game.Spells if (mana != 0) { CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); + args.SetOriginalCastId(m_castId); args.AddSpellMod(SpellValueMod.BasePoint0, mana); unitCaster.CastSpell(m_caster, 39104, args); } @@ -5043,6 +5067,7 @@ namespace Game.Spells continue; CastSpellExtraArgs args = new(TriggerCastFlags.IgnoreGCD | TriggerCastFlags.IgnoreCastInProgress | TriggerCastFlags.CastDirectly | TriggerCastFlags.DontReportCastError); + args.OriginalCastId = m_castId; args.CastDifficulty = GetCastDifficulty(); m_caster.CastSpell(m_caster, spellInfo.Id, args); } @@ -5131,7 +5156,7 @@ namespace Game.Spells if (!m_caster.IsTypeId(TypeId.Player) || unitTarget == null || !unitTarget.IsTypeId(TypeId.Player)) return; - m_caster.CastSpell(unitTarget, effectInfo.TriggerSpell, true); + m_caster.CastSpell(unitTarget, effectInfo.TriggerSpell, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); } [SpellEffectHandler(SpellEffectName.UnlockGuildVaultTab)] diff --git a/Source/Scripts/Spells/Warlock.cs b/Source/Scripts/Spells/Warlock.cs index 2a5a2ca39..9ffef416a 100644 --- a/Source/Scripts/Spells/Warlock.cs +++ b/Source/Scripts/Spells/Warlock.cs @@ -278,7 +278,7 @@ namespace Scripts.Spells.Warlock if (modOwner) modOwner.ApplySpellMod(GetSpellInfo(), SpellModOp.PowerCost0, ref damage); - SpellNonMeleeDamage damageInfo = new SpellNonMeleeDamage(caster, caster, GetSpellInfo(), GetAura().GetSpellVisual(), GetSpellInfo().SchoolMask, GetAura().GetCastGUID()); + SpellNonMeleeDamage damageInfo = new SpellNonMeleeDamage(caster, caster, GetSpellInfo(), GetAura().GetSpellVisual(), GetSpellInfo().SchoolMask, GetAura().GetCastId()); damageInfo.periodicLog = true; damageInfo.damage = damage; caster.DealSpellDamage(damageInfo, false);