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/SceneObjectGroup.cs66
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs55
2 files changed, 104 insertions, 17 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 42b6bc5..a6ce0e2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -465,7 +465,15 @@ namespace OpenSim.Region.Framework.Scenes
465 { 465 {
466 return (IsAttachment || (m_rootPart.Shape.PCode == 9 && m_rootPart.Shape.State != 0)); 466 return (IsAttachment || (m_rootPart.Shape.PCode == 9 && m_rootPart.Shape.State != 0));
467 } 467 }
468 468
469
470
471 private struct avtocrossInfo
472 {
473 public ScenePresence av;
474 public uint ParentID;
475 }
476
469 /// <summary> 477 /// <summary>
470 /// The absolute position of this scene object in the scene 478 /// The absolute position of this scene object in the scene
471 /// </summary> 479 /// </summary>
@@ -517,15 +525,24 @@ namespace OpenSim.Region.Framework.Scenes
517 { 525 {
518 // We unparent the SP quietly so that it won't 526 // We unparent the SP quietly so that it won't
519 // be made to stand up 527 // be made to stand up
528
529 List<avtocrossInfo> avsToCross = new List<avtocrossInfo>();
530
520 foreach (ScenePresence av in m_linkedAvatars) 531 foreach (ScenePresence av in m_linkedAvatars)
521 { 532 {
533 avtocrossInfo avinfo = new avtocrossInfo();
522 SceneObjectPart parentPart = m_scene.GetSceneObjectPart(av.ParentID); 534 SceneObjectPart parentPart = m_scene.GetSceneObjectPart(av.ParentID);
523 if (parentPart != null) 535 if (parentPart != null)
524 av.ParentUUID = parentPart.UUID; 536 av.ParentUUID = parentPart.UUID;
525 537
538 avinfo.av = av;
539 avinfo.ParentID = av.ParentID;
540 avsToCross.Add(avinfo);
541
526 av.ParentID = 0; 542 av.ParentID = 0;
527 } 543 }
528 544
545// m_linkedAvatars.Clear();
529 m_scene.CrossPrimGroupIntoNewRegion(val, this, true); 546 m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
530 547
531 // Normalize 548 // Normalize
@@ -541,18 +558,37 @@ namespace OpenSim.Region.Framework.Scenes
541 // If it's deleted, crossing was successful 558 // If it's deleted, crossing was successful
542 if (IsDeleted) 559 if (IsDeleted)
543 { 560 {
544 foreach (ScenePresence av in m_linkedAvatars) 561 // foreach (ScenePresence av in m_linkedAvatars)
562 foreach (avtocrossInfo avinfo in avsToCross)
545 { 563 {
546 m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar {0} to {1}", av.Name, val); 564 ScenePresence av = avinfo.av;
547 565 if (!av.IsInTransit) // just in case...
548 av.IsInTransit = true; 566 {
549 567 m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar {0} to {1}", av.Name, val);
550 CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync; 568
551 d.BeginInvoke(av, val, x, y, destination, av.Flying, version, CrossAgentToNewRegionCompleted, d); 569 av.IsInTransit = true;
570
571 CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync;
572 d.BeginInvoke(av, val, x, y, destination, av.Flying, version, CrossAgentToNewRegionCompleted, d);
573 }
574 else
575 m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar alreasy in transit {0} to {1}", av.Name, val);
552 } 576 }
553 577 avsToCross.Clear();
554 return; 578 return;
555 } 579 }
580 else // cross failed, put avas back ??
581 {
582 foreach (avtocrossInfo avinfo in avsToCross)
583 {
584 ScenePresence av = avinfo.av;
585 av.ParentUUID = UUID.Zero;
586 av.ParentID = avinfo.ParentID;
587// m_linkedAvatars.Add(av);
588 }
589 }
590 avsToCross.Clear();
591
556 } 592 }
557 else if (RootPart.PhysActor != null) 593 else if (RootPart.PhysActor != null)
558 { 594 {
@@ -565,6 +601,7 @@ namespace OpenSim.Region.Framework.Scenes
565 val.Z = Util.Clamp<float>(oldp.Z, 0.5f, 4096.0f); 601 val.Z = Util.Clamp<float>(oldp.Z, 0.5f, 4096.0f);
566 } 602 }
567 } 603 }
604
568/* don't see the need but worse don't see where is restored to false if things stay in 605/* don't see the need but worse don't see where is restored to false if things stay in
569 foreach (SceneObjectPart part in m_parts.GetArray()) 606 foreach (SceneObjectPart part in m_parts.GetArray())
570 { 607 {
@@ -640,9 +677,12 @@ namespace OpenSim.Region.Framework.Scenes
640 { 677 {
641 agent.ParentPart = null; 678 agent.ParentPart = null;
642 agent.ParentPosition = Vector3.Zero; 679 agent.ParentPosition = Vector3.Zero;
680 // agent.ParentUUID = UUID.Zero;
643 } 681 }
644 } 682 }
645 683
684 agent.ParentUUID = UUID.Zero;
685
646// agent.Reset(); 686// agent.Reset();
647// else // Not successful 687// else // Not successful
648// agent.RestoreInCurrentScene(); 688// agent.RestoreInCurrentScene();
@@ -1779,15 +1819,14 @@ namespace OpenSim.Region.Framework.Scenes
1779 part.ClearUpdateSchedule(); 1819 part.ClearUpdateSchedule();
1780 if (part == m_rootPart) 1820 if (part == m_rootPart)
1781 { 1821 {
1782 if (!IsAttachment || (AttachedAvatar == avatar.ControllingClient.AgentId) || 1822 if (!IsAttachment || (AttachedAvatar == avatar.ControllingClient.AgentId) ||
1783 (AttachmentPoint < 31) || (AttachmentPoint > 38)) 1823 (AttachmentPoint < 31) || (AttachmentPoint > 38))
1784 avatar.ControllingClient.SendKillObject(m_regionHandle, new List<uint> { part.LocalId }); 1824 avatar.ControllingClient.SendKillObject(m_regionHandle, new List<uint> { part.LocalId });
1785 } 1825 }
1786 } 1826 }
1787 }); 1827 });
1788 } 1828 }
1789 1829
1790
1791 } 1830 }
1792 1831
1793 public void AddScriptLPS(int count) 1832 public void AddScriptLPS(int count)
@@ -2069,6 +2108,9 @@ namespace OpenSim.Region.Framework.Scenes
2069 dupe.m_isBackedUp = false; 2108 dupe.m_isBackedUp = false;
2070 dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>(); 2109 dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>();
2071 2110
2111 // new group as no sitting avatars
2112 dupe.m_linkedAvatars = new List<ScenePresence>();
2113
2072 // Warning, The following code related to previousAttachmentStatus is needed so that clones of 2114 // Warning, The following code related to previousAttachmentStatus is needed so that clones of
2073 // attachments do not bordercross while they're being duplicated. This is hacktastic! 2115 // attachments do not bordercross while they're being duplicated. This is hacktastic!
2074 // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region! 2116 // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5e275f6..5a6fb6c 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -63,6 +63,7 @@ namespace OpenSim.Region.Framework.Scenes
63 63
64 struct ScriptControllers 64 struct ScriptControllers
65 { 65 {
66 public UUID objectID;
66 public UUID itemID; 67 public UUID itemID;
67 public ScriptControlled ignoreControls; 68 public ScriptControlled ignoreControls;
68 public ScriptControlled eventControls; 69 public ScriptControlled eventControls;
@@ -756,7 +757,13 @@ namespace OpenSim.Region.Framework.Scenes
756 m_movementAnimationUpdateCounter = 0; 757 m_movementAnimationUpdateCounter = 0;
757 if (Animator != null) 758 if (Animator != null)
758 { 759 {
759 if(ParentID == 0 && !SitGround) // skip it if sitting 760 // If the parentID == 0 we are not sitting
761 // if !SitGournd then we are not sitting on the ground
762 // Fairly straightforward, now here comes the twist
763 // if ParentUUID is NOT UUID.Zero, we are looking to
764 // be sat on an object that isn't there yet. Should
765 // be treated as if sat.
766 if(ParentID == 0 && !SitGround && ParentUUID == UUID.Zero) // skip it if sitting
760 Animator.UpdateMovementAnimations(); 767 Animator.UpdateMovementAnimations();
761 } 768 }
762 else 769 else
@@ -923,7 +930,15 @@ namespace OpenSim.Region.Framework.Scenes
923 } 930 }
924 AbsolutePosition = pos; 931 AbsolutePosition = pos;
925 932
926 AddToPhysicalScene(isFlying); 933 if (m_teleportFlags == TeleportFlags.Default)
934 {
935 Vector3 vel = Velocity;
936 AddToPhysicalScene(isFlying);
937 if (PhysicsActor != null)
938 PhysicsActor.SetMomentum(vel);
939 }
940 else
941 AddToPhysicalScene(isFlying);
927 942
928 if (ForceFly) 943 if (ForceFly)
929 { 944 {
@@ -974,6 +989,7 @@ namespace OpenSim.Region.Framework.Scenes
974 // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will 989 // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will
975 // stall on the border crossing since the existing child agent will still have the last movement 990 // stall on the border crossing since the existing child agent will still have the last movement
976 // recorded, which stops the input from being processed. 991 // recorded, which stops the input from being processed.
992
977 MovementFlag = 0; 993 MovementFlag = 0;
978 994
979 m_scene.EventManager.TriggerOnMakeRootAgent(this); 995 m_scene.EventManager.TriggerOnMakeRootAgent(this);
@@ -1014,6 +1030,8 @@ namespace OpenSim.Region.Framework.Scenes
1014 // as teleporting back 1030 // as teleporting back
1015 TeleportFlags = TeleportFlags.Default; 1031 TeleportFlags = TeleportFlags.Default;
1016 1032
1033 MovementFlag = 0;
1034
1017 // It looks like Animator is set to null somewhere, and MakeChild 1035 // It looks like Animator is set to null somewhere, and MakeChild
1018 // is called after that. Probably in aborted teleports. 1036 // is called after that. Probably in aborted teleports.
1019 if (Animator == null) 1037 if (Animator == null)
@@ -1021,6 +1039,7 @@ namespace OpenSim.Region.Framework.Scenes
1021 else 1039 else
1022 Animator.ResetAnimations(); 1040 Animator.ResetAnimations();
1023 1041
1042
1024// m_log.DebugFormat( 1043// m_log.DebugFormat(
1025// "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", 1044// "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}",
1026// Name, UUID, m_scene.RegionInfo.RegionName); 1045// Name, UUID, m_scene.RegionInfo.RegionName);
@@ -1047,9 +1066,9 @@ namespace OpenSim.Region.Framework.Scenes
1047 { 1066 {
1048// PhysicsActor.OnRequestTerseUpdate -= SendTerseUpdateToAllClients; 1067// PhysicsActor.OnRequestTerseUpdate -= SendTerseUpdateToAllClients;
1049 PhysicsActor.OnOutOfBounds -= OutOfBoundsCall; 1068 PhysicsActor.OnOutOfBounds -= OutOfBoundsCall;
1050 m_scene.PhysicsScene.RemoveAvatar(PhysicsActor);
1051 PhysicsActor.UnSubscribeEvents();
1052 PhysicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate; 1069 PhysicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate;
1070 PhysicsActor.UnSubscribeEvents();
1071 m_scene.PhysicsScene.RemoveAvatar(PhysicsActor);
1053 PhysicsActor = null; 1072 PhysicsActor = null;
1054 } 1073 }
1055// else 1074// else
@@ -1885,6 +1904,8 @@ namespace OpenSim.Region.Framework.Scenes
1885 if (ParentID != 0) 1904 if (ParentID != 0)
1886 { 1905 {
1887 SceneObjectPart part = ParentPart; 1906 SceneObjectPart part = ParentPart;
1907 UnRegisterSeatControls(part.ParentGroup.UUID);
1908
1888 TaskInventoryDictionary taskIDict = part.TaskInventory; 1909 TaskInventoryDictionary taskIDict = part.TaskInventory;
1889 if (taskIDict != null) 1910 if (taskIDict != null)
1890 { 1911 {
@@ -3212,7 +3233,7 @@ namespace OpenSim.Region.Framework.Scenes
3212 3233
3213 foreach (ScriptControllers c in scriptedcontrols.Values) 3234 foreach (ScriptControllers c in scriptedcontrols.Values)
3214 { 3235 {
3215 controls[i++] = new ControllerData(c.itemID, (uint)c.ignoreControls, (uint)c.eventControls); 3236 controls[i++] = new ControllerData(c.objectID, c.itemID, (uint)c.ignoreControls, (uint)c.eventControls);
3216 } 3237 }
3217 cAgent.Controllers = controls; 3238 cAgent.Controllers = controls;
3218 } 3239 }
@@ -3223,6 +3244,7 @@ namespace OpenSim.Region.Framework.Scenes
3223 cAgent.Anims = Animator.Animations.ToArray(); 3244 cAgent.Anims = Animator.Animations.ToArray();
3224 } 3245 }
3225 catch { } 3246 catch { }
3247 cAgent.DefaultAnim = Animator.Animations.DefaultAnimation;
3226 3248
3227 // Attachment objects 3249 // Attachment objects
3228 List<SceneObjectGroup> attachments = GetAttachments(); 3250 List<SceneObjectGroup> attachments = GetAttachments();
@@ -3302,6 +3324,7 @@ namespace OpenSim.Region.Framework.Scenes
3302 foreach (ControllerData c in cAgent.Controllers) 3324 foreach (ControllerData c in cAgent.Controllers)
3303 { 3325 {
3304 ScriptControllers sc = new ScriptControllers(); 3326 ScriptControllers sc = new ScriptControllers();
3327 sc.objectID = c.ObjectID;
3305 sc.itemID = c.ItemID; 3328 sc.itemID = c.ItemID;
3306 sc.ignoreControls = (ScriptControlled)c.IgnoreControls; 3329 sc.ignoreControls = (ScriptControlled)c.IgnoreControls;
3307 sc.eventControls = (ScriptControlled)c.EventControls; 3330 sc.eventControls = (ScriptControlled)c.EventControls;
@@ -3316,6 +3339,8 @@ namespace OpenSim.Region.Framework.Scenes
3316 // FIXME: Why is this null check necessary? Where are the cases where we get a null Anims object? 3339 // FIXME: Why is this null check necessary? Where are the cases where we get a null Anims object?
3317 if (cAgent.Anims != null) 3340 if (cAgent.Anims != null)
3318 Animator.Animations.FromArray(cAgent.Anims); 3341 Animator.Animations.FromArray(cAgent.Anims);
3342 if (cAgent.DefaultAnim != null)
3343 Animator.Animations.SetDefaultAnimation(cAgent.DefaultAnim.AnimID, cAgent.DefaultAnim.SequenceNum, UUID.Zero);
3319 3344
3320 if (cAgent.AttachmentObjects != null && cAgent.AttachmentObjects.Count > 0) 3345 if (cAgent.AttachmentObjects != null && cAgent.AttachmentObjects.Count > 0)
3321 { 3346 {
@@ -3791,10 +3816,15 @@ namespace OpenSim.Region.Framework.Scenes
3791 3816
3792 public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID) 3817 public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID)
3793 { 3818 {
3819 SceneObjectPart p = m_scene.GetSceneObjectPart(Obj_localID);
3820 if (p == null)
3821 return;
3822
3794 ScriptControllers obj = new ScriptControllers(); 3823 ScriptControllers obj = new ScriptControllers();
3795 obj.ignoreControls = ScriptControlled.CONTROL_ZERO; 3824 obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
3796 obj.eventControls = ScriptControlled.CONTROL_ZERO; 3825 obj.eventControls = ScriptControlled.CONTROL_ZERO;
3797 3826
3827 obj.objectID = p.ParentGroup.UUID;
3798 obj.itemID = Script_item_UUID; 3828 obj.itemID = Script_item_UUID;
3799 if (pass_on == 0 && accept == 0) 3829 if (pass_on == 0 && accept == 0)
3800 { 3830 {
@@ -3843,6 +3873,21 @@ namespace OpenSim.Region.Framework.Scenes
3843 ControllingClient.SendTakeControls(int.MaxValue, false, false); 3873 ControllingClient.SendTakeControls(int.MaxValue, false, false);
3844 } 3874 }
3845 3875
3876 private void UnRegisterSeatControls(UUID obj)
3877 {
3878 List<UUID> takers = new List<UUID>();
3879
3880 foreach (ScriptControllers c in scriptedcontrols.Values)
3881 {
3882 if (c.objectID == obj)
3883 takers.Add(c.itemID);
3884 }
3885 foreach (UUID t in takers)
3886 {
3887 UnRegisterControlEventsToScript(0, t);
3888 }
3889 }
3890
3846 public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID) 3891 public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID)
3847 { 3892 {
3848 ScriptControllers takecontrols; 3893 ScriptControllers takecontrols;