aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs75
-rwxr-xr-xOpenSim/Region/Framework/Scenes/Scene.cs10
-rwxr-xr-xOpenSim/Region/Framework/Scenes/SceneGraph.cs66
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs101
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs40
6 files changed, 154 insertions, 140 deletions
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 8683599..6ff3049 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -1881,7 +1881,7 @@ namespace OpenSim.Region.Framework.Scenes
1881 catch (Exception e) 1881 catch (Exception e)
1882 { 1882 {
1883 m_log.ErrorFormat( 1883 m_log.ErrorFormat(
1884 "[EVENT MANAGER]: Delegate for TriggerOnAttach failed - continuing. {0} {1}", 1884 "[EVENT MANAGER]: Delegate for TriggerGroupMove failed - continuing. {0} {1}",
1885 e.Message, e.StackTrace); 1885 e.Message, e.StackTrace);
1886 } 1886 }
1887 } 1887 }
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index 4d491d1..a5abe76 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -340,13 +340,11 @@ namespace OpenSim.Region.Framework.Scenes
340 obj.ObjectGrabHandler(localID, offsetPos, remoteClient); 340 obj.ObjectGrabHandler(localID, offsetPos, remoteClient);
341 341
342 // If the touched prim handles touches, deliver it 342 // If the touched prim handles touches, deliver it
343 // If not, deliver to root prim
344 if ((part.ScriptEvents & scriptEvents.touch_start) != 0) 343 if ((part.ScriptEvents & scriptEvents.touch_start) != 0)
345 EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg); 344 EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg);
346 345
347 // Deliver to the root prim if the touched prim doesn't handle touches 346 // Deliver to the root prim if the touched prim doesn't handle touches
348 // or if we're meant to pass on touches anyway. Don't send to root prim 347 // or if we're meant to pass on touches anyway.
349 // if prim touched is the root prim as we just did it
350 if (((part.ScriptEvents & scriptEvents.touch_start) == 0) || 348 if (((part.ScriptEvents & scriptEvents.touch_start) == 0) ||
351 (part.PassTouches && (part.LocalId != obj.RootPart.LocalId))) 349 (part.PassTouches && (part.LocalId != obj.RootPart.LocalId)))
352 { 350 {
@@ -381,12 +379,10 @@ namespace OpenSim.Region.Framework.Scenes
381 surfaceArg = surfaceArgs[0]; 379 surfaceArg = surfaceArgs[0];
382 380
383 // If the touched prim handles touches, deliver it 381 // If the touched prim handles touches, deliver it
384 // If not, deliver to root prim
385 if ((part.ScriptEvents & scriptEvents.touch) != 0) 382 if ((part.ScriptEvents & scriptEvents.touch) != 0)
386 EventManager.TriggerObjectGrabbing(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg); 383 EventManager.TriggerObjectGrabbing(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg);
387 // Deliver to the root prim if the touched prim doesn't handle touches 384 // Deliver to the root prim if the touched prim doesn't handle touches
388 // or if we're meant to pass on touches anyway. Don't send to root prim 385 // or if we're meant to pass on touches anyway.
389 // if prim touched is the root prim as we just did it
390 if (((part.ScriptEvents & scriptEvents.touch) == 0) || 386 if (((part.ScriptEvents & scriptEvents.touch) == 0) ||
391 (part.PassTouches && (part.LocalId != group.RootPart.LocalId))) 387 (part.PassTouches && (part.LocalId != group.RootPart.LocalId)))
392 { 388 {
@@ -400,18 +396,77 @@ namespace OpenSim.Region.Framework.Scenes
400 if (part == null) 396 if (part == null)
401 return; 397 return;
402 398
403 SceneObjectGroup obj = part.ParentGroup; 399 SceneObjectGroup grp = part.ParentGroup;
404 400
405 SurfaceTouchEventArgs surfaceArg = null; 401 SurfaceTouchEventArgs surfaceArg = null;
406 if (surfaceArgs != null && surfaceArgs.Count > 0) 402 if (surfaceArgs != null && surfaceArgs.Count > 0)
407 surfaceArg = surfaceArgs[0]; 403 surfaceArg = surfaceArgs[0];
408 404
409 // If the touched prim handles touches, deliver it 405 // If the touched prim handles touches, deliver it
410 // If not, deliver to root prim
411 if ((part.ScriptEvents & scriptEvents.touch_end) != 0) 406 if ((part.ScriptEvents & scriptEvents.touch_end) != 0)
412 EventManager.TriggerObjectDeGrab(part.LocalId, 0, remoteClient, surfaceArg); 407 EventManager.TriggerObjectDeGrab(part.LocalId, 0, remoteClient, surfaceArg);
413 else 408 // if not or PassTouchs, send it also to root.
414 EventManager.TriggerObjectDeGrab(obj.RootPart.LocalId, part.LocalId, remoteClient, surfaceArg); 409 if (((part.ScriptEvents & scriptEvents.touch_end) == 0) ||
410 (part.PassTouches && (part.LocalId != grp.RootPart.LocalId)))
411 {
412 EventManager.TriggerObjectDeGrab(grp.RootPart.LocalId, part.LocalId, remoteClient, surfaceArg);
413 }
414 }
415
416 /// <summary>
417 /// Start spinning the given object
418 /// </summary>
419 /// <param name="objectID"></param>
420 /// <param name="rotation"></param>
421 /// <param name="remoteClient"></param>
422 public virtual void ProcessSpinStart(UUID objectID, IClientAPI remoteClient)
423 {
424 SceneObjectGroup group = GetGroupByPrim(objectID);
425 if (group != null)
426 {
427 if (Permissions.CanMoveObject(group.UUID, remoteClient.AgentId))// && PermissionsMngr.)
428 {
429 group.SpinStart(remoteClient);
430 }
431 }
432 }
433
434 /// <summary>
435 /// Spin the given object
436 /// </summary>
437 /// <param name="objectID"></param>
438 /// <param name="rotation"></param>
439 /// <param name="remoteClient"></param>
440 public virtual void ProcessSpinObject(UUID objectID, Quaternion rotation, IClientAPI remoteClient)
441 {
442 SceneObjectGroup group = GetGroupByPrim(objectID);
443 if (group != null)
444 {
445 if (Permissions.CanMoveObject(group.UUID, remoteClient.AgentId))// && PermissionsMngr.)
446 {
447 group.SpinMovement(rotation, remoteClient);
448 }
449 // This is outside the above permissions condition
450 // so that if the object is locked the client moving the object
451 // get's it's position on the simulator even if it was the same as before
452 // This keeps the moving user's client in sync with the rest of the world.
453 group.SendGroupTerseUpdate();
454 }
455 }
456
457 public virtual void ProcessSpinObjectStop(UUID objectID, IClientAPI remoteClient)
458 {
459/* no op for now
460 SceneObjectGroup group = GetGroupByPrim(objectID);
461 if (group != null)
462 {
463 if (Permissions.CanMoveObject(group.UUID, remoteClient.AgentId))// && PermissionsMngr.)
464 {
465// group.SpinMovement(rotation, remoteClient);
466 }
467 group.SendGroupTerseUpdate();
468 }
469*/
415 } 470 }
416 471
417 public void ProcessScriptReset(IClientAPI remoteClient, UUID objectID, 472 public void ProcessScriptReset(IClientAPI remoteClient, UUID objectID,
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 0d6af77..d77b8ae 100755
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3329,8 +3329,6 @@ namespace OpenSim.Region.Framework.Scenes
3329 client.OnObjectRequest += RequestPrim; 3329 client.OnObjectRequest += RequestPrim;
3330 client.OnObjectSelect += SelectPrim; 3330 client.OnObjectSelect += SelectPrim;
3331 client.OnObjectDeselect += DeselectPrim; 3331 client.OnObjectDeselect += DeselectPrim;
3332 client.OnSpinStart += m_sceneGraph.SpinStart;
3333 client.OnSpinUpdate += m_sceneGraph.SpinObject;
3334 client.OnDeRezObject += DeRezObjects; 3332 client.OnDeRezObject += DeRezObjects;
3335 3333
3336 client.OnObjectName += m_sceneGraph.PrimName; 3334 client.OnObjectName += m_sceneGraph.PrimName;
@@ -3346,6 +3344,9 @@ namespace OpenSim.Region.Framework.Scenes
3346 client.OnGrabObject += ProcessObjectGrab; 3344 client.OnGrabObject += ProcessObjectGrab;
3347 client.OnGrabUpdate += ProcessObjectGrabUpdate; 3345 client.OnGrabUpdate += ProcessObjectGrabUpdate;
3348 client.OnDeGrabObject += ProcessObjectDeGrab; 3346 client.OnDeGrabObject += ProcessObjectDeGrab;
3347 client.OnSpinStart += ProcessSpinStart;
3348 client.OnSpinUpdate += ProcessSpinObject;
3349 client.OnSpinStop += ProcessSpinObjectStop;
3349 client.OnUndo += m_sceneGraph.HandleUndo; 3350 client.OnUndo += m_sceneGraph.HandleUndo;
3350 client.OnRedo += m_sceneGraph.HandleRedo; 3351 client.OnRedo += m_sceneGraph.HandleRedo;
3351 client.OnObjectDescription += m_sceneGraph.PrimDescription; 3352 client.OnObjectDescription += m_sceneGraph.PrimDescription;
@@ -3456,8 +3457,6 @@ namespace OpenSim.Region.Framework.Scenes
3456 client.OnObjectRequest -= RequestPrim; 3457 client.OnObjectRequest -= RequestPrim;
3457 client.OnObjectSelect -= SelectPrim; 3458 client.OnObjectSelect -= SelectPrim;
3458 client.OnObjectDeselect -= DeselectPrim; 3459 client.OnObjectDeselect -= DeselectPrim;
3459 client.OnSpinStart -= m_sceneGraph.SpinStart;
3460 client.OnSpinUpdate -= m_sceneGraph.SpinObject;
3461 client.OnDeRezObject -= DeRezObjects; 3460 client.OnDeRezObject -= DeRezObjects;
3462 client.OnObjectName -= m_sceneGraph.PrimName; 3461 client.OnObjectName -= m_sceneGraph.PrimName;
3463 client.OnObjectClickAction -= m_sceneGraph.PrimClickAction; 3462 client.OnObjectClickAction -= m_sceneGraph.PrimClickAction;
@@ -3472,6 +3471,9 @@ namespace OpenSim.Region.Framework.Scenes
3472 client.OnGrabObject -= ProcessObjectGrab; 3471 client.OnGrabObject -= ProcessObjectGrab;
3473 client.OnGrabUpdate -= ProcessObjectGrabUpdate; 3472 client.OnGrabUpdate -= ProcessObjectGrabUpdate;
3474 client.OnDeGrabObject -= ProcessObjectDeGrab; 3473 client.OnDeGrabObject -= ProcessObjectDeGrab;
3474 client.OnSpinStart -= ProcessSpinStart;
3475 client.OnSpinUpdate -= ProcessSpinObject;
3476 client.OnSpinStop -= ProcessSpinObjectStop;
3475 client.OnUndo -= m_sceneGraph.HandleUndo; 3477 client.OnUndo -= m_sceneGraph.HandleUndo;
3476 client.OnRedo -= m_sceneGraph.HandleRedo; 3478 client.OnRedo -= m_sceneGraph.HandleRedo;
3477 client.OnObjectDescription -= m_sceneGraph.PrimDescription; 3479 client.OnObjectDescription -= m_sceneGraph.PrimDescription;
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 0e5720f..77c66b6 100755
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1674,72 +1674,6 @@ namespace OpenSim.Region.Framework.Scenes
1674 } 1674 }
1675 } 1675 }
1676 } 1676 }
1677/* moved to scene ProcessObjectGrabUpdate
1678 /// <summary>
1679 /// Move the given object
1680 /// </summary>
1681 /// <param name="objectID"></param>
1682 /// <param name="offset"></param>
1683 /// <param name="pos"></param>
1684 /// <param name="remoteClient"></param>
1685 protected internal void MoveObject(UUID objectID, Vector3 offset, Vector3 pos, IClientAPI remoteClient, List<SurfaceTouchEventArgs> surfaceArgs)
1686 {
1687 SceneObjectGroup group = GetGroupByPrim(objectID);
1688 if (group != null)
1689 {
1690 if (m_parentScene.Permissions.CanMoveObject(group.UUID, remoteClient.AgentId))// && PermissionsMngr.)
1691 {
1692 group.GrabMovement(objectID, offset, pos, remoteClient);
1693 }
1694
1695 // This is outside the above permissions condition
1696 // so that if the object is locked the client moving the object
1697 // get's it's position on the simulator even if it was the same as before
1698 // This keeps the moving user's client in sync with the rest of the world.
1699 group.SendGroupTerseUpdate();
1700 }
1701 }
1702*/
1703 /// <summary>
1704 /// Start spinning the given object
1705 /// </summary>
1706 /// <param name="objectID"></param>
1707 /// <param name="rotation"></param>
1708 /// <param name="remoteClient"></param>
1709 protected internal void SpinStart(UUID objectID, IClientAPI remoteClient)
1710 {
1711 SceneObjectGroup group = GetGroupByPrim(objectID);
1712 if (group != null)
1713 {
1714 if (m_parentScene.Permissions.CanMoveObject(group.UUID, remoteClient.AgentId))// && PermissionsMngr.)
1715 {
1716 group.SpinStart(remoteClient);
1717 }
1718 }
1719 }
1720
1721 /// <summary>
1722 /// Spin the given object
1723 /// </summary>
1724 /// <param name="objectID"></param>
1725 /// <param name="rotation"></param>
1726 /// <param name="remoteClient"></param>
1727 protected internal void SpinObject(UUID objectID, Quaternion rotation, IClientAPI remoteClient)
1728 {
1729 SceneObjectGroup group = GetGroupByPrim(objectID);
1730 if (group != null)
1731 {
1732 if (m_parentScene.Permissions.CanMoveObject(group.UUID, remoteClient.AgentId))// && PermissionsMngr.)
1733 {
1734 group.SpinMovement(rotation, remoteClient);
1735 }
1736 // This is outside the above permissions condition
1737 // so that if the object is locked the client moving the object
1738 // get's it's position on the simulator even if it was the same as before
1739 // This keeps the moving user's client in sync with the rest of the world.
1740 group.SendGroupTerseUpdate();
1741 }
1742 }
1743 1677
1744 /// <summary> 1678 /// <summary>
1745 /// 1679 ///
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index b7c5b6b..17dfb85 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -79,7 +79,8 @@ namespace OpenSim.Region.Framework.Scenes
79 touch_end = 536870912, 79 touch_end = 536870912,
80 touch_start = 2097152, 80 touch_start = 2097152,
81 transaction_result = 33554432, 81 transaction_result = 33554432,
82 object_rez = 4194304 82 object_rez = 4194304,
83 anytouch = touch | touch_end | touch_start
83 } 84 }
84 85
85 public struct scriptPosTarget 86 public struct scriptPosTarget
@@ -3497,34 +3498,26 @@ namespace OpenSim.Region.Framework.Scenes
3497 { 3498 {
3498 if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) 3499 if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
3499 { 3500 {
3501 if (BlockGrabOverride)
3502 return;
3503
3500 SceneObjectPart part = GetPart(partID); 3504 SceneObjectPart part = GetPart(partID);
3501 3505
3502 if (part == null) 3506 if (part == null)
3503 return; 3507 return;
3504 3508
3509 if (part.BlockGrab)
3510 return;
3511
3505 PhysicsActor pa = m_rootPart.PhysActor; 3512 PhysicsActor pa = m_rootPart.PhysActor;
3506 3513
3507 if (pa != null) 3514 if (pa != null && pa.IsPhysical)
3508 { 3515 {
3509 if (pa.IsPhysical) 3516 // empirically convert distance diference to a impulse
3510 { 3517 Vector3 grabforce = pos - AbsolutePosition;
3511 if (!BlockGrabOverride && !part.BlockGrab) 3518 grabforce = grabforce * (pa.Mass * 0.1f);
3512 { 3519 pa.AddForce(grabforce, false);
3513/* Vector3 llmoveforce = pos - AbsolutePosition; 3520 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
3514 Vector3 grabforce = llmoveforce;
3515 grabforce = (grabforce / 10) * pa.Mass;
3516 */
3517 // empirically convert distance diference to a impulse
3518 Vector3 grabforce = pos - AbsolutePosition;
3519 grabforce = grabforce * (pa.Mass/ 10.0f);
3520 pa.AddForce(grabforce, false);
3521 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
3522 }
3523 }
3524 else
3525 {
3526 NonPhysicalGrabMovement(pos);
3527 }
3528 } 3521 }
3529 else 3522 else
3530 { 3523 {
@@ -3553,6 +3546,8 @@ namespace OpenSim.Region.Framework.Scenes
3553 /// <param name="remoteClient"></param> 3546 /// <param name="remoteClient"></param>
3554 public void SpinStart(IClientAPI remoteClient) 3547 public void SpinStart(IClientAPI remoteClient)
3555 { 3548 {
3549 if (BlockGrabOverride || m_rootPart.BlockGrab)
3550 return;
3556 if (m_scene.EventManager.TriggerGroupSpinStart(UUID)) 3551 if (m_scene.EventManager.TriggerGroupSpinStart(UUID))
3557 { 3552 {
3558 PhysicsActor pa = m_rootPart.PhysActor; 3553 PhysicsActor pa = m_rootPart.PhysActor;
@@ -3600,46 +3595,48 @@ namespace OpenSim.Region.Framework.Scenes
3600 // but it will result in over-shoot or under-shoot of the target orientation. 3595 // but it will result in over-shoot or under-shoot of the target orientation.
3601 // For the end user, this means that ctrl+shift+drag can be used for relative, 3596 // For the end user, this means that ctrl+shift+drag can be used for relative,
3602 // but not absolute, adjustments of orientation for physical prims. 3597 // but not absolute, adjustments of orientation for physical prims.
3598
3599 if (BlockGrabOverride || m_rootPart.BlockGrab)
3600 return;
3601
3603 if (m_scene.EventManager.TriggerGroupSpin(UUID, newOrientation)) 3602 if (m_scene.EventManager.TriggerGroupSpin(UUID, newOrientation))
3604 { 3603 {
3605 PhysicsActor pa = m_rootPart.PhysActor; 3604 PhysicsActor pa = m_rootPart.PhysActor;
3606 3605
3607 if (pa != null) 3606 if (pa != null && pa.IsPhysical)
3608 { 3607 {
3609 if (pa.IsPhysical) 3608 if (m_rootPart.IsWaitingForFirstSpinUpdatePacket)
3610 { 3609 {
3611 if (m_rootPart.IsWaitingForFirstSpinUpdatePacket) 3610 // first time initialization of "old" orientation for calculation of delta rotations
3612 { 3611 m_rootPart.SpinOldOrientation = newOrientation;
3613 // first time initialization of "old" orientation for calculation of delta rotations 3612 m_rootPart.IsWaitingForFirstSpinUpdatePacket = false;
3614 m_rootPart.SpinOldOrientation = newOrientation;
3615 m_rootPart.IsWaitingForFirstSpinUpdatePacket = false;
3616 }
3617 else
3618 {
3619 // save and update old orientation
3620 Quaternion old = m_rootPart.SpinOldOrientation;
3621 m_rootPart.SpinOldOrientation = newOrientation;
3622 //m_log.Error("[SCENE OBJECT GROUP]: Old orientation is " + old);
3623 //m_log.Error("[SCENE OBJECT GROUP]: Incoming new orientation is " + newOrientation);
3624
3625 // compute difference between previous old rotation and new incoming rotation
3626 Quaternion minimalRotationFromQ1ToQ2 = Quaternion.Inverse(old) * newOrientation;
3627
3628 float rotationAngle;
3629 Vector3 rotationAxis;
3630 minimalRotationFromQ1ToQ2.GetAxisAngle(out rotationAxis, out rotationAngle);
3631 rotationAxis.Normalize();
3632
3633 //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis);
3634 Vector3 spinforce = new Vector3(rotationAxis.X, rotationAxis.Y, rotationAxis.Z);
3635 spinforce = (spinforce/8) * pa.Mass; // 8 is an arbitrary torque scaling factor
3636 pa.AddAngularForce(spinforce,true);
3637 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
3638 }
3639 } 3613 }
3640 else 3614 else
3641 { 3615 {
3642 NonPhysicalSpinMovement(newOrientation); 3616 // save and update old orientation
3617 Quaternion old = m_rootPart.SpinOldOrientation;
3618 m_rootPart.SpinOldOrientation = newOrientation;
3619 //m_log.Error("[SCENE OBJECT GROUP]: Old orientation is " + old);
3620 //m_log.Error("[SCENE OBJECT GROUP]: Incoming new orientation is " + newOrientation);
3621
3622 // compute difference between previous old rotation and new incoming rotation
3623 Quaternion minimalRotationFromQ1ToQ2 = newOrientation * Quaternion.Inverse(old);
3624
3625 float rotationAngle;
3626 Vector3 spinforce;
3627 minimalRotationFromQ1ToQ2.GetAxisAngle(out spinforce, out rotationAngle);
3628 if(Math.Abs(rotationAngle)< 0.001)
3629 return;
3630
3631 spinforce.Normalize();
3632
3633 //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis);
3634 if(rotationAngle > 0)
3635 spinforce = spinforce * pa.Mass * 0.1f; // 0.1 is an arbitrary torque scaling factor
3636 else
3637 spinforce = spinforce * pa.Mass * -0.1f; // 0.1 is an arbitrary torque scaling
3638 pa.AddAngularForce(spinforce,true);
3639 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
3643 } 3640 }
3644 } 3641 }
3645 else 3642 else
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index cb7422b..bb6e89b 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3335,11 +3335,16 @@ namespace OpenSim.Region.Framework.Scenes
3335 Velocity = Vector3.Zero; 3335 Velocity = Vector3.Zero;
3336 m_AngularVelocity = Vector3.Zero; 3336 m_AngularVelocity = Vector3.Zero;
3337 3337
3338 m_requestedSitTargetID = 0;
3339 part.AddSittingAvatar(this);
3340
3341 ParentPart = part;
3342 ParentID = part.LocalId;
3343
3338 Vector3 cameraAtOffset = part.GetCameraAtOffset(); 3344 Vector3 cameraAtOffset = part.GetCameraAtOffset();
3339 Vector3 cameraEyeOffset = part.GetCameraEyeOffset(); 3345 Vector3 cameraEyeOffset = part.GetCameraEyeOffset();
3340 bool forceMouselook = part.GetForceMouselook(); 3346 bool forceMouselook = part.GetForceMouselook();
3341 3347
3342
3343 if (!part.IsRoot) 3348 if (!part.IsRoot)
3344 { 3349 {
3345 Orientation = part.RotationOffset * Orientation; 3350 Orientation = part.RotationOffset * Orientation;
@@ -3365,13 +3370,7 @@ namespace OpenSim.Region.Framework.Scenes
3365 3370
3366 ControllingClient.SendSitResponse( 3371 ControllingClient.SendSitResponse(
3367 part.ParentGroup.UUID, offset, Orientation, true, cameraAtOffset, cameraEyeOffset, forceMouselook); 3372 part.ParentGroup.UUID, offset, Orientation, true, cameraAtOffset, cameraEyeOffset, forceMouselook);
3368
3369 3373
3370 m_requestedSitTargetID = 0;
3371 part.AddSittingAvatar(this);
3372
3373 ParentPart = part;
3374 ParentID = part.LocalId;
3375 3374
3376 SendAvatarDataToAllAgents(); 3375 SendAvatarDataToAllAgents();
3377 3376
@@ -5560,6 +5559,13 @@ namespace OpenSim.Region.Framework.Scenes
5560 5559
5561 public void HandleForceReleaseControls(IClientAPI remoteClient, UUID agentID) 5560 public void HandleForceReleaseControls(IClientAPI remoteClient, UUID agentID)
5562 { 5561 {
5562 foreach (ScriptControllers c in scriptedcontrols.Values)
5563 {
5564 SceneObjectGroup sog = m_scene.GetSceneObjectGroup(c.objectID);
5565 if(sog != null && !sog.IsDeleted && sog.RootPart.PhysActor != null)
5566 sog.RootPart.PhysActor.OnPhysicsRequestingCameraData -= physActor_OnPhysicsRequestingCameraData;
5567 }
5568
5563 IgnoredControls = ScriptControlled.CONTROL_ZERO; 5569 IgnoredControls = ScriptControlled.CONTROL_ZERO;
5564 lock (scriptedcontrols) 5570 lock (scriptedcontrols)
5565 { 5571 {
@@ -5568,6 +5574,26 @@ namespace OpenSim.Region.Framework.Scenes
5568 ControllingClient.SendTakeControls(int.MaxValue, false, false); 5574 ControllingClient.SendTakeControls(int.MaxValue, false, false);
5569 } 5575 }
5570 5576
5577 public void HandleRevokePermissions(UUID objectID, uint permissions )
5578 {
5579
5580 // still skeleton code
5581 if((permissions & (16 | 0x8000 )) == 0) //PERMISSION_TRIGGER_ANIMATION | PERMISSION_OVERRIDE_ANIMATIONS
5582 return;
5583 if(objectID == m_scene.RegionInfo.RegionID) // for all objects
5584 {
5585
5586 }
5587 else
5588 {
5589 SceneObjectPart part = m_scene.GetSceneObjectPart(objectID);
5590 if(part != null)
5591 {
5592
5593 }
5594 }
5595 }
5596
5571 public void ClearControls() 5597 public void ClearControls()
5572 { 5598 {
5573 IgnoredControls = ScriptControlled.CONTROL_ZERO; 5599 IgnoredControls = ScriptControlled.CONTROL_ZERO;