diff options
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 13 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 22 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 13 |
3 files changed, 32 insertions, 16 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index dbf493c..5a3dc20 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -469,13 +469,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
469 | return; | 469 | return; |
470 | } | 470 | } |
471 | } | 471 | } |
472 | foreach (SceneObjectPart part in m_parts.Values) | 472 | List<SceneObjectPart> parts = new List<SceneObjectPart>(m_parts.Values); |
473 | lockPartsForRead(false); | ||
474 | foreach (SceneObjectPart part in parts) | ||
473 | { | 475 | { |
474 | part.IgnoreUndoUpdate = false; | 476 | part.IgnoreUndoUpdate = false; |
475 | part.StoreUndoState(UndoType.STATE_GROUP_POSITION); | 477 | part.StoreUndoState(UndoType.STATE_GROUP_POSITION); |
476 | part.GroupPosition = val; | 478 | part.GroupPosition = val; |
477 | } | 479 | } |
478 | lockPartsForRead(false); | 480 | |
481 | foreach (ScenePresence av in m_linkedAvatars) | ||
482 | { | ||
483 | Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition; | ||
484 | av.AbsolutePosition += offset; | ||
485 | av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition | ||
486 | av.SendFullUpdateToAllClients(); | ||
487 | } | ||
479 | 488 | ||
480 | //if (m_rootPart.PhysActor != null) | 489 | //if (m_rootPart.PhysActor != null) |
481 | //{ | 490 | //{ |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index ba84b88..badd357 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -682,25 +682,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
682 | 682 | ||
683 | // Tell the physics engines that this prim changed. | 683 | // Tell the physics engines that this prim changed. |
684 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); | 684 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); |
685 | |||
685 | } | 686 | } |
686 | catch (Exception e) | 687 | catch (Exception e) |
687 | { | 688 | { |
688 | m_log.Error("[SCENEOBJECTPART]: GROUP POSITION. " + e.Message); | 689 | m_log.Error("[SCENEOBJECTPART]: GROUP POSITION. " + e.Message); |
689 | } | 690 | } |
690 | } | 691 | } |
691 | |||
692 | // TODO if we decide to do sitting in a more SL compatible way (multiple avatars per prim), this has to be fixed, too | ||
693 | if (m_sitTargetAvatar != UUID.Zero) | ||
694 | { | ||
695 | if (m_parentGroup != null) // TODO can there be a SOP without a SOG? | ||
696 | { | ||
697 | ScenePresence avatar; | ||
698 | if (m_parentGroup.Scene.TryGetScenePresence(m_sitTargetAvatar, out avatar)) | ||
699 | { | ||
700 | avatar.ParentPosition = GetWorldPosition(); | ||
701 | } | ||
702 | } | ||
703 | } | ||
704 | } | 692 | } |
705 | } | 693 | } |
706 | 694 | ||
@@ -709,6 +697,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
709 | get { return m_offsetPosition; } | 697 | get { return m_offsetPosition; } |
710 | set | 698 | set |
711 | { | 699 | { |
700 | Vector3 oldpos = m_offsetPosition; | ||
712 | StoreUndoState(UndoType.STATE_PRIM_POSITION); | 701 | StoreUndoState(UndoType.STATE_PRIM_POSITION); |
713 | m_offsetPosition = value; | 702 | m_offsetPosition = value; |
714 | 703 | ||
@@ -727,7 +716,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
727 | List<ScenePresence> avs = ParentGroup.GetLinkedAvatars(); | 716 | List<ScenePresence> avs = ParentGroup.GetLinkedAvatars(); |
728 | foreach (ScenePresence av in avs) | 717 | foreach (ScenePresence av in avs) |
729 | { | 718 | { |
730 | av.SendFullUpdateToAllClients(); | 719 | if (av.LinkedPrim == m_uuid) |
720 | { | ||
721 | Vector3 offset = (m_offsetPosition - oldpos); | ||
722 | av.OffsetPosition += offset; | ||
723 | av.SendFullUpdateToAllClients(); | ||
724 | } | ||
731 | } | 725 | } |
732 | } | 726 | } |
733 | } | 727 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 5fcd1c2..44c3d12 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -595,11 +595,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
595 | 595 | ||
596 | private uint m_parentID; | 596 | private uint m_parentID; |
597 | 597 | ||
598 | |||
599 | private UUID m_linkedPrim; | ||
600 | |||
598 | public uint ParentID | 601 | public uint ParentID |
599 | { | 602 | { |
600 | get { return m_parentID; } | 603 | get { return m_parentID; } |
601 | set { m_parentID = value; } | 604 | set { m_parentID = value; } |
602 | } | 605 | } |
606 | |||
607 | public UUID LinkedPrim | ||
608 | { | ||
609 | get { return m_linkedPrim; } | ||
610 | set { m_linkedPrim = value; } | ||
611 | } | ||
612 | |||
603 | public float Health | 613 | public float Health |
604 | { | 614 | { |
605 | get { return m_health; } | 615 | get { return m_health; } |
@@ -1835,6 +1845,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1835 | 1845 | ||
1836 | m_parentPosition = Vector3.Zero; | 1846 | m_parentPosition = Vector3.Zero; |
1837 | m_parentID = 0; | 1847 | m_parentID = 0; |
1848 | m_linkedPrim = UUID.Zero; | ||
1838 | m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); | 1849 | m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); |
1839 | SendFullUpdateToAllClients(); | 1850 | SendFullUpdateToAllClients(); |
1840 | m_requestedSitTargetID = 0; | 1851 | m_requestedSitTargetID = 0; |
@@ -2422,6 +2433,8 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos); | |||
2422 | m_parentID = m_requestedSitTargetID; | 2433 | m_parentID = m_requestedSitTargetID; |
2423 | } | 2434 | } |
2424 | 2435 | ||
2436 | m_linkedPrim = part.UUID; | ||
2437 | |||
2425 | Velocity = Vector3.Zero; | 2438 | Velocity = Vector3.Zero; |
2426 | RemoveFromPhysicalScene(); | 2439 | RemoveFromPhysicalScene(); |
2427 | 2440 | ||