aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs49
3 files changed, 43 insertions, 14 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
index 45ca5c5..3eb38b8 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
@@ -42,7 +42,7 @@ namespace OpenSim.Region.Framework.Interfaces
42 42
43 bool TeleportHome(UUID id, IClientAPI client); 43 bool TeleportHome(UUID id, IClientAPI client);
44 44
45 void Cross(ScenePresence agent, bool isFlying); 45 bool Cross(ScenePresence agent, bool isFlying);
46 46
47 void AgentArrivedAtDestination(UUID agent); 47 void AgentArrivedAtDestination(UUID agent);
48 48
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index bb9a748..5caf06c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -4022,14 +4022,16 @@ namespace OpenSim.Region.Framework.Scenes
4022 RequestTeleportLocation(remoteClient, info.RegionHandle, position, Vector3.Zero, (uint)(TPFlags.SetLastToTarget | TPFlags.ViaLandmark)); 4022 RequestTeleportLocation(remoteClient, info.RegionHandle, position, Vector3.Zero, (uint)(TPFlags.SetLastToTarget | TPFlags.ViaLandmark));
4023 } 4023 }
4024 4024
4025 public void CrossAgentToNewRegion(ScenePresence agent, bool isFlying) 4025 public bool CrossAgentToNewRegion(ScenePresence agent, bool isFlying)
4026 { 4026 {
4027 if (m_teleportModule != null) 4027 if (m_teleportModule != null)
4028 m_teleportModule.Cross(agent, isFlying); 4028 return m_teleportModule.Cross(agent, isFlying);
4029 else 4029 else
4030 { 4030 {
4031 m_log.DebugFormat("[SCENE]: Unable to cross agent to neighbouring region, because there is no AgentTransferModule"); 4031 m_log.DebugFormat("[SCENE]: Unable to cross agent to neighbouring region, because there is no AgentTransferModule");
4032 } 4032 }
4033
4034 return false;
4033 } 4035 }
4034 4036
4035 public void SendOutChildAgentUpdates(AgentPosition cadu, ScenePresence presence) 4037 public void SendOutChildAgentUpdates(AgentPosition cadu, ScenePresence presence)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index db9a95b..a1ca9c5 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3102,29 +3102,57 @@ namespace OpenSim.Region.Framework.Scenes
3102 // Makes sure avatar does not end up outside region 3102 // Makes sure avatar does not end up outside region
3103 if (neighbor <= 0) 3103 if (neighbor <= 0)
3104 { 3104 {
3105 if (!needsTransit) 3105 if (needsTransit)
3106 { 3106 {
3107 if (m_requestedSitTargetUUID == UUID.Zero) 3107 if (m_requestedSitTargetUUID == UUID.Zero)
3108 { 3108 {
3109 bool isFlying = m_physicsActor.Flying;
3110 RemoveFromPhysicalScene();
3111
3109 Vector3 pos = AbsolutePosition; 3112 Vector3 pos = AbsolutePosition;
3110 if (AbsolutePosition.X < 0) 3113 if (AbsolutePosition.X < 0)
3111 pos.X += Velocity.X; 3114 pos.X += Velocity.X * 2;
3112 else if (AbsolutePosition.X > Constants.RegionSize) 3115 else if (AbsolutePosition.X > Constants.RegionSize)
3113 pos.X -= Velocity.X; 3116 pos.X -= Velocity.X * 2;
3114 if (AbsolutePosition.Y < 0) 3117 if (AbsolutePosition.Y < 0)
3115 pos.Y += Velocity.Y; 3118 pos.Y += Velocity.Y * 2;
3116 else if (AbsolutePosition.Y > Constants.RegionSize) 3119 else if (AbsolutePosition.Y > Constants.RegionSize)
3117 pos.Y -= Velocity.Y; 3120 pos.Y -= Velocity.Y * 2;
3121 Velocity = Vector3.Zero;
3118 AbsolutePosition = pos; 3122 AbsolutePosition = pos;
3123
3124 AddToPhysicalScene(isFlying);
3119 } 3125 }
3120 } 3126 }
3121 } 3127 }
3122 else if (neighbor > 0) 3128 else if (neighbor > 0)
3123 CrossToNewRegion(); 3129 {
3130 if (!CrossToNewRegion())
3131 {
3132 if (m_requestedSitTargetUUID == UUID.Zero)
3133 {
3134 bool isFlying = m_physicsActor.Flying;
3135 RemoveFromPhysicalScene();
3136
3137 Vector3 pos = AbsolutePosition;
3138 if (AbsolutePosition.X < 0)
3139 pos.X += Velocity.X * 2;
3140 else if (AbsolutePosition.X > Constants.RegionSize)
3141 pos.X -= Velocity.X * 2;
3142 if (AbsolutePosition.Y < 0)
3143 pos.Y += Velocity.Y * 2;
3144 else if (AbsolutePosition.Y > Constants.RegionSize)
3145 pos.Y -= Velocity.Y * 2;
3146 Velocity = Vector3.Zero;
3147 AbsolutePosition = pos;
3148
3149 AddToPhysicalScene(isFlying);
3150 }
3151 }
3152 }
3124 } 3153 }
3125 else 3154 else
3126 { 3155 {
3127 RemoveFromPhysicalScene();
3128 // This constant has been inferred from experimentation 3156 // This constant has been inferred from experimentation
3129 // I'm not sure what this value should be, so I tried a few values. 3157 // I'm not sure what this value should be, so I tried a few values.
3130 timeStep = 0.04f; 3158 timeStep = 0.04f;
@@ -3173,16 +3201,15 @@ namespace OpenSim.Region.Framework.Scenes
3173 /// If the neighbor accepts, remove the agent's viewable avatar from this scene 3201 /// If the neighbor accepts, remove the agent's viewable avatar from this scene
3174 /// set them to a child agent. 3202 /// set them to a child agent.
3175 /// </summary> 3203 /// </summary>
3176 protected void CrossToNewRegion() 3204 protected bool CrossToNewRegion()
3177 { 3205 {
3178 InTransit();
3179 try 3206 try
3180 { 3207 {
3181 m_scene.CrossAgentToNewRegion(this, m_physicsActor.Flying); 3208 return m_scene.CrossAgentToNewRegion(this, m_physicsActor.Flying);
3182 } 3209 }
3183 catch 3210 catch
3184 { 3211 {
3185 m_scene.CrossAgentToNewRegion(this, false); 3212 return m_scene.CrossAgentToNewRegion(this, false);
3186 } 3213 }
3187 } 3214 }
3188 3215