public void FireAttachmentCollisionEvents(EventArgs e)
{
CollisionEventUpdate a = (CollisionEventUpdate) e;
Dictionary<uint, ContactPoint> collissionswith = a.GetCollisionEvents();
List<uint> thisHitColliders = new List<uint>();
List<uint> startedColliders = new List<uint>();
// calculate things that started colliding this time
// and build up list of colliders this time
foreach (uint localid in collissionswith.Keys)
{
thisHitColliders.Add(localid);
if (!m_lastColliders.Contains(localid))
{
startedColliders.Add(localid);
}
//MainConsole.Instance.Debug("[OBJECT]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
}
// calculate things that ended colliding
List<uint> endedColliders = m_lastColliders.Where(localID => !thisHitColliders.Contains(localID)).ToList();
//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 (IsDeleted)
return;
// play the sound.
if (startedColliders.Count > 0 && RootPart.CollisionSound != UUID.Zero &&
RootPart.CollisionSoundVolume > 0.0f)
{
RootPart.SendSound(RootPart.CollisionSound.ToString(), RootPart.CollisionSoundVolume, true, 0, 0);
}
if (RootPart.CollisionSprite != UUID.Zero && RootPart.CollisionSoundVolume > 0.0f)
// The collision volume isn't a mistake, its an SL feature/bug
{
// TODO: make a sprite!
}
if ((RootPart.ScriptEvents & scriptEvents.collision_start) != 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)
{
if (Scene == null)
return;
ISceneChildEntity obj = Scene.GetSceneObjectPart(localId);
string data = "";
if (obj != null)
{
if (RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) ||
RootPart.CollisionFilter.ContainsValue(obj.Name))
{
bool found = 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
{
keyUUID = obj.UUID,
nameStr = obj.Name,
ownerUUID = obj.OwnerID,
posVector = obj.AbsolutePosition,
rotQuat = obj.GetWorldRotation(),
velVector = obj.Velocity,
colliderType = 0,
groupUUID = obj.GroupID
};
colliding.Add(detobj);
}
//If it is 0, it is to not accept collisions from this object
}
else
{
bool found = 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
{
keyUUID = obj.UUID,
nameStr = obj.Name,
ownerUUID = obj.OwnerID,
posVector = obj.AbsolutePosition,
rotQuat = obj.GetWorldRotation(),
velVector = obj.Velocity,
colliderType = 0,
groupUUID = obj.GroupID
};
colliding.Add(detobj);
}
}
}
else
{
IScenePresence av = Scene.GetScenePresence(localId);
if (av.LocalId == localId)
{
if (RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) ||
RootPart.CollisionFilter.ContainsValue(av.Name))
{
bool found = 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
{
keyUUID = av.UUID,
nameStr = av.ControllingClient.Name,
ownerUUID = av.UUID,
posVector = av.AbsolutePosition,
rotQuat = av.Rotation,
velVector = av.Velocity,
colliderType = 0,
groupUUID =
av.ControllingClient.ActiveGroupId
};
colliding.Add(detobj);
}
//If it is 0, it is to not accept collisions from this avatar
}
else
{
bool found = 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
{
keyUUID = av.UUID,
nameStr = av.ControllingClient.Name,
ownerUUID = av.UUID,
posVector = av.AbsolutePosition,
rotQuat = av.Rotation,
velVector = av.Velocity,
colliderType = 0,
groupUUID =
av.ControllingClient.ActiveGroupId
};
colliding.Add(detobj);
}
}
}
}
}
}
if (colliding.Count > 0)
{
StartCollidingMessage.Colliders = colliding;
// always running this check because if the user deletes the object it would return a null reference.
if (Scene == null)
return;
Scene.EventManager.TriggerScriptCollidingStart(RootPart, StartCollidingMessage);
}
}
}
if ((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)
{
if (localId != 0)
{
if (Scene == null)
return;
ISceneChildEntity obj = Scene.GetSceneObjectPart(localId);
string data = "";
if (obj != null)
{
if (RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) ||
RootPart.CollisionFilter.ContainsValue(obj.Name))
{
bool found = 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
{
keyUUID = obj.UUID,
nameStr = obj.Name,
ownerUUID = obj.OwnerID,
posVector = obj.AbsolutePosition,
rotQuat = obj.GetWorldRotation(),
velVector = obj.Velocity,
colliderType = 0,
groupUUID = obj.GroupID
};
colliding.Add(detobj);
}
//If it is 0, it is to not accept collisions from this object
}
else
{
bool found = 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
{
keyUUID = obj.UUID,
nameStr = obj.Name,
ownerUUID = obj.OwnerID,
posVector = obj.AbsolutePosition,
rotQuat = obj.GetWorldRotation(),
velVector = obj.Velocity,
colliderType = 0,
groupUUID = obj.GroupID
};
colliding.Add(detobj);
}
}
}
else
{
IScenePresence av = Scene.GetScenePresence(localId);
if (av != null && av.LocalId == localId)
{
if (RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) ||
RootPart.CollisionFilter.ContainsValue(av.Name))
{
bool found = 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
{
keyUUID = av.UUID,
nameStr = av.ControllingClient.Name,
ownerUUID = av.UUID,
posVector = av.AbsolutePosition,
rotQuat = av.Rotation,
velVector = av.Velocity,
colliderType = 0,
groupUUID =
av.ControllingClient.ActiveGroupId
};
colliding.Add(detobj);
}
//If it is 0, it is to not accept collisions from this avatar
}
else
{
bool found = 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
{
keyUUID = av.UUID,
nameStr = av.ControllingClient.Name,
ownerUUID = av.UUID,
posVector = av.AbsolutePosition,
rotQuat = av.Rotation,
velVector = av.Velocity,
colliderType = 0,
groupUUID =
av.ControllingClient.ActiveGroupId
};
colliding.Add(detobj);
}
}
}
}
}
}
if (colliding.Count > 0)
{
CollidingMessage.Colliders = colliding;
if (Scene == null)
return;
Scene.EventManager.TriggerScriptColliding(RootPart, CollidingMessage);
}
}
}
if ((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)
{
// always running this check because if the user deletes the object it would return a null reference.
if (Scene == null)
return;
ISceneChildEntity obj = Scene.GetSceneObjectPart(localId);
string data = "";
if (obj != null)
{
if (RootPart.CollisionFilter.ContainsValue(obj.UUID.ToString()) ||
RootPart.CollisionFilter.ContainsValue(obj.Name))
{
bool found = 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
{
keyUUID = obj.UUID,
nameStr = obj.Name,
ownerUUID = obj.OwnerID,
posVector = obj.AbsolutePosition,
rotQuat = obj.GetWorldRotation(),
velVector = obj.Velocity,
colliderType = 0,
groupUUID = obj.GroupID
};
colliding.Add(detobj);
}
//If it is 0, it is to not accept collisions from this object
}
else
{
bool found = 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
{
keyUUID = obj.UUID,
nameStr = obj.Name,
ownerUUID = obj.OwnerID,
posVector = obj.AbsolutePosition,
rotQuat = obj.GetWorldRotation(),
velVector = obj.Velocity,
colliderType = 0,
groupUUID = obj.GroupID
};
colliding.Add(detobj);
}
}
}
else
{
IScenePresence av = Scene.GetScenePresence(localId);
if (av != null && av.LocalId == localId)
{
if (RootPart.CollisionFilter.ContainsValue(av.UUID.ToString()) ||
RootPart.CollisionFilter.ContainsValue(av.Name))
{
bool found = 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
{
keyUUID = av.UUID,
nameStr = av.ControllingClient.Name,
ownerUUID = av.UUID,
posVector = av.AbsolutePosition,
rotQuat = av.Rotation,
velVector = av.Velocity,
colliderType = 0,
groupUUID =
av.ControllingClient.ActiveGroupId
};
colliding.Add(detobj);
}
//If it is 0, it is to not accept collisions from this avatar
}
else
{
bool found = 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
{
keyUUID = av.UUID,
nameStr = av.ControllingClient.Name,
ownerUUID = av.UUID,
posVector = av.AbsolutePosition,
rotQuat = av.Rotation,
velVector = av.Velocity,
colliderType = 0,
groupUUID =
av.ControllingClient.ActiveGroupId
};
colliding.Add(detobj);
}
}
}
}
}
}
if (colliding.Count > 0)
{
EndCollidingMessage.Colliders = colliding;
if (Scene == null)
return;
Scene.EventManager.TriggerScriptCollidingEnd(RootPart, EndCollidingMessage);
}
}
}
if ((RootPart.ScriptEvents & scriptEvents.land_collision_start) != 0)
{
if (startedColliders.Count > 0)
{
ColliderArgs LandStartCollidingMessage = new ColliderArgs();
List<DetectedObject> colliding = (from localId in startedColliders
where localId == 0
select new DetectedObject
{
keyUUID = UUID.Zero,
nameStr = "",
ownerUUID = UUID.Zero,
posVector = RootPart.AbsolutePosition,
rotQuat = Quaternion.Identity,
velVector = Vector3.Zero,
colliderType = 0,
groupUUID = UUID.Zero
}).ToList();
if (colliding.Count > 0)
{
LandStartCollidingMessage.Colliders = colliding;
if (Scene == null)
return;
Scene.EventManager.TriggerScriptLandCollidingStart(RootPart, LandStartCollidingMessage);
}
}
}
if ((RootPart.ScriptEvents & scriptEvents.land_collision) != 0)
{
if (m_lastColliders.Count > 0)
{
ColliderArgs LandCollidingMessage = new ColliderArgs();
List<DetectedObject> colliding = (from localId in startedColliders
where localId == 0
select new DetectedObject
{
keyUUID = UUID.Zero,
nameStr = "",
ownerUUID = UUID.Zero,
posVector = RootPart.AbsolutePosition,
rotQuat = Quaternion.Identity,
velVector = Vector3.Zero,
colliderType = 0,
groupUUID = UUID.Zero
}).ToList();
if (colliding.Count > 0)
{
LandCollidingMessage.Colliders = colliding;
if (Scene == null)
return;
Scene.EventManager.TriggerScriptLandColliding(RootPart, LandCollidingMessage);
}
}
}
if ((RootPart.ScriptEvents & scriptEvents.land_collision_end) != 0)
{
if (endedColliders.Count > 0)
{
ColliderArgs LandEndCollidingMessage = new ColliderArgs();
List<DetectedObject> colliding = (from localId in startedColliders
where localId == 0
select new DetectedObject
{
keyUUID = UUID.Zero,
nameStr = "",
ownerUUID = UUID.Zero,
posVector = RootPart.AbsolutePosition,
rotQuat = Quaternion.Identity,
velVector = Vector3.Zero,
colliderType = 0,
groupUUID = UUID.Zero
}).ToList();
if (colliding.Count > 0)
{
LandEndCollidingMessage.Colliders = colliding;
// always running this check because if the user deletes the object it would return a null reference.
if (Scene == null)
return;
Scene.EventManager.TriggerScriptLandCollidingEnd(RootPart, LandEndCollidingMessage);
}
}
}
}