diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 36d8c0b..526fab3 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -1161,10 +1161,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1161 | public void CompleteMovement(IClientAPI client, bool openChildAgents) | 1161 | public void CompleteMovement(IClientAPI client, bool openChildAgents) |
1162 | { | 1162 | { |
1163 | // DateTime startTime = DateTime.Now; | 1163 | // DateTime startTime = DateTime.Now; |
1164 | 1164 | ||
1165 | // m_log.DebugFormat( | 1165 | m_log.DebugFormat( |
1166 | // "[SCENE PRESENCE]: Completing movement of {0} into region {1}", | 1166 | "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}", |
1167 | // client.Name, Scene.RegionInfo.RegionName); | 1167 | client.Name, Scene.RegionInfo.RegionName, AbsolutePosition); |
1168 | 1168 | ||
1169 | Vector3 look = Velocity; | 1169 | Vector3 look = Velocity; |
1170 | if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) | 1170 | if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) |
@@ -2383,9 +2383,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2383 | m_lastVelocity = Velocity; | 2383 | m_lastVelocity = Velocity; |
2384 | } | 2384 | } |
2385 | 2385 | ||
2386 | // followed suggestion from mic bowman. reversed the two lines below. | 2386 | 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 | 2387 | ||
2390 | CheckForSignificantMovement(); // sends update to the modules. | 2388 | CheckForSignificantMovement(); // sends update to the modules. |
2391 | } | 2389 | } |
@@ -2741,7 +2739,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2741 | /// </remarks> | 2739 | /// </remarks> |
2742 | protected void CheckForBorderCrossing() | 2740 | protected void CheckForBorderCrossing() |
2743 | { | 2741 | { |
2744 | if (IsChildAgent) | 2742 | // Check that we we are not a child and have a physics actor or we're sitting on something |
2743 | if (IsChildAgent || (ParentID == 0 && PhysicsActor != null || ParentID != 0)) | ||
2745 | return; | 2744 | return; |
2746 | 2745 | ||
2747 | Vector3 pos2 = AbsolutePosition; | 2746 | Vector3 pos2 = AbsolutePosition; |
@@ -2757,7 +2756,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2757 | if (!IsInTransit) | 2756 | if (!IsInTransit) |
2758 | { | 2757 | { |
2759 | // Checks if where it's headed exists a region | 2758 | // Checks if where it's headed exists a region |
2760 | |||
2761 | bool needsTransit = false; | 2759 | bool needsTransit = false; |
2762 | if (m_scene.TestBorderCross(pos2, Cardinals.W)) | 2760 | if (m_scene.TestBorderCross(pos2, Cardinals.W)) |
2763 | { | 2761 | { |
@@ -2828,7 +2826,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2828 | Velocity = Vector3.Zero; | 2826 | Velocity = Vector3.Zero; |
2829 | AbsolutePosition = pos; | 2827 | AbsolutePosition = pos; |
2830 | 2828 | ||
2831 | // m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); | 2829 | m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); |
2832 | 2830 | ||
2833 | AddToPhysicalScene(isFlying); | 2831 | AddToPhysicalScene(isFlying); |
2834 | } | 2832 | } |
@@ -2861,22 +2859,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
2861 | } | 2859 | } |
2862 | } | 2860 | } |
2863 | else | 2861 | else |
2864 | { | 2862 | { |
2865 | // We must remove the agent from the physical scene if it has been placed in transit. If we don't, | ||
2866 | // then this method continues to be called from ScenePresence.Update() until the handover of the client between | ||
2867 | // regions is completed. Since this handover can take more than 1000ms (due to the 1000ms | ||
2868 | // event queue polling response from the server), this results in the avatar pausing on the border | ||
2869 | // for the handover period. | ||
2870 | RemoveFromPhysicalScene(); | ||
2871 | |||
2872 | // This constant has been inferred from experimentation | 2863 | // This constant has been inferred from experimentation |
2873 | // I'm not sure what this value should be, so I tried a few values. | 2864 | // I'm not sure what this value should be, so I tried a few values. |
2874 | timeStep = 0.04f; | 2865 | timeStep = 0.04f; |
2875 | pos2 = AbsolutePosition; | 2866 | pos2 = AbsolutePosition; |
2876 | pos2.X = pos2.X + (vel.X * timeStep); | 2867 | pos2.X = pos2.X + (vel.X * timeStep); |
2877 | pos2.Y = pos2.Y + (vel.Y * timeStep); | 2868 | pos2.Y = pos2.Y + (vel.Y * timeStep); |
2878 | pos2.Z = pos2.Z + (vel.Z * timeStep); | 2869 | // Don't touch the Z |
2879 | m_pos = pos2; | 2870 | m_pos = pos2; |
2871 | m_log.ErrorFormat("m_pos={0}", m_pos); | ||
2880 | } | 2872 | } |
2881 | } | 2873 | } |
2882 | 2874 | ||