diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index b7cedcd29..5b39664df 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -1044,9 +1044,9 @@ namespace Game.Entities public bool IsServerSide() { return _areaTriggerTemplate.Id.IsServerSide; } - public override bool IsNeverVisibleFor(WorldObject seer) + public override bool IsNeverVisibleFor(WorldObject seer, bool allowServersideObjects = false) { - return base.IsNeverVisibleFor(seer) || IsServerSide(); + return base.IsNeverVisibleFor(seer) || (IsServerSide() && !allowServersideObjects); } [System.Diagnostics.Conditional("DEBUG")] diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index 8222855c8..181e21a5e 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -1279,12 +1279,12 @@ namespace Game.Entities } } - public override bool IsNeverVisibleFor(WorldObject seer) + public override bool IsNeverVisibleFor(WorldObject seer, bool allowServersideObjects = false) { if (base.IsNeverVisibleFor(seer)) return true; - if (GetGoInfo().GetServerOnly() != 0) + if (GetGoInfo().GetServerOnly() != 0 && !allowServersideObjects) return true; if (GetDisplayId() == 0) diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 7c1c890eb..7327af21a 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -1159,12 +1159,12 @@ namespace Game.Entities public SmoothPhasing GetSmoothPhasing() { return _smoothPhasing; } - public bool CanSeeOrDetect(WorldObject obj, bool ignoreStealth = false, bool distanceCheck = false, bool checkAlert = false) + public bool CanSeeOrDetect(WorldObject obj, bool implicitDetect = false, bool distanceCheck = false, bool checkAlert = false) { if (this == obj) return true; - if (obj.IsNeverVisibleFor(this) || CanNeverSee(obj)) + if (obj.IsNeverVisibleFor(this, implicitDetect) || CanNeverSee(obj)) return false; if (obj.IsAlwaysVisibleFor(this) || CanAlwaysSee(obj)) @@ -1256,7 +1256,7 @@ namespace Game.Entities if (obj.IsInvisibleDueToDespawn(this)) return false; - if (!CanDetect(obj, ignoreStealth, checkAlert)) + if (!CanDetect(obj, implicitDetect, checkAlert)) return false; return true; @@ -1269,7 +1269,7 @@ namespace Game.Entities public virtual bool CanAlwaysSee(WorldObject obj) { return false; } - bool CanDetect(WorldObject obj, bool ignoreStealth, bool checkAlert = false) + bool CanDetect(WorldObject obj, bool implicitDetect, bool checkAlert = false) { WorldObject seer = this; @@ -1295,10 +1295,10 @@ namespace Game.Entities if (obj.IsAlwaysDetectableFor(seer)) return true; - if (!ignoreStealth && !seer.CanDetectInvisibilityOf(obj)) + if (!implicitDetect && !seer.CanDetectInvisibilityOf(obj)) return false; - if (!ignoreStealth && !seer.CanDetectStealthOf(obj, checkAlert)) + if (!implicitDetect && !seer.CanDetectStealthOf(obj, checkAlert)) return false; return true; @@ -3076,7 +3076,7 @@ namespace Game.Entities public virtual float GetCollisionHeight() { return 0.0f; } public float GetMidsectionHeight() { return GetCollisionHeight() / 2.0f; } - public virtual bool IsNeverVisibleFor(WorldObject seer) { return !IsInWorld || IsDestroyedObject(); } + public virtual bool IsNeverVisibleFor(WorldObject seer, bool allowServersideObjects = false) { return !IsInWorld || IsDestroyedObject(); } public virtual bool IsAlwaysVisibleFor(WorldObject seer) { return false; } public virtual bool IsInvisibleDueToDespawn(WorldObject seer) { return false; } public virtual bool IsAlwaysDetectableFor(WorldObject seer) { return false; } diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index ddb27baa5..e35d12df9 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -3648,9 +3648,9 @@ namespace Game.Entities return false; } - public override bool IsNeverVisibleFor(WorldObject seer) + public override bool IsNeverVisibleFor(WorldObject seer, bool allowServersideObjects = false) { - if (base.IsNeverVisibleFor(seer)) + if (base.IsNeverVisibleFor(seer, allowServersideObjects)) return true; if (GetSession().PlayerLogout() || GetSession().PlayerLoading()) diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index d94cc099e..d9baa90f9 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -993,7 +993,7 @@ namespace Game.Spells if (HasAttribute(SpellAttr1.ExcludeCaster) && caster == target) return SpellCastResult.BadTargets; - // check visibility - ignore stealth for implicit (area) targets + // check visibility - ignore invisibility/stealth for implicit (area) targets if (!HasAttribute(SpellAttr6.IgnorePhaseShift) && !caster.CanSeeOrDetect(target, Implicit)) return SpellCastResult.BadTargets;