diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 287 |
1 files changed, 146 insertions, 141 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index f3af808..0e29b60 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -3403,147 +3403,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3403 | } | 3403 | } |
3404 | } | 3404 | } |
3405 | 3405 | ||
3406 | List<uint> thisHitColliders = new List<uint>(); | 3406 | RaiseCollisionScriptEvents(coldata); |
3407 | List<uint> endedColliders = new List<uint>(); | ||
3408 | List<uint> startedColliders = new List<uint>(); | ||
3409 | |||
3410 | foreach (uint localid in coldata.Keys) | ||
3411 | { | ||
3412 | thisHitColliders.Add(localid); | ||
3413 | if (!m_lastColliders.Contains(localid)) | ||
3414 | { | ||
3415 | startedColliders.Add(localid); | ||
3416 | } | ||
3417 | //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); | ||
3418 | } | ||
3419 | |||
3420 | // calculate things that ended colliding | ||
3421 | foreach (uint localID in m_lastColliders) | ||
3422 | { | ||
3423 | if (!thisHitColliders.Contains(localID)) | ||
3424 | { | ||
3425 | endedColliders.Add(localID); | ||
3426 | } | ||
3427 | } | ||
3428 | //add the items that started colliding this time to the last colliders list. | ||
3429 | foreach (uint localID in startedColliders) | ||
3430 | { | ||
3431 | m_lastColliders.Add(localID); | ||
3432 | } | ||
3433 | // remove things that ended colliding from the last colliders list | ||
3434 | foreach (uint localID in endedColliders) | ||
3435 | { | ||
3436 | m_lastColliders.Remove(localID); | ||
3437 | } | ||
3438 | |||
3439 | // do event notification | ||
3440 | if (startedColliders.Count > 0) | ||
3441 | { | ||
3442 | ColliderArgs StartCollidingMessage = new ColliderArgs(); | ||
3443 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
3444 | foreach (uint localId in startedColliders) | ||
3445 | { | ||
3446 | if (localId == 0) | ||
3447 | continue; | ||
3448 | |||
3449 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | ||
3450 | string data = ""; | ||
3451 | if (obj != null) | ||
3452 | { | ||
3453 | DetectedObject detobj = new DetectedObject(); | ||
3454 | detobj.keyUUID = obj.UUID; | ||
3455 | detobj.nameStr = obj.Name; | ||
3456 | detobj.ownerUUID = obj.OwnerID; | ||
3457 | detobj.posVector = obj.AbsolutePosition; | ||
3458 | detobj.rotQuat = obj.GetWorldRotation(); | ||
3459 | detobj.velVector = obj.Velocity; | ||
3460 | detobj.colliderType = 0; | ||
3461 | detobj.groupUUID = obj.GroupID; | ||
3462 | colliding.Add(detobj); | ||
3463 | } | ||
3464 | } | ||
3465 | |||
3466 | if (colliding.Count > 0) | ||
3467 | { | ||
3468 | StartCollidingMessage.Colliders = colliding; | ||
3469 | |||
3470 | foreach (SceneObjectGroup att in GetAttachments()) | ||
3471 | Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage); | ||
3472 | } | ||
3473 | } | ||
3474 | |||
3475 | if (endedColliders.Count > 0) | ||
3476 | { | ||
3477 | ColliderArgs EndCollidingMessage = new ColliderArgs(); | ||
3478 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
3479 | foreach (uint localId in endedColliders) | ||
3480 | { | ||
3481 | if (localId == 0) | ||
3482 | continue; | ||
3483 | |||
3484 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | ||
3485 | string data = ""; | ||
3486 | if (obj != null) | ||
3487 | { | ||
3488 | DetectedObject detobj = new DetectedObject(); | ||
3489 | detobj.keyUUID = obj.UUID; | ||
3490 | detobj.nameStr = obj.Name; | ||
3491 | detobj.ownerUUID = obj.OwnerID; | ||
3492 | detobj.posVector = obj.AbsolutePosition; | ||
3493 | detobj.rotQuat = obj.GetWorldRotation(); | ||
3494 | detobj.velVector = obj.Velocity; | ||
3495 | detobj.colliderType = 0; | ||
3496 | detobj.groupUUID = obj.GroupID; | ||
3497 | colliding.Add(detobj); | ||
3498 | } | ||
3499 | } | ||
3500 | |||
3501 | if (colliding.Count > 0) | ||
3502 | { | ||
3503 | EndCollidingMessage.Colliders = colliding; | ||
3504 | |||
3505 | foreach (SceneObjectGroup att in GetAttachments()) | ||
3506 | Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage); | ||
3507 | } | ||
3508 | } | ||
3509 | |||
3510 | if (thisHitColliders.Count > 0) | ||
3511 | { | ||
3512 | ColliderArgs CollidingMessage = new ColliderArgs(); | ||
3513 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
3514 | foreach (uint localId in thisHitColliders) | ||
3515 | { | ||
3516 | if (localId == 0) | ||
3517 | continue; | ||
3518 | |||
3519 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | ||
3520 | string data = ""; | ||
3521 | if (obj != null) | ||
3522 | { | ||
3523 | DetectedObject detobj = new DetectedObject(); | ||
3524 | detobj.keyUUID = obj.UUID; | ||
3525 | detobj.nameStr = obj.Name; | ||
3526 | detobj.ownerUUID = obj.OwnerID; | ||
3527 | detobj.posVector = obj.AbsolutePosition; | ||
3528 | detobj.rotQuat = obj.GetWorldRotation(); | ||
3529 | detobj.velVector = obj.Velocity; | ||
3530 | detobj.colliderType = 0; | ||
3531 | detobj.groupUUID = obj.GroupID; | ||
3532 | colliding.Add(detobj); | ||
3533 | } | ||
3534 | } | ||
3535 | |||
3536 | if (colliding.Count > 0) | ||
3537 | { | ||
3538 | CollidingMessage.Colliders = colliding; | ||
3539 | |||
3540 | lock (m_attachments) | ||
3541 | { | ||
3542 | foreach (SceneObjectGroup att in m_attachments) | ||
3543 | Scene.EventManager.TriggerScriptColliding(att.LocalId, CollidingMessage); | ||
3544 | } | ||
3545 | } | ||
3546 | } | ||
3547 | 3407 | ||
3548 | if (Invulnerable) | 3408 | if (Invulnerable) |
3549 | return; | 3409 | return; |
@@ -4037,5 +3897,150 @@ namespace OpenSim.Region.Framework.Scenes | |||
4037 | land.SendLandUpdateToClient(ControllingClient); | 3897 | land.SendLandUpdateToClient(ControllingClient); |
4038 | } | 3898 | } |
4039 | } | 3899 | } |
3900 | |||
3901 | private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata) | ||
3902 | { | ||
3903 | List<uint> thisHitColliders = new List<uint>(); | ||
3904 | List<uint> endedColliders = new List<uint>(); | ||
3905 | List<uint> startedColliders = new List<uint>(); | ||
3906 | |||
3907 | foreach (uint localid in coldata.Keys) | ||
3908 | { | ||
3909 | thisHitColliders.Add(localid); | ||
3910 | if (!m_lastColliders.Contains(localid)) | ||
3911 | { | ||
3912 | startedColliders.Add(localid); | ||
3913 | } | ||
3914 | //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); | ||
3915 | } | ||
3916 | |||
3917 | // calculate things that ended colliding | ||
3918 | foreach (uint localID in m_lastColliders) | ||
3919 | { | ||
3920 | if (!thisHitColliders.Contains(localID)) | ||
3921 | { | ||
3922 | endedColliders.Add(localID); | ||
3923 | } | ||
3924 | } | ||
3925 | //add the items that started colliding this time to the last colliders list. | ||
3926 | foreach (uint localID in startedColliders) | ||
3927 | { | ||
3928 | m_lastColliders.Add(localID); | ||
3929 | } | ||
3930 | // remove things that ended colliding from the last colliders list | ||
3931 | foreach (uint localID in endedColliders) | ||
3932 | { | ||
3933 | m_lastColliders.Remove(localID); | ||
3934 | } | ||
3935 | |||
3936 | // do event notification | ||
3937 | if (startedColliders.Count > 0) | ||
3938 | { | ||
3939 | ColliderArgs StartCollidingMessage = new ColliderArgs(); | ||
3940 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
3941 | foreach (uint localId in startedColliders) | ||
3942 | { | ||
3943 | if (localId == 0) | ||
3944 | continue; | ||
3945 | |||
3946 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | ||
3947 | string data = ""; | ||
3948 | if (obj != null) | ||
3949 | { | ||
3950 | DetectedObject detobj = new DetectedObject(); | ||
3951 | detobj.keyUUID = obj.UUID; | ||
3952 | detobj.nameStr = obj.Name; | ||
3953 | detobj.ownerUUID = obj.OwnerID; | ||
3954 | detobj.posVector = obj.AbsolutePosition; | ||
3955 | detobj.rotQuat = obj.GetWorldRotation(); | ||
3956 | detobj.velVector = obj.Velocity; | ||
3957 | detobj.colliderType = 0; | ||
3958 | detobj.groupUUID = obj.GroupID; | ||
3959 | colliding.Add(detobj); | ||
3960 | } | ||
3961 | } | ||
3962 | |||
3963 | if (colliding.Count > 0) | ||
3964 | { | ||
3965 | StartCollidingMessage.Colliders = colliding; | ||
3966 | |||
3967 | foreach (SceneObjectGroup att in GetAttachments()) | ||
3968 | Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage); | ||
3969 | } | ||
3970 | } | ||
3971 | |||
3972 | if (endedColliders.Count > 0) | ||
3973 | { | ||
3974 | ColliderArgs EndCollidingMessage = new ColliderArgs(); | ||
3975 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
3976 | foreach (uint localId in endedColliders) | ||
3977 | { | ||
3978 | if (localId == 0) | ||
3979 | continue; | ||
3980 | |||
3981 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | ||
3982 | string data = ""; | ||
3983 | if (obj != null) | ||
3984 | { | ||
3985 | DetectedObject detobj = new DetectedObject(); | ||
3986 | detobj.keyUUID = obj.UUID; | ||
3987 | detobj.nameStr = obj.Name; | ||
3988 | detobj.ownerUUID = obj.OwnerID; | ||
3989 | detobj.posVector = obj.AbsolutePosition; | ||
3990 | detobj.rotQuat = obj.GetWorldRotation(); | ||
3991 | detobj.velVector = obj.Velocity; | ||
3992 | detobj.colliderType = 0; | ||
3993 | detobj.groupUUID = obj.GroupID; | ||
3994 | colliding.Add(detobj); | ||
3995 | } | ||
3996 | } | ||
3997 | |||
3998 | if (colliding.Count > 0) | ||
3999 | { | ||
4000 | EndCollidingMessage.Colliders = colliding; | ||
4001 | |||
4002 | foreach (SceneObjectGroup att in GetAttachments()) | ||
4003 | Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage); | ||
4004 | } | ||
4005 | } | ||
4006 | |||
4007 | if (thisHitColliders.Count > 0) | ||
4008 | { | ||
4009 | ColliderArgs CollidingMessage = new ColliderArgs(); | ||
4010 | List<DetectedObject> colliding = new List<DetectedObject>(); | ||
4011 | foreach (uint localId in thisHitColliders) | ||
4012 | { | ||
4013 | if (localId == 0) | ||
4014 | continue; | ||
4015 | |||
4016 | SceneObjectPart obj = Scene.GetSceneObjectPart(localId); | ||
4017 | string data = ""; | ||
4018 | if (obj != null) | ||
4019 | { | ||
4020 | DetectedObject detobj = new DetectedObject(); | ||
4021 | detobj.keyUUID = obj.UUID; | ||
4022 | detobj.nameStr = obj.Name; | ||
4023 | detobj.ownerUUID = obj.OwnerID; | ||
4024 | detobj.posVector = obj.AbsolutePosition; | ||
4025 | detobj.rotQuat = obj.GetWorldRotation(); | ||
4026 | detobj.velVector = obj.Velocity; | ||
4027 | detobj.colliderType = 0; | ||
4028 | detobj.groupUUID = obj.GroupID; | ||
4029 | colliding.Add(detobj); | ||
4030 | } | ||
4031 | } | ||
4032 | |||
4033 | if (colliding.Count > 0) | ||
4034 | { | ||
4035 | CollidingMessage.Colliders = colliding; | ||
4036 | |||
4037 | lock (m_attachments) | ||
4038 | { | ||
4039 | foreach (SceneObjectGroup att in m_attachments) | ||
4040 | Scene.EventManager.TriggerScriptColliding(att.LocalId, CollidingMessage); | ||
4041 | } | ||
4042 | } | ||
4043 | } | ||
4044 | } | ||
4040 | } | 4045 | } |
4041 | } | 4046 | } |