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/Scene.cs46
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs325
5 files changed, 209 insertions, 177 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 6666328..0f84da9 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -77,7 +77,15 @@ namespace OpenSim.Region.Framework.Scenes
77 /// Controls whether physics can be applied to prims. Even if false, prims still have entries in a 77 /// Controls whether physics can be applied to prims. Even if false, prims still have entries in a
78 /// PhysicsScene in order to perform collision detection 78 /// PhysicsScene in order to perform collision detection
79 /// </summary> 79 /// </summary>
80 public bool m_physicalPrim; 80 public bool PhysicalPrims { get; private set; }
81
82 /// <summary>
83 /// Controls whether prims can be collided with.
84 /// </summary>
85 /// <remarks>
86 /// If this is set to false then prims cannot be subject to physics either.
87 /// </summary>
88 public bool CollidablePrims { get; private set; }
81 89
82 public float m_maxNonphys = 256; 90 public float m_maxNonphys = 256;
83 public float m_maxPhys = 10; 91 public float m_maxPhys = 10;
@@ -650,7 +658,8 @@ namespace OpenSim.Region.Framework.Scenes
650 //Animation states 658 //Animation states
651 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); 659 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
652 660
653 m_physicalPrim = startupConfig.GetBoolean("physical_prim", true); 661 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
662 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
654 663
655 m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); 664 m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys);
656 if (RegionInfo.NonphysPrimMax > 0) 665 if (RegionInfo.NonphysPrimMax > 0)
@@ -701,7 +710,7 @@ namespace OpenSim.Region.Framework.Scenes
701 if (maptileRefresh != 0) 710 if (maptileRefresh != 0)
702 { 711 {
703 m_mapGenerationTimer.Interval = maptileRefresh * 1000; 712 m_mapGenerationTimer.Interval = maptileRefresh * 1000;
704 m_mapGenerationTimer.Elapsed += RegenerateMaptile; 713 m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister;
705 m_mapGenerationTimer.AutoReset = true; 714 m_mapGenerationTimer.AutoReset = true;
706 m_mapGenerationTimer.Start(); 715 m_mapGenerationTimer.Start();
707 } 716 }
@@ -1638,21 +1647,17 @@ namespace OpenSim.Region.Framework.Scenes
1638 { 1647 {
1639 m_sceneGridService.SetScene(this); 1648 m_sceneGridService.SetScene(this);
1640 1649
1650 //// Unfortunately this needs to be here and it can't be async.
1651 //// The map tile image is stored in RegionSettings, but it also needs to be
1652 //// stored in the GridService, because that's what the world map module uses
1653 //// to send the map image UUIDs (of other regions) to the viewer...
1654 if (m_generateMaptiles)
1655 RegenerateMaptile();
1656
1641 GridRegion region = new GridRegion(RegionInfo); 1657 GridRegion region = new GridRegion(RegionInfo);
1642 string error = GridService.RegisterRegion(RegionInfo.ScopeID, region); 1658 string error = GridService.RegisterRegion(RegionInfo.ScopeID, region);
1643 if (error != String.Empty) 1659 if (error != String.Empty)
1644 {
1645 throw new Exception(error); 1660 throw new Exception(error);
1646 }
1647
1648 // Generate the maptile asynchronously, because sometimes it can be very slow and we
1649 // don't want this to delay starting the region.
1650 if (m_generateMaptiles)
1651 {
1652 Util.FireAndForget(delegate {
1653 RegenerateMaptile(null, null);
1654 });
1655 }
1656 } 1661 }
1657 1662
1658 #endregion 1663 #endregion
@@ -5023,13 +5028,24 @@ namespace OpenSim.Region.Framework.Scenes
5023 /// </summary> 5028 /// </summary>
5024 /// <param name="sender"></param> 5029 /// <param name="sender"></param>
5025 /// <param name="e"></param> 5030 /// <param name="e"></param>
5026 public void RegenerateMaptile(object sender, ElapsedEventArgs e) 5031 private void RegenerateMaptile()
5027 { 5032 {
5028 IWorldMapModule mapModule = RequestModuleInterface<IWorldMapModule>(); 5033 IWorldMapModule mapModule = RequestModuleInterface<IWorldMapModule>();
5029 if (mapModule != null) 5034 if (mapModule != null)
5030 mapModule.GenerateMaptile(); 5035 mapModule.GenerateMaptile();
5031 } 5036 }
5032 5037
5038 private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e)
5039 {
5040 RegenerateMaptile();
5041
5042 // We need to propagate the new image UUID to the grid service
5043 // so that all simulators can retrieve it
5044 string error = GridService.RegisterRegion(RegionInfo.ScopeID, new GridRegion(RegionInfo));
5045 if (error != string.Empty)
5046 throw new Exception(error);
5047 }
5048
5033 // This method is called across the simulation connector to 5049 // This method is called across the simulation connector to
5034 // determine if a given agent is allowed in this region 5050 // determine if a given agent is allowed in this region
5035 // AS A ROOT AGENT. Returning false here will prevent them 5051 // AS A ROOT AGENT. Returning false here will prevent them
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index a3e4b46..1e2901b 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -333,7 +333,6 @@ namespace OpenSim.Region.Framework.Scenes
333 if (rot != null) 333 if (rot != null)
334 sceneObject.UpdateGroupRotationR((Quaternion)rot); 334 sceneObject.UpdateGroupRotationR((Quaternion)rot);
335 335
336 //group.ApplyPhysics(m_physicalPrim);
337 if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero) 336 if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero)
338 { 337 {
339 sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false); 338 sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index abea788..8860764 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -210,7 +210,7 @@ namespace OpenSim.Region.Framework.Scenes
210 /// </remarks> 210 /// </remarks>
211 public bool UsesPhysics 211 public bool UsesPhysics
212 { 212 {
213 get { return (RootPart.Flags & PrimFlags.TemporaryOnRez) != 0; } 213 get { return (RootPart.Flags & PrimFlags.Physics) != 0; }
214 } 214 }
215 215
216 /// <summary> 216 /// <summary>
@@ -669,7 +669,7 @@ namespace OpenSim.Region.Framework.Scenes
669 //m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID); 669 //m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID);
670 } 670 }
671 671
672 ApplyPhysics(m_scene.m_physicalPrim); 672 ApplyPhysics();
673 673
674 // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled 674 // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled
675 // for the same object with very different properties. The caller must schedule the update. 675 // for the same object with very different properties. The caller must schedule the update.
@@ -1239,8 +1239,7 @@ namespace OpenSim.Region.Framework.Scenes
1239 /// <summary> 1239 /// <summary>
1240 /// Apply physics to this group 1240 /// Apply physics to this group
1241 /// </summary> 1241 /// </summary>
1242 /// <param name="m_physicalPrim"></param> 1242 public void ApplyPhysics()
1243 public void ApplyPhysics(bool m_physicalPrim)
1244 { 1243 {
1245 // Apply physics to the root prim 1244 // Apply physics to the root prim
1246 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive); 1245 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index b29ecc6..aea47e6 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1473,6 +1473,9 @@ namespace OpenSim.Region.Framework.Scenes
1473 /// <param name="VolumeDetectActive"></param> 1473 /// <param name="VolumeDetectActive"></param>
1474 public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive) 1474 public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive)
1475 { 1475 {
1476 if (!ParentGroup.Scene.CollidablePrims)
1477 return;
1478
1476// m_log.DebugFormat( 1479// m_log.DebugFormat(
1477// "[SCENE OBJECT PART]: Applying physics to {0} {1}, m_physicalPrim {2}", 1480// "[SCENE OBJECT PART]: Applying physics to {0} {1}, m_physicalPrim {2}",
1478// Name, LocalId, UUID, m_physicalPrim); 1481// Name, LocalId, UUID, m_physicalPrim);
@@ -1739,7 +1742,7 @@ namespace OpenSim.Region.Framework.Scenes
1739 /// <param name="isNew"></param> 1742 /// <param name="isNew"></param>
1740 public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew) 1743 public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
1741 { 1744 {
1742 if (!ParentGroup.Scene.m_physicalPrim && UsePhysics) 1745 if (!ParentGroup.Scene.PhysicalPrims && UsePhysics)
1743 return; 1746 return;
1744 1747
1745 if (IsJoint()) 1748 if (IsJoint())
@@ -4318,7 +4321,7 @@ namespace OpenSim.Region.Framework.Scenes
4318 if (ParentGroup.Scene == null) 4321 if (ParentGroup.Scene == null)
4319 return; 4322 return;
4320 4323
4321 if (PhysActor == null) 4324 if (ParentGroup.Scene.CollidablePrims && PhysActor == null)
4322 { 4325 {
4323 // It's not phantom anymore. So make sure the physics engine get's knowledge of it 4326 // It's not phantom anymore. So make sure the physics engine get's knowledge of it
4324 PhysActor = ParentGroup.Scene.PhysicsScene.AddPrimShape( 4327 PhysActor = ParentGroup.Scene.PhysicsScene.AddPrimShape(
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index b8ae553..42cd4be 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -118,7 +118,7 @@ namespace OpenSim.Region.Framework.Scenes
118 /// TODO: For some reason, we effectively have a list both here and in Appearance. Need to work out if this is 118 /// TODO: For some reason, we effectively have a list both here and in Appearance. Need to work out if this is
119 /// necessary. 119 /// necessary.
120 /// </remarks> 120 /// </remarks>
121 protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>(); 121 private List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>();
122 122
123 public Object AttachmentsSyncLock { get; private set; } 123 public Object AttachmentsSyncLock { get; private set; }
124 124
@@ -550,8 +550,12 @@ namespace OpenSim.Region.Framework.Scenes
550 } 550 }
551 } 551 }
552 552
553 m_pos = value; 553 // Don't update while sitting
554 ParentPosition = Vector3.Zero; 554 if (ParentID == 0)
555 {
556 m_pos = value;
557 ParentPosition = Vector3.Zero;
558 }
555 559
556 //m_log.DebugFormat( 560 //m_log.DebugFormat(
557 // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", 561 // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}",
@@ -566,6 +570,15 @@ namespace OpenSim.Region.Framework.Scenes
566 public Vector3 OffsetPosition 570 public Vector3 OffsetPosition
567 { 571 {
568 get { return m_pos; } 572 get { return m_pos; }
573 // Don't remove setter. It's not currently used in core but
574 // upcoming Avination code needs it.
575 set
576 {
577 // There is no offset position when not seated
578 if (ParentID == 0)
579 return;
580 m_pos = value;
581 }
569 } 582 }
570 583
571 /// <summary> 584 /// <summary>
@@ -1161,10 +1174,10 @@ namespace OpenSim.Region.Framework.Scenes
1161 public void CompleteMovement(IClientAPI client, bool openChildAgents) 1174 public void CompleteMovement(IClientAPI client, bool openChildAgents)
1162 { 1175 {
1163// DateTime startTime = DateTime.Now; 1176// DateTime startTime = DateTime.Now;
1164 1177
1165// m_log.DebugFormat( 1178 m_log.DebugFormat(
1166// "[SCENE PRESENCE]: Completing movement of {0} into region {1}", 1179 "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}",
1167// client.Name, Scene.RegionInfo.RegionName); 1180 client.Name, Scene.RegionInfo.RegionName, AbsolutePosition);
1168 1181
1169 Vector3 look = Velocity; 1182 Vector3 look = Velocity;
1170 if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) 1183 if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
@@ -2383,9 +2396,7 @@ namespace OpenSim.Region.Framework.Scenes
2383 m_lastVelocity = Velocity; 2396 m_lastVelocity = Velocity;
2384 } 2397 }
2385 2398
2386 // followed suggestion from mic bowman. reversed the two lines below. 2399 CheckForBorderCrossing();
2387 if (ParentID == 0 && PhysicsActor != null || ParentID != 0) // Check that we have a physics actor or we're sitting on something
2388 CheckForBorderCrossing();
2389 2400
2390 CheckForSignificantMovement(); // sends update to the modules. 2401 CheckForSignificantMovement(); // sends update to the modules.
2391 } 2402 }
@@ -2738,143 +2749,146 @@ namespace OpenSim.Region.Framework.Scenes
2738 /// </remarks> 2749 /// </remarks>
2739 protected void CheckForBorderCrossing() 2750 protected void CheckForBorderCrossing()
2740 { 2751 {
2741 if (IsChildAgent) 2752 // Check that we we are not a child
2753 if (IsChildAgent)
2742 return; 2754 return;
2743 2755
2744 Vector3 pos2 = AbsolutePosition; 2756 // If we don't have a PhysActor, we can't cross anyway
2745 Vector3 vel = Velocity; 2757 // Also don't do this while sat, sitting avatars cross with the
2746 int neighbor = 0; 2758 // object they sit on.
2747 int[] fix = new int[2]; 2759 if (ParentID != 0 || PhysicsActor == null)
2748 2760 return;
2749 float timeStep = 0.1f;
2750 pos2.X = pos2.X + (vel.X*timeStep);
2751 pos2.Y = pos2.Y + (vel.Y*timeStep);
2752 pos2.Z = pos2.Z + (vel.Z*timeStep);
2753 2761
2754 if (!IsInTransit) 2762 if (!IsInTransit)
2755 { 2763 {
2756 // Checks if where it's headed exists a region 2764 Vector3 pos2 = AbsolutePosition;
2765 Vector3 vel = Velocity;
2766 int neighbor = 0;
2767 int[] fix = new int[2];
2757 2768
2758 bool needsTransit = false; 2769 float timeStep = 0.1f;
2759 if (m_scene.TestBorderCross(pos2, Cardinals.W)) 2770 pos2.X = pos2.X + (vel.X * timeStep);
2771 pos2.Y = pos2.Y + (vel.Y * timeStep);
2772 pos2.Z = pos2.Z + (vel.Z * timeStep);
2773
2774 if (!IsInTransit)
2760 { 2775 {
2761 if (m_scene.TestBorderCross(pos2, Cardinals.S)) 2776 // Checks if where it's headed exists a region
2762 { 2777 bool needsTransit = false;
2763 needsTransit = true; 2778 if (m_scene.TestBorderCross(pos2, Cardinals.W))
2764 neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix);
2765 }
2766 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2767 { 2779 {
2768 needsTransit = true; 2780 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2769 neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix); 2781 {
2782 needsTransit = true;
2783 neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix);
2784 }
2785 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2786 {
2787 needsTransit = true;
2788 neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix);
2789 }
2790 else
2791 {
2792 needsTransit = true;
2793 neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix);
2794 }
2770 } 2795 }
2771 else 2796 else if (m_scene.TestBorderCross(pos2, Cardinals.E))
2772 { 2797 {
2773 needsTransit = true; 2798 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2774 neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix); 2799 {
2800 needsTransit = true;
2801 neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix);
2802 }
2803 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2804 {
2805 needsTransit = true;
2806 neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix);
2807 }
2808 else
2809 {
2810 needsTransit = true;
2811 neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix);
2812 }
2775 } 2813 }
2776 } 2814 else if (m_scene.TestBorderCross(pos2, Cardinals.S))
2777 else if (m_scene.TestBorderCross(pos2, Cardinals.E))
2778 {
2779 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2780 { 2815 {
2781 needsTransit = true; 2816 needsTransit = true;
2782 neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix); 2817 neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix);
2783 } 2818 }
2784 else if (m_scene.TestBorderCross(pos2, Cardinals.N)) 2819 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2785 { 2820 {
2786 needsTransit = true; 2821 needsTransit = true;
2787 neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix); 2822 neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix);
2788 } 2823 }
2789 else
2790 {
2791 needsTransit = true;
2792 neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix);
2793 }
2794 }
2795 else if (m_scene.TestBorderCross(pos2, Cardinals.S))
2796 {
2797 needsTransit = true;
2798 neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix);
2799 }
2800 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2801 {
2802 needsTransit = true;
2803 neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix);
2804 }
2805 2824
2806 // Makes sure avatar does not end up outside region 2825 // Makes sure avatar does not end up outside region
2807 if (neighbor <= 0) 2826 if (neighbor <= 0)
2808 {
2809 if (needsTransit)
2810 { 2827 {
2811 if (m_requestedSitTargetUUID == UUID.Zero) 2828 if (needsTransit)
2812 { 2829 {
2813 bool isFlying = Flying; 2830 if (m_requestedSitTargetUUID == UUID.Zero)
2814 RemoveFromPhysicalScene(); 2831 {
2815 2832 bool isFlying = Flying;
2816 Vector3 pos = AbsolutePosition; 2833 RemoveFromPhysicalScene();
2817 if (AbsolutePosition.X < 0) 2834
2818 pos.X += Velocity.X * 2; 2835 Vector3 pos = AbsolutePosition;
2819 else if (AbsolutePosition.X > Constants.RegionSize) 2836 if (AbsolutePosition.X < 0)
2820 pos.X -= Velocity.X * 2; 2837 pos.X += Velocity.X * 2;
2821 if (AbsolutePosition.Y < 0) 2838 else if (AbsolutePosition.X > Constants.RegionSize)
2822 pos.Y += Velocity.Y * 2; 2839 pos.X -= Velocity.X * 2;
2823 else if (AbsolutePosition.Y > Constants.RegionSize) 2840 if (AbsolutePosition.Y < 0)
2824 pos.Y -= Velocity.Y * 2; 2841 pos.Y += Velocity.Y * 2;
2825 Velocity = Vector3.Zero; 2842 else if (AbsolutePosition.Y > Constants.RegionSize)
2826 AbsolutePosition = pos; 2843 pos.Y -= Velocity.Y * 2;
2827 2844 Velocity = Vector3.Zero;
2828// m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); 2845 AbsolutePosition = pos;
2829 2846
2830 AddToPhysicalScene(isFlying); 2847// m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition);
2848
2849 AddToPhysicalScene(isFlying);
2850 }
2831 } 2851 }
2832 } 2852 }
2833 } 2853 else if (neighbor > 0)
2834 else if (neighbor > 0)
2835 {
2836 if (!CrossToNewRegion())
2837 { 2854 {
2838 if (m_requestedSitTargetUUID == UUID.Zero) 2855 if (!CrossToNewRegion())
2839 { 2856 {
2840 bool isFlying = Flying; 2857 if (m_requestedSitTargetUUID == UUID.Zero)
2841 RemoveFromPhysicalScene(); 2858 {
2842 2859 bool isFlying = Flying;
2843 Vector3 pos = AbsolutePosition; 2860 RemoveFromPhysicalScene();
2844 if (AbsolutePosition.X < 0) 2861
2845 pos.X += Velocity.X * 2; 2862 Vector3 pos = AbsolutePosition;
2846 else if (AbsolutePosition.X > Constants.RegionSize) 2863 if (AbsolutePosition.X < 0)
2847 pos.X -= Velocity.X * 2; 2864 pos.X += Velocity.X * 2;
2848 if (AbsolutePosition.Y < 0) 2865 else if (AbsolutePosition.X > Constants.RegionSize)
2849 pos.Y += Velocity.Y * 2; 2866 pos.X -= Velocity.X * 2;
2850 else if (AbsolutePosition.Y > Constants.RegionSize) 2867 if (AbsolutePosition.Y < 0)
2851 pos.Y -= Velocity.Y * 2; 2868 pos.Y += Velocity.Y * 2;
2852 Velocity = Vector3.Zero; 2869 else if (AbsolutePosition.Y > Constants.RegionSize)
2853 AbsolutePosition = pos; 2870 pos.Y -= Velocity.Y * 2;
2854 2871 Velocity = Vector3.Zero;
2855 AddToPhysicalScene(isFlying); 2872 AbsolutePosition = pos;
2873
2874 AddToPhysicalScene(isFlying);
2875 }
2856 } 2876 }
2857 } 2877 }
2858 } 2878 }
2859 } 2879 else
2860 else 2880 {
2861 { 2881 // This constant has been inferred from experimentation
2862 // We must remove the agent from the physical scene if it has been placed in transit. If we don't, 2882 // I'm not sure what this value should be, so I tried a few values.
2863 // then this method continues to be called from ScenePresence.Update() until the handover of the client between 2883 timeStep = 0.04f;
2864 // regions is completed. Since this handover can take more than 1000ms (due to the 1000ms 2884 pos2 = AbsolutePosition;
2865 // event queue polling response from the server), this results in the avatar pausing on the border 2885 pos2.X = pos2.X + (vel.X * timeStep);
2866 // for the handover period. 2886 pos2.Y = pos2.Y + (vel.Y * timeStep);
2867 RemoveFromPhysicalScene(); 2887 // Don't touch the Z
2868 2888 m_pos = pos2;
2869 // This constant has been inferred from experimentation 2889 m_log.DebugFormat("[SCENE PRESENCE]: In transit m_pos={0}", m_pos);
2870 // I'm not sure what this value should be, so I tried a few values. 2890 }
2871 timeStep = 0.04f; 2891 }
2872 pos2 = AbsolutePosition;
2873 pos2.X = pos2.X + (vel.X * timeStep);
2874 pos2.Y = pos2.Y + (vel.Y * timeStep);
2875 pos2.Z = pos2.Z + (vel.Z * timeStep);
2876 m_pos = pos2;
2877 }
2878 } 2892 }
2879 2893
2880 /// <summary> 2894 /// <summary>
@@ -3104,30 +3118,28 @@ namespace OpenSim.Region.Framework.Scenes
3104 catch { } 3118 catch { }
3105 3119
3106 // Attachment objects 3120 // Attachment objects
3107 lock (m_attachments) 3121 List<SceneObjectGroup> attachments = GetAttachments();
3122 if (attachments.Count > 0)
3108 { 3123 {
3109 if (m_attachments.Count > 0) 3124 cAgent.AttachmentObjects = new List<ISceneObject>();
3110 { 3125 cAgent.AttachmentObjectStates = new List<string>();
3111 cAgent.AttachmentObjects = new List<ISceneObject>(); 3126// IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
3112 cAgent.AttachmentObjectStates = new List<string>(); 3127 InTransitScriptStates.Clear();
3113 // IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
3114 InTransitScriptStates.Clear();
3115 3128
3116 foreach (SceneObjectGroup sog in m_attachments) 3129 foreach (SceneObjectGroup sog in attachments)
3117 { 3130 {
3118 // We need to make a copy and pass that copy 3131 // We need to make a copy and pass that copy
3119 // because of transfers withn the same sim 3132 // because of transfers withn the same sim
3120 ISceneObject clone = sog.CloneForNewScene(); 3133 ISceneObject clone = sog.CloneForNewScene();
3121 // Attachment module assumes that GroupPosition holds the offsets...! 3134 // Attachment module assumes that GroupPosition holds the offsets...!
3122 ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos; 3135 ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos;
3123 ((SceneObjectGroup)clone).IsAttachment = false; 3136 ((SceneObjectGroup)clone).IsAttachment = false;
3124 cAgent.AttachmentObjects.Add(clone); 3137 cAgent.AttachmentObjects.Add(clone);
3125 string state = sog.GetStateSnapshot(); 3138 string state = sog.GetStateSnapshot();
3126 cAgent.AttachmentObjectStates.Add(state); 3139 cAgent.AttachmentObjectStates.Add(state);
3127 InTransitScriptStates.Add(state); 3140 InTransitScriptStates.Add(state);
3128 // Let's remove the scripts of the original object here 3141 // Let's remove the scripts of the original object here
3129 sog.RemoveScriptInstances(true); 3142 sog.RemoveScriptInstances(true);
3130 }
3131 } 3143 }
3132 } 3144 }
3133 } 3145 }
@@ -3535,26 +3547,29 @@ namespace OpenSim.Region.Framework.Scenes
3535 /// <param name="args">The arguments for the event</param> 3547 /// <param name="args">The arguments for the event</param>
3536 public void SendScriptEventToAttachments(string eventName, Object[] args) 3548 public void SendScriptEventToAttachments(string eventName, Object[] args)
3537 { 3549 {
3538 if (m_scriptEngines.Length == 0) 3550 Util.FireAndForget(delegate(object x)
3539 return;
3540
3541 lock (m_attachments)
3542 { 3551 {
3543 foreach (SceneObjectGroup grp in m_attachments) 3552 if (m_scriptEngines.Length == 0)
3553 return;
3554
3555 lock (m_attachments)
3544 { 3556 {
3545 // 16384 is CHANGED_ANIMATION 3557 foreach (SceneObjectGroup grp in m_attachments)
3546 //
3547 // Send this to all attachment root prims
3548 //
3549 foreach (IScriptModule m in m_scriptEngines)
3550 { 3558 {
3551 if (m == null) // No script engine loaded 3559 // 16384 is CHANGED_ANIMATION
3552 continue; 3560 //
3561 // Send this to all attachment root prims
3562 //
3563 foreach (IScriptModule m in m_scriptEngines)
3564 {
3565 if (m == null) // No script engine loaded
3566 continue;
3553 3567
3554 m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION }); 3568 m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION });
3569 }
3555 } 3570 }
3556 } 3571 }
3557 } 3572 });
3558 } 3573 }
3559 3574
3560 internal void PushForce(Vector3 impulse) 3575 internal void PushForce(Vector3 impulse)