Core/Spells: Added SPELL_FAILED_NOTHING_TO_STEAL error
Port TrinityCore Commit: https://github.com/TrinityCore/TrinityCore/commit/b711f0bcaef7e966140fce4929ff5196b6b2bbf6
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user