From ee098676c2e3a0529155c16bd34caf14f5a1554f Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 14 Aug 2019 23:46:10 -0400 Subject: [PATCH] Core/Spells: Added SPELL_FAILED_NOTHING_TO_STEAL error Port TrinityCore Commit: https://github.com/TrinityCore/TrinityCore/commit/b711f0bcaef7e966140fce4929ff5196b6b2bbf6 --- Source/Game/Entities/Unit/Unit.Combat.cs | 5 ++- Source/Game/Entities/Unit/Unit.cs | 1 + Source/Game/Spells/Spell.cs | 42 +++++++++++++++++++++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index 01d6d03c8..90aa6f8d1 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -3052,8 +3052,7 @@ namespace Game.Entities // PvP case - can't attack when attacker or target are in sanctuary // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp - if (target.HasUnitFlag(UnitFlags.PvpAttackable) && HasUnitFlag(UnitFlags.PvpAttackable) - && (target.HasPvpFlag(UnitPVPStateFlags.Sanctuary) || HasPvpFlag(UnitPVPStateFlags.Sanctuary))) + if (target.HasUnitFlag(UnitFlags.PvpAttackable) && HasUnitFlag(UnitFlags.PvpAttackable) && (target.IsInSanctuary() || IsInSanctuary())) return false; // additional checks - only PvP case @@ -3148,7 +3147,7 @@ namespace Game.Entities return false; // can't assist player out of sanctuary from sanctuary if has pvp enabled if (target.HasPvpFlag(UnitPVPStateFlags.PvP)) - if (HasPvpFlag(UnitPVPStateFlags.Sanctuary) && !target.HasPvpFlag(UnitPVPStateFlags.Sanctuary)) + if (IsInSanctuary() && !target.IsInSanctuary()) return false; } } diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 4ed75e5cd..8063bcf71 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -2276,6 +2276,7 @@ namespace Game.Entities public void AddPvpFlag(UnitPVPStateFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PvpFlags), (byte)flags); } public void RemovePvpFlag(UnitPVPStateFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PvpFlags), (byte)flags); } public void SetPvpFlags(UnitPVPStateFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PvpFlags), (byte)flags); } + public bool IsInSanctuary() { return HasPvpFlag(UnitPVPStateFlags.Sanctuary); } public bool IsPvP() { return HasPvpFlag(UnitPVPStateFlags.PvP); } public bool IsFFAPvP() { return HasPvpFlag(UnitPVPStateFlags.FFAPvp); } diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 9ede814ca..38d21c5d3 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -4528,6 +4528,18 @@ namespace Game.Spells Unit unitTarget = m_targets.GetUnitTarget(); if (unitTarget != null) { + // do not allow to cast on hostile targets in sanctuary + if (!m_caster.IsFriendlyTo(unitTarget)) + { + if (m_caster.IsInSanctuary() || unitTarget.IsInSanctuary()) + { + // fix for duels + Player playerDuel = m_caster.ToPlayer(); + if (!playerDuel || playerDuel.duel == null || unitTarget != playerDuel.duel.opponent) + return SpellCastResult.NothingToDispel; + } + } + castResult = m_spellInfo.CheckTarget(m_caster, unitTarget, m_caster.GetEntry() == SharedConst.WorldTrigger); // skip stealth checks for GO casts if (castResult != SpellCastResult.SpellCastOk) return castResult; @@ -5109,8 +5121,29 @@ namespace Game.Spells } case SpellEffectName.StealBeneficialBuff: { - if (m_targets.GetUnitTarget() == m_caster) + if (m_targets.GetUnitTarget() == null || m_targets.GetUnitTarget() == m_caster) return SpellCastResult.BadTargets; + + uint dispelMask = SpellInfo.GetDispelMask((DispelType)effect.MiscValue); + bool hasStealableAura = false; + foreach (AuraApplication visibleAura in m_targets.GetUnitTarget().GetVisibleAuras()) + { + if (!visibleAura.IsPositive()) + continue; + + Aura aura = visibleAura.GetBase(); + if (!aura.GetSpellInfo().GetDispelMask().HasAnyFlag(dispelMask)) + continue; + + if (aura.IsPassive() || aura.GetSpellInfo().HasAttribute(SpellAttr4.NotStealable)) + continue; + + hasStealableAura = true; + break; + } + + if (!hasStealableAura) + return SpellCastResult.NothingToSteal; break; } case SpellEffectName.LeapBack: @@ -5124,6 +5157,13 @@ namespace Game.Spells } break; } + case SpellEffectName.Jump: + case SpellEffectName.JumpDest: + { + if (m_caster.HasUnitState(UnitState.Root)) + return SpellCastResult.Rooted; + break; + } case SpellEffectName.TalentSpecSelect: { ChrSpecializationRecord spec = CliDB.ChrSpecializationStorage.LookupByKey(m_misc.SpecializationId);