From 042c49385f6f3033981f05a6f8f33f73b48fbb7a Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 7 Oct 2021 17:52:08 +0100 Subject: [PATCH] mantis 7941: change llCollisionFilter code --- .../Framework/Scenes/SceneObjectPart.cs | 87 +++++++++++++------ .../Shared/Api/Implementation/LSL_Api.cs | 14 ++- 2 files changed, 66 insertions(+), 35 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 3149a6d9cf..1054fca419 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -232,7 +232,8 @@ namespace OpenSim.Region.Framework.Scenes [XmlIgnore] public int STATUS_ROTATE_Z; // this should not be used - private Dictionary m_CollisionFilter = new Dictionary(); + private int m_CollisionFilterType = 0; // -1 not in use, 0 accept false, 1 accept true + private string m_CollisionFilterString = string.Empty; /// /// The UUID of the user inventory item from which this object was rezzed if this is a root part. @@ -683,15 +684,6 @@ namespace OpenSim.Region.Framework.Scenes } } - public Dictionary CollisionFilter - { - get { return m_CollisionFilter; } - set - { - m_CollisionFilter = value; - } - } - protected bool APIDActive { get { return m_APIDActive; } @@ -2690,24 +2682,67 @@ namespace OpenSim.Region.Framework.Scenes { } + public void SetCollisionFilter(bool access, string name, string id) + { + if(string.IsNullOrEmpty(id)) + { + if (string.IsNullOrEmpty(name)) + { + m_CollisionFilterString = string.Empty; + m_CollisionFilterType = access ? 0 : -1; + } + else + { + m_CollisionFilterString = name; + m_CollisionFilterType = access ? 11 : 1; + } + } + else + { + if (string.IsNullOrEmpty(name)) + { + m_CollisionFilterString = id; + m_CollisionFilterType = access ? 12 : 2; + } + else + { + m_CollisionFilterString = name + id; + m_CollisionFilterType = access ? 13 : 3; + } + } + } + + public void ClearCollisionFilter() + { + m_CollisionFilterType = 0; + m_CollisionFilterString = string.Empty; + } + public bool CollisionFilteredOut(UUID objectID, string objectName) { - if(CollisionFilter.Count == 0) - return false; - - if (CollisionFilter.ContainsValue(objectID.ToString()) || - CollisionFilter.ContainsValue(objectID.ToString() + objectName) || - CollisionFilter.ContainsValue(UUID.Zero.ToString() + objectName)) + switch(m_CollisionFilterType) { - if (CollisionFilter.ContainsKey(1)) + case 0: // not set + return false; + case -1: // disable all + return true; + + case 1: // false by name + return m_CollisionFilterString.Equals(objectName, StringComparison.InvariantCultureIgnoreCase); + case 2: // false by id + return m_CollisionFilterString.Equals(objectID.ToString(), StringComparison.InvariantCultureIgnoreCase); + case 3: // false by name and id + return m_CollisionFilterString.Equals(objectName + objectID.ToString(), StringComparison.InvariantCultureIgnoreCase); + case 11: // true by name + return !m_CollisionFilterString.Equals(objectName, StringComparison.InvariantCultureIgnoreCase); + case 12: // true by id + return !m_CollisionFilterString.Equals(objectID.ToString(), StringComparison.InvariantCultureIgnoreCase); + case 13: // true by name and id + return !m_CollisionFilterString.Equals(objectName + objectID.ToString(), StringComparison.InvariantCultureIgnoreCase); + + default: return false; - return true; } - - if (CollisionFilter.ContainsKey(1)) - return true; - - return false; } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] @@ -3166,9 +3201,9 @@ namespace OpenSim.Region.Framework.Scenes minsize = ParentGroup.Scene.m_minPhys; maxsize = ParentGroup.Scene.m_maxPhys; } - scale.X = Util.Clamp(scale.X, minsize, maxsize); - scale.Y = Util.Clamp(scale.Y, minsize, maxsize); - scale.Z = Util.Clamp(scale.Z, minsize, maxsize); + scale.X = Utils.Clamp(scale.X, minsize, maxsize); + scale.Y = Utils.Clamp(scale.Y, minsize, maxsize); + scale.Z = Utils.Clamp(scale.Z, minsize, maxsize); } // m_log.DebugFormat("[SCENE OBJECT PART]: Resizing {0} {1} to {2}", Name, LocalId, scale); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ec5643662c..3cc4d143d8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -3698,15 +3698,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llCollisionFilter(LSL_String name, LSL_Key id, LSL_Integer accept) { - m_host.CollisionFilter.Clear(); - - if (!UUID.TryParse(id, out UUID objectID)) - return; - - if (objectID == UUID.Zero && name == "") - return; - - m_host.CollisionFilter.Add(accept, objectID.ToString() + name); + UUID.TryParse(id, out UUID objectID); + if(objectID == UUID.Zero) + m_host.SetCollisionFilter(accept != 0, name.m_string.ToLower(System.Globalization.CultureInfo.InvariantCulture), string.Empty); + else + m_host.SetCollisionFilter(accept != 0, name.m_string.ToLower(System.Globalization.CultureInfo.InvariantCulture), objectID.ToString()); } public void llTakeControls(int controls, int accept, int pass_on)