diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 133 |
1 files changed, 82 insertions, 51 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index e0872d0..225d4c9 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2043,7 +2043,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2043 | // m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); | 2043 | // m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); |
2044 | 2044 | ||
2045 | if (PhysicsActor != null) | 2045 | if (PhysicsActor != null) |
2046 | m_sitAvatarHeight = PhysicsActor.Size.Z; | 2046 | m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f; |
2047 | 2047 | ||
2048 | bool canSit = false; | 2048 | bool canSit = false; |
2049 | pos = part.AbsolutePosition + offset; | 2049 | pos = part.AbsolutePosition + offset; |
@@ -4287,6 +4287,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4287 | 4287 | ||
4288 | private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata) | 4288 | private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata) |
4289 | { | 4289 | { |
4290 | /* | ||
4290 | lock(m_collisionEventLock) | 4291 | lock(m_collisionEventLock) |
4291 | { | 4292 | { |
4292 | if (m_collisionEventFlag) | 4293 | if (m_collisionEventFlag) |
@@ -4296,76 +4297,106 @@ namespace OpenSim.Region.Framework.Scenes | |||
4296 | 4297 | ||
4297 | Util.FireAndForget(delegate(object x) | 4298 | Util.FireAndForget(delegate(object x) |
4298 | { | 4299 | { |
4300 | */ | ||
4299 | try | 4301 | try |
4300 | { | 4302 | { |
4301 | List<uint> thisHitColliders = new List<uint>(); | 4303 | List<uint> thisHitColliders = new List<uint>(); |
4302 | List<uint> endedColliders = new List<uint>(); | 4304 | List<uint> endedColliders = new List<uint>(); |
4303 | List<uint> startedColliders = new List<uint>(); | 4305 | List<uint> startedColliders = new List<uint>(); |
4306 | List<CollisionForSoundInfo> soundinfolist = new List<CollisionForSoundInfo>(); | ||
4307 | CollisionForSoundInfo soundinfo; | ||
4308 | ContactPoint curcontact; | ||
4304 | 4309 | ||
4305 | foreach (uint localid in coldata.Keys) | 4310 | if (coldata.Count == 0) |
4306 | { | 4311 | { |
4307 | thisHitColliders.Add(localid); | 4312 | if (m_lastColliders.Count == 0) |
4308 | if (!m_lastColliders.Contains(localid)) | 4313 | return; // nothing to do |
4309 | { | 4314 | |
4310 | startedColliders.Add(localid); | 4315 | foreach (uint localID in m_lastColliders) |
4311 | } | ||
4312 | //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); | ||
4313 | } | ||
4314 | |||
4315 | // calculate things that ended colliding | ||
4316 | foreach (uint localID in m_lastColliders) | ||
4317 | { | ||
4318 | if (!thisHitColliders.Contains(localID)) | ||
4319 | { | 4316 | { |
4320 | endedColliders.Add(localID); | 4317 | endedColliders.Add(localID); |
4321 | } | 4318 | } |
4322 | } | 4319 | m_lastColliders.Clear(); |
4323 | //add the items that started colliding this time to the last colliders list. | ||
4324 | foreach (uint localID in startedColliders) | ||
4325 | { | ||
4326 | m_lastColliders.Add(localID); | ||
4327 | } | ||
4328 | // remove things that ended colliding from the last colliders list | ||
4329 | foreach (uint localID in endedColliders) | ||
4330 | { | ||
4331 | m_lastColliders.Remove(localID); | ||
4332 | } | 4320 | } |
4333 | 4321 | ||
4334 | // do event notification | 4322 | else |
4335 | if (startedColliders.Count > 0) | ||
4336 | { | 4323 | { |
4337 | CollisionSounds.AvatarCollisionSound(this, startedColliders); | 4324 | foreach (uint id in coldata.Keys) |
4338 | |||
4339 | ColliderArgs StartCollidingMessage = new ColliderArgs(); | ||
4340 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
4341 | foreach (uint localId in startedColliders) | ||
4342 | { | 4325 | { |
4343 | if (localId == 0) | 4326 | thisHitColliders.Add(id); |
4344 | continue; | 4327 | if (!m_lastColliders.Contains(id)) |
4328 | { | ||
4329 | startedColliders.Add(id); | ||
4330 | curcontact = coldata[id]; | ||
4331 | if (Math.Abs(curcontact.RelativeSpeed) > 0.2) | ||
4332 | { | ||
4333 | soundinfo = new CollisionForSoundInfo(); | ||
4334 | soundinfo.colliderID = id; | ||
4335 | soundinfo.position = curcontact.Position; | ||
4336 | soundinfo.relativeVel = curcontact.RelativeSpeed; | ||
4337 | soundinfolist.Add(soundinfo); | ||
4338 | } | ||
4339 | } | ||
4340 | //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); | ||
4341 | } | ||
4345 | 4342 | ||
4346 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | 4343 | // calculate things that ended colliding |
4347 | string data = ""; | 4344 | foreach (uint localID in m_lastColliders) |
4348 | if (obj != null) | 4345 | { |
4346 | if (!thisHitColliders.Contains(localID)) | ||
4349 | { | 4347 | { |
4350 | DetectedObject detobj = new DetectedObject(); | 4348 | endedColliders.Add(localID); |
4351 | detobj.keyUUID = obj.UUID; | ||
4352 | detobj.nameStr = obj.Name; | ||
4353 | detobj.ownerUUID = obj.OwnerID; | ||
4354 | detobj.posVector = obj.AbsolutePosition; | ||
4355 | detobj.rotQuat = obj.GetWorldRotation(); | ||
4356 | detobj.velVector = obj.Velocity; | ||
4357 | detobj.colliderType = 0; | ||
4358 | detobj.groupUUID = obj.GroupID; | ||
4359 | colliding.Add(detobj); | ||
4360 | } | 4349 | } |
4361 | } | 4350 | } |
4351 | //add the items that started colliding this time to the last colliders list. | ||
4352 | foreach (uint localID in startedColliders) | ||
4353 | { | ||
4354 | m_lastColliders.Add(localID); | ||
4355 | } | ||
4356 | // remove things that ended colliding from the last colliders list | ||
4357 | foreach (uint localID in endedColliders) | ||
4358 | { | ||
4359 | m_lastColliders.Remove(localID); | ||
4360 | } | ||
4362 | 4361 | ||
4363 | if (colliding.Count > 0) | 4362 | if (soundinfolist.Count > 0) |
4363 | CollisionSounds.AvatarCollisionSound(this, soundinfolist); | ||
4364 | |||
4365 | // do event notification | ||
4366 | if (startedColliders.Count > 0) | ||
4364 | { | 4367 | { |
4365 | StartCollidingMessage.Colliders = colliding; | ||
4366 | 4368 | ||
4367 | foreach (SceneObjectGroup att in GetAttachments()) | 4369 | ColliderArgs StartCollidingMessage = new ColliderArgs(); |
4368 | Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage); | 4370 | List<DetectedObject> colliding = new List<DetectedObject>(); |
4371 | foreach (uint localId in startedColliders) | ||
4372 | { | ||
4373 | if (localId == 0) | ||
4374 | continue; | ||
4375 | |||
4376 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | ||
4377 | string data = ""; | ||
4378 | if (obj != null) | ||
4379 | { | ||
4380 | DetectedObject detobj = new DetectedObject(); | ||
4381 | detobj.keyUUID = obj.UUID; | ||
4382 | detobj.nameStr = obj.Name; | ||
4383 | detobj.ownerUUID = obj.OwnerID; | ||
4384 | detobj.posVector = obj.AbsolutePosition; | ||
4385 | detobj.rotQuat = obj.GetWorldRotation(); | ||
4386 | detobj.velVector = obj.Velocity; | ||
4387 | detobj.colliderType = 0; | ||
4388 | detobj.groupUUID = obj.GroupID; | ||
4389 | colliding.Add(detobj); | ||
4390 | } | ||
4391 | } | ||
4392 | |||
4393 | if (colliding.Count > 0) | ||
4394 | { | ||
4395 | StartCollidingMessage.Colliders = colliding; | ||
4396 | |||
4397 | foreach (SceneObjectGroup att in GetAttachments()) | ||
4398 | Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage); | ||
4399 | } | ||
4369 | } | 4400 | } |
4370 | } | 4401 | } |
4371 | 4402 | ||
@@ -4446,7 +4477,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4446 | { | 4477 | { |
4447 | m_collisionEventFlag = false; | 4478 | m_collisionEventFlag = false; |
4448 | } | 4479 | } |
4449 | }); | 4480 | // }); |
4450 | } | 4481 | } |
4451 | 4482 | ||
4452 | private void TeleportFlagsDebug() { | 4483 | private void TeleportFlagsDebug() { |