diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index c8d763454..a69d4fb52 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -2323,6 +2323,9 @@ namespace Game.Entities spell.SetSpellValue(pair.Key, pair.Value); spell.m_CastItem = args.CastItem; + if (args.OriginalCastItemLevel.HasValue) + spell.m_castItemLevel = args.OriginalCastItemLevel.Value; + return spell.Prepare(targets.Targets, args.TriggeringAura); } diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 1b347e1d4..74857984e 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -5204,7 +5204,7 @@ namespace Game.Entities else if (apply) { CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); - args.CastItem = artifact; + args.SetCastItem(artifact); if (artifactPowerRank.AuraPointsOverride != 0) { foreach (var spellEffectInfo in spellInfo.GetEffects()) diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index 09743e325..8c8f9bf35 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -5491,7 +5491,7 @@ namespace Game.Spells if (triggeredSpellInfo != null) { Log.outDebug(LogFilter.Spells, $"AuraEffect.HandleProcTriggerSpellAuraProc: Triggering spell {triggeredSpellInfo.Id} from aura {GetId()} proc"); - triggerCaster.CastSpell(triggerTarget, triggeredSpellInfo.Id, new CastSpellExtraArgs(this)); + triggerCaster.CastSpell(triggerTarget, triggeredSpellInfo.Id, new CastSpellExtraArgs(this).SetTriggeringSpell(eventInfo.GetProcSpell())); } else if (triggerSpellId != 0 && GetAuraType() != AuraType.Dummy) Log.outError(LogFilter.Spells, $"AuraEffect.HandleProcTriggerSpellAuraProc: Spell {GetId()} has non-existent spell {triggerSpellId} in EffectTriggered[{GetEffIndex()}] and is therefore not triggered."); @@ -5513,6 +5513,7 @@ namespace Game.Spells if (triggeredSpellInfo != null) { CastSpellExtraArgs args = new(this); + args.SetTriggeringSpell(eventInfo.GetProcSpell()); args.AddSpellMod(SpellValueMod.BasePoint0, GetAmount()); triggerCaster.CastSpell(triggerTarget, triggerSpellId, args); Log.outDebug(LogFilter.Spells, "AuraEffect.HandleProcTriggerSpellWithValueAuraProc: Triggering spell {0} with value {1} from aura {2} proc", triggeredSpellInfo.Id, GetAmount(), GetId()); diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 395832ee9..8dc58757a 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -2234,7 +2234,7 @@ namespace Game.Spells if (CanExecuteTriggersOnHit(effMask, hit.triggeredByAura) && RandomHelper.randChance(hit.chance)) { m_caster.CastSpell(unit, hit.triggeredSpell.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask) - .SetOriginalCastId(m_castId) + .SetTriggeringSpell(this) .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); @@ -2268,7 +2268,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()).SetOriginalCastId(m_castId)); + unit.CastSpell(unit, (uint)id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(m_caster.GetGUID()).SetTriggeringSpell(this)); } } } @@ -2860,7 +2860,7 @@ namespace Game.Spells unitCaster.RemoveAurasDueToSpell((uint)-spellId); } else - m_caster.CastSpell(m_targets.GetUnitTarget() ?? m_caster, (uint)spellId, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + m_caster.CastSpell(m_targets.GetUnitTarget() ?? m_caster, (uint)spellId, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetTriggeringSpell(this)); } } @@ -5215,7 +5215,7 @@ namespace Game.Spells { pet.CastSpell(pet, 32752, new CastSpellExtraArgs(TriggerCastFlags.FullMask) .SetOriginalCaster(pet.GetGUID()) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); } } } @@ -6413,7 +6413,7 @@ namespace Game.Spells } else if (m_spellInfo.GetEffects().Count > 1) player.CastSpell(player, (uint)m_spellInfo.GetEffect(1).CalcValue(), new CastSpellExtraArgs() - .SetOriginalCastId(m_castId)); // move this to anywhere + .SetTriggeringSpell(this)); // move this to anywhere return SpellCastResult.DontReport; } } @@ -8371,7 +8371,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, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(spell.m_castId)); + caster.CastSpell(unit, 32747, new CastSpellExtraArgs(spell)); } if (_spellHitTarget) @@ -8997,6 +8997,7 @@ namespace Game.Spells public ObjectGuid OriginalCaster = ObjectGuid.Empty; public Difficulty CastDifficulty; public ObjectGuid OriginalCastId = ObjectGuid.Empty; + public int? OriginalCastItemLevel; public Dictionary SpellValueOverrides = new(); public CastSpellExtraArgs() { } @@ -9053,7 +9054,11 @@ namespace Game.Spells public CastSpellExtraArgs SetTriggeringSpell(Spell triggeringSpell) { - OriginalCastId = triggeringSpell.m_castId; + if (triggeringSpell != null) + { + OriginalCastItemLevel = triggeringSpell.m_castItemLevel; + OriginalCastId = triggeringSpell.m_castId; + } return this; } diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index 6e16ab936..0aaefb7fe 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -225,7 +225,7 @@ namespace Game.Spells unitTarget.RemoveAurasByType(AuraType.ModStun); // Cast Lesser Invisibility - unitTarget.CastSpell(unitTarget, 7870, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + unitTarget.CastSpell(unitTarget, 7870, new CastSpellExtraArgs(this)); return; } // Brittle Armor - (need add max stack of 24575 Brittle Armor) @@ -237,7 +237,7 @@ namespace Game.Spells return; for (uint j = 0; j < spell.StackAmount; ++j) - m_caster.CastSpell(unitTarget, spell.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + m_caster.CastSpell(unitTarget, spell.Id, new CastSpellExtraArgs(this)); return; } // Mercurial Shield - (need add max stack of 26464 Mercurial Shield) @@ -249,7 +249,7 @@ namespace Game.Spells return; for (uint j = 0; j < spell.StackAmount; ++j) - m_caster.CastSpell(unitTarget, spell.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + m_caster.CastSpell(unitTarget, spell.Id, new CastSpellExtraArgs(this)); return; } } @@ -307,7 +307,7 @@ namespace Game.Spells CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); args.SetOriginalCaster(m_originalCasterGUID); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); // set basepoints for trigger with value effect if (effectInfo.Effect == SpellEffectName.TriggerSpellWithValue) for (int i = 0; i < SpellConst.MaxEffects; ++i) @@ -371,7 +371,7 @@ namespace Game.Spells CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); args.SetOriginalCaster(m_originalCasterGUID); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); // set basepoints for trigger with value effect if (effectInfo.Effect == SpellEffectName.TriggerMissileSpellWithValue) for (int i = 0; i < SpellConst.MaxEffects; ++i) @@ -420,7 +420,7 @@ namespace Game.Spells { CastSpellExtraArgs args1 = new(TriggerCastFlags.FullMask); args1.SetOriginalCaster(m_originalCasterGUID); - args1.SetOriginalCastId(m_castId); + args1.SetTriggeringSpell(this); args1.AddSpellMod(SpellValueMod.BasePoint0, damage); unitTarget.CastSpell(unitTarget, spellInfo.Id, args1); return; @@ -433,12 +433,12 @@ namespace Game.Spells case 72298: // Malleable Goo Summon unitTarget.CastSpell(unitTarget, spellInfo.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask) .SetOriginalCaster(m_originalCasterGUID) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); return; } CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); // set basepoints for trigger with value effect if (effectInfo.Effect == SpellEffectName.ForceCastWithValue) for (int i = 0; i < SpellConst.MaxEffects; ++i) @@ -469,7 +469,7 @@ namespace Game.Spells Finish(); - m_caster.CastSpell((Unit)null, spellInfo.Id, new CastSpellExtraArgs().SetOriginalCastId(m_castId)); + m_caster.CastSpell((Unit)null, spellInfo.Id, new CastSpellExtraArgs().SetTriggeringSpell(this)); } void CalculateJumpSpeeds(SpellEffectInfo effInfo, float dist, out float speedXY, out float speedZ) @@ -1701,7 +1701,7 @@ namespace Game.Spells } CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); // if we have small value, it indicates seat position if (basePoints > 0 && basePoints < SharedConst.MaxVehicleSeats) @@ -2741,7 +2741,7 @@ namespace Game.Spells return; // Shadow Flame - m_caster.CastSpell(unitTarget, 22682, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + m_caster.CastSpell(unitTarget, 22682, new CastSpellExtraArgs(this)); return; } // Mug Transformation @@ -2772,7 +2772,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(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + m_caster.CastSpell(m_caster, 42518, new CastSpellExtraArgs(this)); return; } break; @@ -2784,7 +2784,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(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + unitTarget.CastSpell(unitTarget, 46394, new CastSpellExtraArgs(this)); break; } @@ -2805,7 +2805,7 @@ namespace Game.Spells float radius = effectInfo.CalcRadius(); for (byte i = 0; i < 15; ++i) - m_caster.CastSpell(m_caster.GetRandomPoint(destTarget, radius), 54522, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + m_caster.CastSpell(m_caster.GetRandomPoint(destTarget, radius), 54522, new CastSpellExtraArgs(this)); break; } case 52173: // Coyote Spirit Despawn @@ -2866,8 +2866,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(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); - unitTarget.CastSpell(parent, (uint)damage, new CastSpellExtraArgs().SetOriginalCastId(m_castId)); // DIFFICULTY_NONE, so effect always valid + unitCaster.CastSpell(parent, 62496, new CastSpellExtraArgs(this)); + unitTarget.CastSpell(parent, (uint)damage, new CastSpellExtraArgs().SetTriggeringSpell(this)); // DIFFICULTY_NONE, so effect always valid } } } @@ -3238,7 +3238,7 @@ namespace Game.Spells GlyphPropertiesRecord glyphProperties = CliDB.GlyphPropertiesStorage.LookupByKey(glyphId); if (glyphProperties != null) - player.CastSpell(player, glyphProperties.SpellID, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + player.CastSpell(player, glyphProperties.SpellID, new CastSpellExtraArgs(this)); ActiveGlyphs activeGlyphs = new(); activeGlyphs.Glyphs.Add(new GlyphBinding(m_misc.SpellId, (ushort)glyphId)); @@ -3327,7 +3327,7 @@ namespace Game.Spells { currentDrunk = 100; if (RandomHelper.randChance() < 25.0f) - player.CastSpell(player, 67468, new CastSpellExtraArgs().SetOriginalCastId(m_castId)); // Drunken Vomit + player.CastSpell(player, 67468, new CastSpellExtraArgs().SetTriggeringSpell(this)); // Drunken Vomit } else currentDrunk += (byte)drunkMod; @@ -3374,7 +3374,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.SetTriggeringSpell(this); args.AddSpellMod(SpellValueMod.BasePoint0, pct); m_caster.CastSpell(pet, effectInfo.TriggerSpell, args); } @@ -3774,7 +3774,7 @@ namespace Game.Spells if (effectInfo.TriggerSpell != 0) m_caster.CastSpell(unitTarget, effectInfo.TriggerSpell, new CastSpellExtraArgs(TriggerCastFlags.FullMask) .SetOriginalCaster(m_originalCasterGUID) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); } } @@ -3805,7 +3805,7 @@ namespace Game.Spells if (effectInfo.TriggerSpell != 0) m_caster.CastSpell(destTarget, effectInfo.TriggerSpell, new CastSpellExtraArgs(TriggerCastFlags.FullMask) .SetOriginalCaster(m_originalCasterGUID) - .SetOriginalCastId(m_castId)); + .SetTriggeringSpell(this)); } } @@ -4156,7 +4156,7 @@ namespace Game.Spells if (mana != 0) { CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); - args.SetOriginalCastId(m_castId); + args.SetTriggeringSpell(this); args.AddSpellMod(SpellValueMod.BasePoint0, mana); unitCaster.CastSpell(m_caster, 39104, args); } @@ -5064,7 +5064,7 @@ namespace Game.Spells if (!m_caster.IsTypeId(TypeId.Player) || unitTarget == null || !unitTarget.IsTypeId(TypeId.Player)) return; - m_caster.CastSpell(unitTarget, effectInfo.TriggerSpell, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCastId(m_castId)); + m_caster.CastSpell(unitTarget, effectInfo.TriggerSpell, new CastSpellExtraArgs(this)); } [SpellEffectHandler(SpellEffectName.UnlockGuildVaultTab)] diff --git a/Source/Scripts/Spells/Items.cs b/Source/Scripts/Spells/Items.cs index a301c3f58..8d550228e 100644 --- a/Source/Scripts/Spells/Items.cs +++ b/Source/Scripts/Spells/Items.cs @@ -1058,8 +1058,7 @@ namespace Scripts.Spells.Items Unit target = GetHitUnit(); uint spellId = RandomHelper.RAND(SpellIds.PersonalizedWeather1, SpellIds.PersonalizedWeather2, SpellIds.PersonalizedWeather3, SpellIds.PersonalizedWeather4); - target.CastSpell(target, spellId, new CastSpellExtraArgs(TriggerCastFlags.FullMask) - .SetOriginalCastId(GetSpell().m_castId)); + target.CastSpell(target, spellId, new CastSpellExtraArgs(GetSpell())); } public override void Register() @@ -3565,8 +3564,7 @@ namespace Scripts.Spells.Items } Unit caster = GetCaster(); - caster.CastSpell(caster, spellId, new CastSpellExtraArgs(TriggerCastFlags.FullMask) - .SetOriginalCastId(GetSpell().m_castId)); + caster.CastSpell(caster, spellId, new CastSpellExtraArgs(GetSpell())); } public override void Register() diff --git a/Source/Scripts/Spells/Quest.cs b/Source/Scripts/Spells/Quest.cs index 0ce67c9ad..18a8aab17 100644 --- a/Source/Scripts/Spells/Quest.cs +++ b/Source/Scripts/Spells/Quest.cs @@ -370,8 +370,7 @@ namespace Scripts.Spells.Quest return; uint spellId = RandomHelper.randChance(20) ? SpellIds.BendingShinbone1 : SpellIds.BendingShinbone2; - caster.CastSpell(caster, spellId, new CastSpellExtraArgs(TriggerCastFlags.FullMask) - .SetOriginalCastId(GetSpell().m_castId)); + caster.CastSpell(caster, spellId, new CastSpellExtraArgs(GetSpell())); } public override void Register()