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
|
// 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
|
// 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)
|
if (target.HasUnitFlag(UnitFlags.PvpAttackable) && HasUnitFlag(UnitFlags.PvpAttackable) && (target.IsInSanctuary() || IsInSanctuary()))
|
||||||
&& (target.HasPvpFlag(UnitPVPStateFlags.Sanctuary) || HasPvpFlag(UnitPVPStateFlags.Sanctuary)))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// additional checks - only PvP case
|
// additional checks - only PvP case
|
||||||
@@ -3148,7 +3147,7 @@ namespace Game.Entities
|
|||||||
return false;
|
return false;
|
||||||
// can't assist player out of sanctuary from sanctuary if has pvp enabled
|
// can't assist player out of sanctuary from sanctuary if has pvp enabled
|
||||||
if (target.HasPvpFlag(UnitPVPStateFlags.PvP))
|
if (target.HasPvpFlag(UnitPVPStateFlags.PvP))
|
||||||
if (HasPvpFlag(UnitPVPStateFlags.Sanctuary) && !target.HasPvpFlag(UnitPVPStateFlags.Sanctuary))
|
if (IsInSanctuary() && !target.IsInSanctuary())
|
||||||
return false;
|
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 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 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 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 IsPvP() { return HasPvpFlag(UnitPVPStateFlags.PvP); }
|
||||||
public bool IsFFAPvP() { return HasPvpFlag(UnitPVPStateFlags.FFAPvp); }
|
public bool IsFFAPvP() { return HasPvpFlag(UnitPVPStateFlags.FFAPvp); }
|
||||||
|
|
||||||
|
|||||||
@@ -4528,6 +4528,18 @@ namespace Game.Spells
|
|||||||
Unit unitTarget = m_targets.GetUnitTarget();
|
Unit unitTarget = m_targets.GetUnitTarget();
|
||||||
if (unitTarget != null)
|
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
|
castResult = m_spellInfo.CheckTarget(m_caster, unitTarget, m_caster.GetEntry() == SharedConst.WorldTrigger); // skip stealth checks for GO casts
|
||||||
if (castResult != SpellCastResult.SpellCastOk)
|
if (castResult != SpellCastResult.SpellCastOk)
|
||||||
return castResult;
|
return castResult;
|
||||||
@@ -5109,8 +5121,29 @@ namespace Game.Spells
|
|||||||
}
|
}
|
||||||
case SpellEffectName.StealBeneficialBuff:
|
case SpellEffectName.StealBeneficialBuff:
|
||||||
{
|
{
|
||||||
if (m_targets.GetUnitTarget() == m_caster)
|
if (m_targets.GetUnitTarget() == null || m_targets.GetUnitTarget() == m_caster)
|
||||||
return SpellCastResult.BadTargets;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case SpellEffectName.LeapBack:
|
case SpellEffectName.LeapBack:
|
||||||
@@ -5124,6 +5157,13 @@ namespace Game.Spells
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case SpellEffectName.Jump:
|
||||||
|
case SpellEffectName.JumpDest:
|
||||||
|
{
|
||||||
|
if (m_caster.HasUnitState(UnitState.Root))
|
||||||
|
return SpellCastResult.Rooted;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case SpellEffectName.TalentSpecSelect:
|
case SpellEffectName.TalentSpecSelect:
|
||||||
{
|
{
|
||||||
ChrSpecializationRecord spec = CliDB.ChrSpecializationStorage.LookupByKey(m_misc.SpecializationId);
|
ChrSpecializationRecord spec = CliDB.ChrSpecializationStorage.LookupByKey(m_misc.SpecializationId);
|
||||||
|
|||||||
Reference in New Issue
Block a user