Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
commit
e644e34545
|
@ -632,7 +632,6 @@ namespace OpenSim.Data.Tests
|
|||
.IgnoreProperty(x=>x.RegionUUID)
|
||||
.IgnoreProperty(x=>x.Scene)
|
||||
.IgnoreProperty(x=>x.Parts)
|
||||
.IgnoreProperty(x=>x.PassCollision)
|
||||
.IgnoreProperty(x=>x.RootPart));
|
||||
}
|
||||
|
||||
|
|
|
@ -505,17 +505,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
get { return true; }
|
||||
}
|
||||
|
||||
private bool m_passCollision;
|
||||
public bool PassCollision
|
||||
{
|
||||
get { return m_passCollision; }
|
||||
set
|
||||
{
|
||||
m_passCollision = value;
|
||||
HasGroupChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsSelected
|
||||
{
|
||||
get { return m_isSelected; }
|
||||
|
|
|
@ -254,7 +254,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
private readonly Stack<UndoState> m_undo = new Stack<UndoState>(5);
|
||||
private readonly Stack<UndoState> m_redo = new Stack<UndoState>(5);
|
||||
|
||||
private bool m_passTouches;
|
||||
private bool m_passTouches = false;
|
||||
private bool m_passCollisions = false;
|
||||
|
||||
protected Vector3 m_acceleration;
|
||||
protected Vector3 m_angularVelocity;
|
||||
|
@ -541,6 +542,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
[XmlIgnore]
|
||||
public bool PassTouches
|
||||
{
|
||||
get { return m_passTouches; }
|
||||
|
@ -553,8 +555,18 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public bool PassCollisions
|
||||
{
|
||||
get { return m_passCollisions; }
|
||||
set
|
||||
{
|
||||
m_passCollisions = value;
|
||||
|
||||
if (ParentGroup != null)
|
||||
ParentGroup.HasGroupChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<int, string> CollisionFilter
|
||||
{
|
||||
get { return m_CollisionFilter; }
|
||||
|
@ -2011,12 +2023,155 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
}
|
||||
|
||||
private bool CollisionFilteredOut(SceneObjectPart dest, UUID objectID, string objectName)
|
||||
{
|
||||
if(dest.CollisionFilter.Count == 0)
|
||||
return false;
|
||||
|
||||
if (dest.CollisionFilter.ContainsValue(objectID.ToString()) ||
|
||||
dest.CollisionFilter.ContainsValue(objectID.ToString() + objectName) ||
|
||||
dest.CollisionFilter.ContainsValue(UUID.Zero.ToString() + objectName))
|
||||
{
|
||||
if (dest.CollisionFilter.ContainsKey(1))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dest.CollisionFilter.ContainsKey(1))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private DetectedObject CreateDetObject(SceneObjectPart obj)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = obj.UUID;
|
||||
detobj.nameStr = obj.Name;
|
||||
detobj.ownerUUID = obj.OwnerID;
|
||||
detobj.posVector = obj.AbsolutePosition;
|
||||
detobj.rotQuat = obj.GetWorldRotation();
|
||||
detobj.velVector = obj.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = obj.GroupID;
|
||||
|
||||
return detobj;
|
||||
}
|
||||
|
||||
private DetectedObject CreateDetObject(ScenePresence av)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = av.UUID;
|
||||
detobj.nameStr = av.ControllingClient.Name;
|
||||
detobj.ownerUUID = av.UUID;
|
||||
detobj.posVector = av.AbsolutePosition;
|
||||
detobj.rotQuat = av.Rotation;
|
||||
detobj.velVector = av.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = av.ControllingClient.ActiveGroupId;
|
||||
|
||||
return detobj;
|
||||
}
|
||||
|
||||
private DetectedObject CreateDetObjectForGround()
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = UUID.Zero;
|
||||
detobj.nameStr = "";
|
||||
detobj.ownerUUID = UUID.Zero;
|
||||
detobj.posVector = ParentGroup.RootPart.AbsolutePosition;
|
||||
detobj.rotQuat = Quaternion.Identity;
|
||||
detobj.velVector = Vector3.Zero;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = UUID.Zero;
|
||||
|
||||
return detobj;
|
||||
}
|
||||
|
||||
private ColliderArgs CreateColliderArgs(SceneObjectPart dest, List<uint> colliders)
|
||||
{
|
||||
ColliderArgs colliderArgs = new ColliderArgs();
|
||||
List<DetectedObject> colliding = new List<DetectedObject>();
|
||||
foreach (uint localId in colliders)
|
||||
{
|
||||
if (localId == 0)
|
||||
continue;
|
||||
|
||||
SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId);
|
||||
if (obj != null)
|
||||
{
|
||||
if (!dest.CollisionFilteredOut(this, obj.UUID, obj.Name))
|
||||
colliding.Add(CreateDetObject(obj));
|
||||
}
|
||||
else
|
||||
{
|
||||
ScenePresence av = ParentGroup.Scene.GetScenePresence(localId);
|
||||
if (av != null && (!av.IsChildAgent))
|
||||
{
|
||||
if (!dest.CollisionFilteredOut(this, av.UUID, av.Name))
|
||||
colliding.Add(CreateDetObject(av));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
colliderArgs.Colliders = colliding;
|
||||
|
||||
return colliderArgs;
|
||||
}
|
||||
|
||||
private delegate void ScriptCollidingNotification(uint localID, ColliderArgs message);
|
||||
|
||||
private void SendCollisionEvent(scriptEvents ev, List<uint> colliders, ScriptCollidingNotification notify)
|
||||
{
|
||||
bool sendToRoot = false;
|
||||
ColliderArgs CollidingMessage;
|
||||
|
||||
if (colliders.Count > 0)
|
||||
{
|
||||
if ((ScriptEvents & ev) != 0)
|
||||
{
|
||||
CollidingMessage = CreateColliderArgs(this, colliders);
|
||||
|
||||
if (CollidingMessage.Colliders.Count > 0)
|
||||
notify(LocalId, CollidingMessage);
|
||||
|
||||
if (PassCollisions)
|
||||
sendToRoot = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((ParentGroup.RootPart.ScriptEvents & ev) != 0)
|
||||
sendToRoot = true;
|
||||
}
|
||||
if (sendToRoot && ParentGroup.RootPart != this)
|
||||
{
|
||||
CollidingMessage = CreateColliderArgs(ParentGroup.RootPart, colliders);
|
||||
if (CollidingMessage.Colliders.Count > 0)
|
||||
notify(ParentGroup.RootPart.LocalId, CollidingMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SendLandCollisionEvent(scriptEvents ev, ScriptCollidingNotification notify)
|
||||
{
|
||||
if ((ParentGroup.RootPart.ScriptEvents & ev) != 0)
|
||||
{
|
||||
ColliderArgs LandCollidingMessage = new ColliderArgs();
|
||||
List<DetectedObject> colliding = new List<DetectedObject>();
|
||||
|
||||
colliding.Add(CreateDetObjectForGround());
|
||||
LandCollidingMessage.Colliders = colliding;
|
||||
|
||||
notify(LocalId, LandCollidingMessage);
|
||||
}
|
||||
}
|
||||
|
||||
public void PhysicsCollision(EventArgs e)
|
||||
{
|
||||
// m_log.DebugFormat("Invoking PhysicsCollision on {0} {1} {2}", Name, LocalId, UUID);
|
||||
if (ParentGroup.Scene == null || ParentGroup.IsDeleted)
|
||||
return;
|
||||
|
||||
// single threaded here
|
||||
|
||||
CollisionEventUpdate a = (CollisionEventUpdate)e;
|
||||
Dictionary<uint, ContactPoint> collissionswith = a.m_objCollisionList;
|
||||
List<uint> thisHitColliders = new List<uint>();
|
||||
|
@ -2029,528 +2184,41 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
thisHitColliders.Add(localid);
|
||||
if (!m_lastColliders.Contains(localid))
|
||||
{
|
||||
startedColliders.Add(localid);
|
||||
}
|
||||
//m_log.Debug("[OBJECT]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
|
||||
}
|
||||
|
||||
// calculate things that ended colliding
|
||||
foreach (uint localID in m_lastColliders)
|
||||
{
|
||||
if (!thisHitColliders.Contains(localID))
|
||||
{
|
||||
endedColliders.Add(localID);
|
||||
}
|
||||
}
|
||||
|
||||
//add the items that started colliding this time to the last colliders list.
|
||||
foreach (uint localID in startedColliders)
|
||||
{
|
||||
m_lastColliders.Add(localID);
|
||||
}
|
||||
|
||||
// remove things that ended colliding from the last colliders list
|
||||
foreach (uint localID in endedColliders)
|
||||
{
|
||||
m_lastColliders.Remove(localID);
|
||||
}
|
||||
|
||||
if (ParentGroup.IsDeleted)
|
||||
return;
|
||||
|
||||
// play the sound.
|
||||
if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f)
|
||||
{
|
||||
SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false);
|
||||
}
|
||||
|
||||
if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.collision_start) != 0)
|
||||
SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart);
|
||||
SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding);
|
||||
SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd);
|
||||
|
||||
if (startedColliders.Contains(0))
|
||||
{
|
||||
// do event notification
|
||||
if (startedColliders.Count > 0)
|
||||
{
|
||||
ColliderArgs StartCollidingMessage = new ColliderArgs();
|
||||
List<DetectedObject> colliding = new List<DetectedObject>();
|
||||
foreach (uint localId in startedColliders)
|
||||
{
|
||||
if (localId == 0)
|
||||
continue;
|
||||
|
||||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId);
|
||||
string data = "";
|
||||
if (obj != null)
|
||||
{
|
||||
if (ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString())
|
||||
|| ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name))
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this object
|
||||
if (found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = obj.UUID;
|
||||
detobj.nameStr = obj.Name;
|
||||
detobj.ownerUUID = obj.OwnerID;
|
||||
detobj.posVector = obj.AbsolutePosition;
|
||||
detobj.rotQuat = obj.GetWorldRotation();
|
||||
detobj.velVector = obj.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = obj.GroupID;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
//If it is 0, it is to not accept collisions from this object
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this object, so this other object will not work
|
||||
if (!found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = obj.UUID;
|
||||
detobj.nameStr = obj.Name;
|
||||
detobj.ownerUUID = obj.OwnerID;
|
||||
detobj.posVector = obj.AbsolutePosition;
|
||||
detobj.rotQuat = obj.GetWorldRotation();
|
||||
detobj.velVector = obj.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = obj.GroupID;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParentGroup.Scene.ForEachRootScenePresence(delegate(ScenePresence av)
|
||||
{
|
||||
if (av.LocalId == localId)
|
||||
{
|
||||
if (ParentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString())
|
||||
|| ParentGroup.RootPart.CollisionFilter.ContainsValue(av.Name))
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this avatar
|
||||
if (found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = av.UUID;
|
||||
detobj.nameStr = av.ControllingClient.Name;
|
||||
detobj.ownerUUID = av.UUID;
|
||||
detobj.posVector = av.AbsolutePosition;
|
||||
detobj.rotQuat = av.Rotation;
|
||||
detobj.velVector = av.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = av.ControllingClient.ActiveGroupId;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
//If it is 0, it is to not accept collisions from this avatar
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work
|
||||
if (!found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = av.UUID;
|
||||
detobj.nameStr = av.ControllingClient.Name;
|
||||
detobj.ownerUUID = av.UUID;
|
||||
detobj.posVector = av.AbsolutePosition;
|
||||
detobj.rotQuat = av.Rotation;
|
||||
detobj.velVector = av.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = av.ControllingClient.ActiveGroupId;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (colliding.Count > 0)
|
||||
{
|
||||
StartCollidingMessage.Colliders = colliding;
|
||||
|
||||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
// if (m_parentGroup.PassCollision == true)
|
||||
// {
|
||||
// //TODO: Add pass to root prim!
|
||||
// }
|
||||
|
||||
ParentGroup.Scene.EventManager.TriggerScriptCollidingStart(LocalId, StartCollidingMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.collision) != 0)
|
||||
{
|
||||
if (m_lastColliders.Count > 0)
|
||||
{
|
||||
ColliderArgs CollidingMessage = new ColliderArgs();
|
||||
List<DetectedObject> colliding = new List<DetectedObject>();
|
||||
foreach (uint localId in m_lastColliders)
|
||||
{
|
||||
// always running this check because if the user deletes the object it would return a null reference.
|
||||
if (localId == 0)
|
||||
continue;
|
||||
|
||||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId);
|
||||
string data = "";
|
||||
if (obj != null)
|
||||
{
|
||||
if (ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString())
|
||||
|| ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name))
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this object
|
||||
if (found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = obj.UUID;
|
||||
detobj.nameStr = obj.Name;
|
||||
detobj.ownerUUID = obj.OwnerID;
|
||||
detobj.posVector = obj.AbsolutePosition;
|
||||
detobj.rotQuat = obj.GetWorldRotation();
|
||||
detobj.velVector = obj.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = obj.GroupID;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
//If it is 0, it is to not accept collisions from this object
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this object, so this other object will not work
|
||||
if (!found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = obj.UUID;
|
||||
detobj.nameStr = obj.Name;
|
||||
detobj.ownerUUID = obj.OwnerID;
|
||||
detobj.posVector = obj.AbsolutePosition;
|
||||
detobj.rotQuat = obj.GetWorldRotation();
|
||||
detobj.velVector = obj.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = obj.GroupID;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParentGroup.Scene.ForEachRootScenePresence(delegate(ScenePresence av)
|
||||
{
|
||||
if (av.LocalId == localId)
|
||||
{
|
||||
if (ParentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString())
|
||||
|| ParentGroup.RootPart.CollisionFilter.ContainsValue(av.Name))
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this avatar
|
||||
if (found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = av.UUID;
|
||||
detobj.nameStr = av.ControllingClient.Name;
|
||||
detobj.ownerUUID = av.UUID;
|
||||
detobj.posVector = av.AbsolutePosition;
|
||||
detobj.rotQuat = av.Rotation;
|
||||
detobj.velVector = av.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = av.ControllingClient.ActiveGroupId;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
//If it is 0, it is to not accept collisions from this avatar
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work
|
||||
if (!found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = av.UUID;
|
||||
detobj.nameStr = av.ControllingClient.Name;
|
||||
detobj.ownerUUID = av.UUID;
|
||||
detobj.posVector = av.AbsolutePosition;
|
||||
detobj.rotQuat = av.Rotation;
|
||||
detobj.velVector = av.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = av.ControllingClient.ActiveGroupId;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (colliding.Count > 0)
|
||||
{
|
||||
CollidingMessage.Colliders = colliding;
|
||||
|
||||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
ParentGroup.Scene.EventManager.TriggerScriptColliding(LocalId, CollidingMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.collision_end) != 0)
|
||||
{
|
||||
if (endedColliders.Count > 0)
|
||||
{
|
||||
ColliderArgs EndCollidingMessage = new ColliderArgs();
|
||||
List<DetectedObject> colliding = new List<DetectedObject>();
|
||||
foreach (uint localId in endedColliders)
|
||||
{
|
||||
if (localId == 0)
|
||||
continue;
|
||||
|
||||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
SceneObjectPart obj = ParentGroup.Scene.GetSceneObjectPart(localId);
|
||||
string data = "";
|
||||
if (obj != null)
|
||||
{
|
||||
if (ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) || ParentGroup.RootPart.CollisionFilter.ContainsValue(obj.Name))
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this object
|
||||
if (found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = obj.UUID;
|
||||
detobj.nameStr = obj.Name;
|
||||
detobj.ownerUUID = obj.OwnerID;
|
||||
detobj.posVector = obj.AbsolutePosition;
|
||||
detobj.rotQuat = obj.GetWorldRotation();
|
||||
detobj.velVector = obj.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = obj.GroupID;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
//If it is 0, it is to not accept collisions from this object
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1,out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this object, so this other object will not work
|
||||
if (!found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = obj.UUID;
|
||||
detobj.nameStr = obj.Name;
|
||||
detobj.ownerUUID = obj.OwnerID;
|
||||
detobj.posVector = obj.AbsolutePosition;
|
||||
detobj.rotQuat = obj.GetWorldRotation();
|
||||
detobj.velVector = obj.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = obj.GroupID;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParentGroup.Scene.ForEachRootScenePresence(delegate(ScenePresence av)
|
||||
{
|
||||
if (av.LocalId == localId)
|
||||
{
|
||||
if (ParentGroup.RootPart.CollisionFilter.ContainsValue(av.UUID.ToString())
|
||||
|| ParentGroup.RootPart.CollisionFilter.ContainsValue(av.Name))
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this avatar
|
||||
if (found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = av.UUID;
|
||||
detobj.nameStr = av.ControllingClient.Name;
|
||||
detobj.ownerUUID = av.UUID;
|
||||
detobj.posVector = av.AbsolutePosition;
|
||||
detobj.rotQuat = av.Rotation;
|
||||
detobj.velVector = av.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = av.ControllingClient.ActiveGroupId;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
//If it is 0, it is to not accept collisions from this avatar
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bool found = ParentGroup.RootPart.CollisionFilter.TryGetValue(1, out data);
|
||||
//If it is 1, it is to accept ONLY collisions from this avatar, so this other avatar will not work
|
||||
if (!found)
|
||||
{
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = av.UUID;
|
||||
detobj.nameStr = av.ControllingClient.Name;
|
||||
detobj.ownerUUID = av.UUID;
|
||||
detobj.posVector = av.AbsolutePosition;
|
||||
detobj.rotQuat = av.Rotation;
|
||||
detobj.velVector = av.Velocity;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = av.ControllingClient.ActiveGroupId;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (colliding.Count > 0)
|
||||
{
|
||||
EndCollidingMessage.Colliders = colliding;
|
||||
|
||||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd(LocalId, EndCollidingMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.land_collision_start) != 0)
|
||||
{
|
||||
if (startedColliders.Count > 0)
|
||||
{
|
||||
ColliderArgs LandStartCollidingMessage = new ColliderArgs();
|
||||
List<DetectedObject> colliding = new List<DetectedObject>();
|
||||
foreach (uint localId in startedColliders)
|
||||
{
|
||||
if (localId == 0)
|
||||
{
|
||||
//Hope that all is left is ground!
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = UUID.Zero;
|
||||
detobj.nameStr = "";
|
||||
detobj.ownerUUID = UUID.Zero;
|
||||
detobj.posVector = ParentGroup.RootPart.AbsolutePosition;
|
||||
detobj.rotQuat = Quaternion.Identity;
|
||||
detobj.velVector = Vector3.Zero;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = UUID.Zero;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
}
|
||||
|
||||
if (colliding.Count > 0)
|
||||
{
|
||||
LandStartCollidingMessage.Colliders = colliding;
|
||||
|
||||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
ParentGroup.Scene.EventManager.TriggerScriptLandCollidingStart(LocalId, LandStartCollidingMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.land_collision) != 0)
|
||||
{
|
||||
if (m_lastColliders.Count > 0)
|
||||
{
|
||||
ColliderArgs LandCollidingMessage = new ColliderArgs();
|
||||
List<DetectedObject> colliding = new List<DetectedObject>();
|
||||
foreach (uint localId in startedColliders)
|
||||
{
|
||||
if (localId == 0)
|
||||
{
|
||||
//Hope that all is left is ground!
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = UUID.Zero;
|
||||
detobj.nameStr = "";
|
||||
detobj.ownerUUID = UUID.Zero;
|
||||
detobj.posVector = ParentGroup.RootPart.AbsolutePosition;
|
||||
detobj.rotQuat = Quaternion.Identity;
|
||||
detobj.velVector = Vector3.Zero;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = UUID.Zero;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
}
|
||||
|
||||
if (colliding.Count > 0)
|
||||
{
|
||||
LandCollidingMessage.Colliders = colliding;
|
||||
|
||||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
ParentGroup.Scene.EventManager.TriggerScriptLandColliding(LocalId, LandCollidingMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((ParentGroup.RootPart.ScriptEvents & scriptEvents.land_collision_end) != 0)
|
||||
{
|
||||
if (endedColliders.Count > 0)
|
||||
{
|
||||
ColliderArgs LandEndCollidingMessage = new ColliderArgs();
|
||||
List<DetectedObject> colliding = new List<DetectedObject>();
|
||||
foreach (uint localId in startedColliders)
|
||||
{
|
||||
if (localId == 0)
|
||||
{
|
||||
//Hope that all is left is ground!
|
||||
DetectedObject detobj = new DetectedObject();
|
||||
detobj.keyUUID = UUID.Zero;
|
||||
detobj.nameStr = "";
|
||||
detobj.ownerUUID = UUID.Zero;
|
||||
detobj.posVector = ParentGroup.RootPart.AbsolutePosition;
|
||||
detobj.rotQuat = Quaternion.Identity;
|
||||
detobj.velVector = Vector3.Zero;
|
||||
detobj.colliderType = 0;
|
||||
detobj.groupUUID = UUID.Zero;
|
||||
colliding.Add(detobj);
|
||||
}
|
||||
}
|
||||
|
||||
if (colliding.Count > 0)
|
||||
{
|
||||
LandEndCollidingMessage.Colliders = colliding;
|
||||
|
||||
if (ParentGroup.Scene == null)
|
||||
return;
|
||||
|
||||
ParentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd(LocalId, LandEndCollidingMessage);
|
||||
}
|
||||
}
|
||||
if (m_lastColliders.Contains(0))
|
||||
SendLandCollisionEvent(scriptEvents.land_collision, ParentGroup.Scene.EventManager.TriggerScriptLandColliding);
|
||||
else
|
||||
SendLandCollisionEvent(scriptEvents.land_collision_start, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingStart);
|
||||
}
|
||||
if (endedColliders.Contains(0))
|
||||
SendLandCollisionEvent(scriptEvents.land_collision_end, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd);
|
||||
}
|
||||
|
||||
public void PhysicsOutOfBounds(Vector3 pos)
|
||||
|
@ -4339,6 +4007,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) ||
|
||||
((AggregateScriptEvents & scriptEvents.land_collision) != 0) ||
|
||||
((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision_end) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision_start) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision_start) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision_end) != 0) ||
|
||||
(CollisionSound != UUID.Zero)
|
||||
)
|
||||
{
|
||||
|
@ -4622,6 +4296,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public void aggregateScriptEvents()
|
||||
{
|
||||
if (ParentGroup == null || ParentGroup.RootPart == null)
|
||||
return;
|
||||
|
||||
AggregateScriptEvents = 0;
|
||||
|
||||
// Aggregate script events
|
||||
|
@ -4663,6 +4340,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) ||
|
||||
((AggregateScriptEvents & scriptEvents.land_collision) != 0) ||
|
||||
((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision_end) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.collision_start) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision_start) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision) != 0) ||
|
||||
((ParentGroup.RootPart.AggregateScriptEvents & scriptEvents.land_collision_end) != 0) ||
|
||||
(CollisionSound != UUID.Zero)
|
||||
)
|
||||
{
|
||||
|
|
|
@ -301,6 +301,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
m_SOPXmlProcessors.Add("Name", ProcessName);
|
||||
m_SOPXmlProcessors.Add("Material", ProcessMaterial);
|
||||
m_SOPXmlProcessors.Add("PassTouches", ProcessPassTouches);
|
||||
m_SOPXmlProcessors.Add("PassCollisions", ProcessPassCollisions);
|
||||
m_SOPXmlProcessors.Add("RegionHandle", ProcessRegionHandle);
|
||||
m_SOPXmlProcessors.Add("ScriptAccessPin", ProcessScriptAccessPin);
|
||||
m_SOPXmlProcessors.Add("GroupPosition", ProcessGroupPosition);
|
||||
|
@ -485,6 +486,11 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
obj.PassTouches = Util.ReadBoolean(reader);
|
||||
}
|
||||
|
||||
private static void ProcessPassCollisions(SceneObjectPart obj, XmlTextReader reader)
|
||||
{
|
||||
obj.PassCollisions = Util.ReadBoolean(reader);
|
||||
}
|
||||
|
||||
private static void ProcessRegionHandle(SceneObjectPart obj, XmlTextReader reader)
|
||||
{
|
||||
obj.RegionHandle = (ulong)reader.ReadElementContentAsLong("RegionHandle", String.Empty);
|
||||
|
@ -1153,6 +1159,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
writer.WriteElementString("Name", sop.Name);
|
||||
writer.WriteElementString("Material", sop.Material.ToString());
|
||||
writer.WriteElementString("PassTouches", sop.PassTouches.ToString().ToLower());
|
||||
writer.WriteElementString("PassCollisions", sop.PassCollisions.ToString().ToLower());
|
||||
writer.WriteElementString("RegionHandle", sop.RegionHandle.ToString());
|
||||
writer.WriteElementString("ScriptAccessPin", sop.ScriptAccessPin.ToString());
|
||||
|
||||
|
|
|
@ -2929,14 +2929,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
m_host.CollisionFilter.Clear();
|
||||
if (id != null)
|
||||
{
|
||||
m_host.CollisionFilter.Add(accept,id);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_host.CollisionFilter.Add(accept,name);
|
||||
}
|
||||
UUID objectID;
|
||||
|
||||
if (!UUID.TryParse(id, out objectID))
|
||||
objectID = UUID.Zero;
|
||||
|
||||
if (objectID == UUID.Zero && name == "")
|
||||
return;
|
||||
|
||||
m_host.CollisionFilter.Add(accept,objectID.ToString() + name);
|
||||
}
|
||||
|
||||
public void llTakeControls(int controls, int accept, int pass_on)
|
||||
|
@ -4466,11 +4467,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
m_host.AddScriptLPS(1);
|
||||
if (pass == 0)
|
||||
{
|
||||
m_host.ParentGroup.PassCollision = false;
|
||||
m_host.PassCollisions = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_host.ParentGroup.PassCollision = true;
|
||||
m_host.PassCollisions = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue