aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs324
1 files changed, 162 insertions, 162 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 1adf13e..07b36b3 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -4287,199 +4287,199 @@ namespace OpenSim.Region.Framework.Scenes
4287 } 4287 }
4288 } 4288 }
4289 4289
4290 private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata) 4290 private DetectedObject CreateDetObject(SceneObjectPart obj)
4291 { 4291 {
4292 /* 4292 DetectedObject detobj = new DetectedObject();
4293 lock(m_collisionEventLock) 4293 detobj.keyUUID = obj.UUID;
4294 { 4294 detobj.nameStr = obj.Name;
4295 if (m_collisionEventFlag) 4295 detobj.ownerUUID = obj.OwnerID;
4296 return; 4296 detobj.posVector = obj.AbsolutePosition;
4297 m_collisionEventFlag = true; 4297 detobj.rotQuat = obj.GetWorldRotation();
4298 } 4298 detobj.velVector = obj.Velocity;
4299 detobj.colliderType = 0;
4300 detobj.groupUUID = obj.GroupID;
4299 4301
4300 Util.FireAndForget(delegate(object x) 4302 return detobj;
4303 }
4304
4305 private DetectedObject CreateDetObject(ScenePresence av)
4306 {
4307 DetectedObject detobj = new DetectedObject();
4308 detobj.keyUUID = av.UUID;
4309 detobj.nameStr = av.ControllingClient.Name;
4310 detobj.ownerUUID = av.UUID;
4311 detobj.posVector = av.AbsolutePosition;
4312 detobj.rotQuat = av.Rotation;
4313 detobj.velVector = av.Velocity;
4314 detobj.colliderType = 0;
4315 detobj.groupUUID = av.ControllingClient.ActiveGroupId;
4316
4317 return detobj;
4318 }
4319
4320 private DetectedObject CreateDetObjectForGround()
4321 {
4322 DetectedObject detobj = new DetectedObject();
4323 detobj.keyUUID = UUID.Zero;
4324 detobj.nameStr = "";
4325 detobj.ownerUUID = UUID.Zero;
4326 detobj.posVector = AbsolutePosition;
4327 detobj.rotQuat = Quaternion.Identity;
4328 detobj.velVector = Vector3.Zero;
4329 detobj.colliderType = 0;
4330 detobj.groupUUID = UUID.Zero;
4331
4332 return detobj;
4333 }
4334
4335 private ColliderArgs CreateColliderArgs(SceneObjectPart dest, List<uint> colliders)
4336 {
4337 ColliderArgs colliderArgs = new ColliderArgs();
4338 List<DetectedObject> colliding = new List<DetectedObject>();
4339 foreach (uint localId in colliders)
4301 { 4340 {
4302 */ 4341 if (localId == 0)
4303 try 4342 continue;
4343
4344 SceneObjectPart obj = m_scene.GetSceneObjectPart(localId);
4345 if (obj != null)
4304 { 4346 {
4305 List<uint> thisHitColliders = new List<uint>(); 4347 if (!dest.CollisionFilteredOut(obj.UUID, obj.Name))
4306 List<uint> endedColliders = new List<uint>(); 4348 colliding.Add(CreateDetObject(obj));
4307 List<uint> startedColliders = new List<uint>(); 4349 }
4308 List<CollisionForSoundInfo> soundinfolist = new List<CollisionForSoundInfo>(); 4350 else
4309 CollisionForSoundInfo soundinfo; 4351 {
4310 ContactPoint curcontact; 4352 ScenePresence av = m_scene.GetScenePresence(localId);
4311 4353 if (av != null && (!av.IsChildAgent))
4312 if (coldata.Count == 0)
4313 { 4354 {
4314 if (m_lastColliders.Count == 0) 4355 if (!dest.CollisionFilteredOut(av.UUID, av.Name))
4315 return; // nothing to do 4356 colliding.Add(CreateDetObject(av));
4316
4317 foreach (uint localID in m_lastColliders)
4318 {
4319 endedColliders.Add(localID);
4320 }
4321 m_lastColliders.Clear();
4322 } 4357 }
4358 }
4359 }
4323 4360
4324 else 4361 colliderArgs.Colliders = colliding;
4325 {
4326 foreach (uint id in coldata.Keys)
4327 {
4328 thisHitColliders.Add(id);
4329 if (!m_lastColliders.Contains(id))
4330 {
4331 startedColliders.Add(id);
4332 curcontact = coldata[id];
4333 if (Math.Abs(curcontact.RelativeSpeed) > 0.2)
4334 {
4335 soundinfo = new CollisionForSoundInfo();
4336 soundinfo.colliderID = id;
4337 soundinfo.position = curcontact.Position;
4338 soundinfo.relativeVel = curcontact.RelativeSpeed;
4339 soundinfolist.Add(soundinfo);
4340 }
4341 }
4342 //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
4343 }
4344 4362
4345 // calculate things that ended colliding 4363 return colliderArgs;
4346 foreach (uint localID in m_lastColliders) 4364 }
4347 {
4348 if (!thisHitColliders.Contains(localID))
4349 {
4350 endedColliders.Add(localID);
4351 }
4352 }
4353 //add the items that started colliding this time to the last colliders list.
4354 foreach (uint localID in startedColliders)
4355 {
4356 m_lastColliders.Add(localID);
4357 }
4358 // remove things that ended colliding from the last colliders list
4359 foreach (uint localID in endedColliders)
4360 {
4361 m_lastColliders.Remove(localID);
4362 }
4363
4364 if (soundinfolist.Count > 0)
4365 CollisionSounds.AvatarCollisionSound(this, soundinfolist);
4366 4365
4367 // do event notification 4366 private delegate void ScriptCollidingNotification(uint localID, ColliderArgs message);
4368 if (startedColliders.Count > 0)
4369 {
4370 4367
4371 ColliderArgs StartCollidingMessage = new ColliderArgs(); 4368 private void SendCollisionEvent(SceneObjectGroup dest, scriptEvents ev, List<uint> colliders, ScriptCollidingNotification notify)
4372 List<DetectedObject> colliding = new List<DetectedObject>(); 4369 {
4373 foreach (uint localId in startedColliders) 4370 ColliderArgs CollidingMessage;
4374 {
4375 if (localId == 0)
4376 continue;
4377 4371
4378 SceneObjectPart obj = Scene.GetSceneObjectPart(localId); 4372 if (colliders.Count > 0)
4379 string data = ""; 4373 {
4380 if (obj != null) 4374 if ((dest.RootPart.ScriptEvents & ev) != 0)
4381 { 4375 {
4382 DetectedObject detobj = new DetectedObject(); 4376 CollidingMessage = CreateColliderArgs(dest.RootPart, colliders);
4383 detobj.keyUUID = obj.UUID;
4384 detobj.nameStr = obj.Name;
4385 detobj.ownerUUID = obj.OwnerID;
4386 detobj.posVector = obj.AbsolutePosition;
4387 detobj.rotQuat = obj.GetWorldRotation();
4388 detobj.velVector = obj.Velocity;
4389 detobj.colliderType = 0;
4390 detobj.groupUUID = obj.GroupID;
4391 colliding.Add(detobj);
4392 }
4393 }
4394 4377
4395 if (colliding.Count > 0) 4378 if (CollidingMessage.Colliders.Count > 0)
4396 { 4379 notify(dest.RootPart.LocalId, CollidingMessage);
4397 StartCollidingMessage.Colliders = colliding; 4380 }
4381 }
4382 }
4398 4383
4399 foreach (SceneObjectGroup att in GetAttachments()) 4384 private void SendLandCollisionEvent(SceneObjectGroup dest, scriptEvents ev, ScriptCollidingNotification notify)
4400 Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage); 4385 {
4401 } 4386 if ((dest.RootPart.ScriptEvents & ev) != 0)
4402 } 4387 {
4403 } 4388 ColliderArgs LandCollidingMessage = new ColliderArgs();
4389 List<DetectedObject> colliding = new List<DetectedObject>();
4404 4390
4405 if (endedColliders.Count > 0) 4391 colliding.Add(CreateDetObjectForGround());
4406 { 4392 LandCollidingMessage.Colliders = colliding;
4407 ColliderArgs EndCollidingMessage = new ColliderArgs();
4408 List<DetectedObject> colliding = new List<DetectedObject>();
4409 foreach (uint localId in endedColliders)
4410 {
4411 if (localId == 0)
4412 continue;
4413 4393
4414 SceneObjectPart obj = Scene.GetSceneObjectPart(localId); 4394 notify(dest.RootPart.LocalId, LandCollidingMessage);
4415 string data = ""; 4395 }
4416 if (obj != null) 4396 }
4417 {
4418 DetectedObject detobj = new DetectedObject();
4419 detobj.keyUUID = obj.UUID;
4420 detobj.nameStr = obj.Name;
4421 detobj.ownerUUID = obj.OwnerID;
4422 detobj.posVector = obj.AbsolutePosition;
4423 detobj.rotQuat = obj.GetWorldRotation();
4424 detobj.velVector = obj.Velocity;
4425 detobj.colliderType = 0;
4426 detobj.groupUUID = obj.GroupID;
4427 colliding.Add(detobj);
4428 }
4429 }
4430 4397
4431 if (colliding.Count > 0) 4398 private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata)
4432 { 4399 {
4433 EndCollidingMessage.Colliders = colliding; 4400 try
4401 {
4402 List<uint> thisHitColliders = new List<uint>();
4403 List<uint> endedColliders = new List<uint>();
4404 List<uint> startedColliders = new List<uint>();
4405 List<CollisionForSoundInfo> soundinfolist = new List<CollisionForSoundInfo>();
4406 CollisionForSoundInfo soundinfo;
4407 ContactPoint curcontact;
4408
4409 if (coldata.Count == 0)
4410 {
4411 if (m_lastColliders.Count == 0)
4412 return; // nothing to do
4434 4413
4435 foreach (SceneObjectGroup att in GetAttachments()) 4414 foreach (uint localID in m_lastColliders)
4436 Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage); 4415 {
4437 } 4416 endedColliders.Add(localID);
4438 } 4417 }
4418 m_lastColliders.Clear();
4419 }
4439 4420
4440 if (thisHitColliders.Count > 0) 4421 else
4422 {
4423 foreach (uint id in coldata.Keys)
4441 { 4424 {
4442 ColliderArgs CollidingMessage = new ColliderArgs(); 4425 thisHitColliders.Add(id);
4443 List<DetectedObject> colliding = new List<DetectedObject>(); 4426 if (!m_lastColliders.Contains(id))
4444 foreach (uint localId in thisHitColliders)
4445 { 4427 {
4446 if (localId == 0) 4428 startedColliders.Add(id);
4447 continue; 4429 curcontact = coldata[id];
4448 4430 if (Math.Abs(curcontact.RelativeSpeed) > 0.2)
4449 SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
4450 string data = "";
4451 if (obj != null)
4452 { 4431 {
4453 DetectedObject detobj = new DetectedObject(); 4432 soundinfo = new CollisionForSoundInfo();
4454 detobj.keyUUID = obj.UUID; 4433 soundinfo.colliderID = id;
4455 detobj.nameStr = obj.Name; 4434 soundinfo.position = curcontact.Position;
4456 detobj.ownerUUID = obj.OwnerID; 4435 soundinfo.relativeVel = curcontact.RelativeSpeed;
4457 detobj.posVector = obj.AbsolutePosition; 4436 soundinfolist.Add(soundinfo);
4458 detobj.rotQuat = obj.GetWorldRotation();
4459 detobj.velVector = obj.Velocity;
4460 detobj.colliderType = 0;
4461 detobj.groupUUID = obj.GroupID;
4462 colliding.Add(detobj);
4463 } 4437 }
4464 } 4438 }
4439 //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
4440 }
4465 4441
4466 if (colliding.Count > 0) 4442 // calculate things that ended colliding
4443 foreach (uint localID in m_lastColliders)
4444 {
4445 if (!thisHitColliders.Contains(localID))
4467 { 4446 {
4468 CollidingMessage.Colliders = colliding; 4447 endedColliders.Add(localID);
4469
4470 lock (m_attachments)
4471 {
4472 foreach (SceneObjectGroup att in m_attachments)
4473 Scene.EventManager.TriggerScriptColliding(att.LocalId, CollidingMessage);
4474 }
4475 } 4448 }
4476 } 4449 }
4450 //add the items that started colliding this time to the last colliders list.
4451 foreach (uint localID in startedColliders)
4452 {
4453 m_lastColliders.Add(localID);
4454 }
4455 // remove things that ended colliding from the last colliders list
4456 foreach (uint localID in endedColliders)
4457 {
4458 m_lastColliders.Remove(localID);
4459 }
4460
4461 if (soundinfolist.Count > 0)
4462 CollisionSounds.AvatarCollisionSound(this, soundinfolist);
4477 } 4463 }
4478 finally 4464
4465 foreach (SceneObjectGroup att in GetAttachments())
4479 { 4466 {
4480 m_collisionEventFlag = false; 4467 SendCollisionEvent(att, scriptEvents.collision_start, startedColliders, m_scene.EventManager.TriggerScriptCollidingStart);
4468 SendCollisionEvent(att, scriptEvents.collision , m_lastColliders , m_scene.EventManager.TriggerScriptColliding);
4469 SendCollisionEvent(att, scriptEvents.collision_end , endedColliders , m_scene.EventManager.TriggerScriptCollidingEnd);
4470
4471 if (startedColliders.Contains(0))
4472 SendLandCollisionEvent(att, scriptEvents.land_collision_start, m_scene.EventManager.TriggerScriptLandCollidingStart);
4473 if (m_lastColliders.Contains(0))
4474 SendLandCollisionEvent(att, scriptEvents.land_collision, m_scene.EventManager.TriggerScriptLandColliding);
4475 if (endedColliders.Contains(0))
4476 SendLandCollisionEvent(att, scriptEvents.land_collision_end, m_scene.EventManager.TriggerScriptLandCollidingEnd);
4481 } 4477 }
4482// }); 4478 }
4479 finally
4480 {
4481 m_collisionEventFlag = false;
4482 }
4483 } 4483 }
4484 4484
4485 private void TeleportFlagsDebug() { 4485 private void TeleportFlagsDebug() {