mantis 7941: change llCollisionFilter code

This commit is contained in:
UbitUmarov
2021-10-07 17:52:08 +01:00
parent 9ee704e3bd
commit 042c49385f
2 changed files with 66 additions and 35 deletions

View File

@@ -232,7 +232,8 @@ namespace OpenSim.Region.Framework.Scenes
[XmlIgnore]
public int STATUS_ROTATE_Z; // this should not be used
private Dictionary<int, string> m_CollisionFilter = new Dictionary<int, string>();
private int m_CollisionFilterType = 0; // -1 not in use, 0 accept false, 1 accept true
private string m_CollisionFilterString = string.Empty;
/// <value>
/// 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<int, string> 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);

View File

@@ -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)