aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs')
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs31
1 files changed, 15 insertions, 16 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index fa9cd55..a36d0fe 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -61,8 +61,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
61 set { m_MaxTransferDistance = value; } 61 set { m_MaxTransferDistance = value; }
62 } 62 }
63 63
64 private int m_levelHGTeleport = 0;
65
66 protected bool m_Enabled = false; 64 protected bool m_Enabled = false;
67 protected Scene m_aScene; 65 protected Scene m_aScene;
68 protected List<Scene> m_Scenes = new List<Scene>(); 66 protected List<Scene> m_Scenes = new List<Scene>();
@@ -106,7 +104,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
106 if (transferConfig != null) 104 if (transferConfig != null)
107 { 105 {
108 MaxTransferDistance = transferConfig.GetInt("max_distance", 4095); 106 MaxTransferDistance = transferConfig.GetInt("max_distance", 4095);
109 m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0);
110 } 107 }
111 108
112 m_agentsInTransit = new List<UUID>(); 109 m_agentsInTransit = new List<UUID>();
@@ -172,13 +169,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
172 // Reset animations; the viewer does that in teleports. 169 // Reset animations; the viewer does that in teleports.
173 sp.Animator.ResetAnimations(); 170 sp.Animator.ResetAnimations();
174 171
172 string destinationRegionName = "(not found)";
173
175 try 174 try
176 { 175 {
177 if (regionHandle == sp.Scene.RegionInfo.RegionHandle) 176 if (regionHandle == sp.Scene.RegionInfo.RegionHandle)
178 { 177 {
178 destinationRegionName = sp.Scene.RegionInfo.RegionName;
179
179 m_log.DebugFormat( 180 m_log.DebugFormat(
180 "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation {0} within {1}", 181 "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation for {0} to {1} within existing region {2}",
181 position, sp.Scene.RegionInfo.RegionName); 182 sp.Name, position, destinationRegionName);
182 183
183 // Teleport within the same region 184 // Teleport within the same region
184 if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) 185 if (IsOutsideRegion(sp.Scene, position) || position.Z < 0)
@@ -188,6 +189,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
188 m_log.WarnFormat( 189 m_log.WarnFormat(
189 "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", 190 "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
190 position, sp.Name, sp.UUID, emergencyPos); 191 position, sp.Name, sp.UUID, emergencyPos);
192
191 position = emergencyPos; 193 position = emergencyPos;
192 } 194 }
193 195
@@ -210,6 +212,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
210 sp.ControllingClient.SendTeleportStart(teleportFlags); 212 sp.ControllingClient.SendTeleportStart(teleportFlags);
211 213
212 sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); 214 sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags);
215 sp.Velocity = Vector3.Zero;
213 sp.Teleport(position); 216 sp.Teleport(position);
214 217
215 foreach (SceneObjectGroup grp in sp.GetAttachments()) 218 foreach (SceneObjectGroup grp in sp.GetAttachments())
@@ -233,15 +236,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
233 return; 236 return;
234 } 237 }
235 238
236 // check if HyperGrid teleport is allowed, based on user level 239 destinationRegionName = finalDestination.RegionName;
237 int flags = m_aScene.GridService.GetRegionFlags(sp.Scene.RegionInfo.ScopeID, reg.RegionID);
238
239 if (((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) && (sp.UserLevel < m_levelHGTeleport))
240 {
241 m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination link is non permitted hypergrid region. Unable to teleport agent.");
242 sp.ControllingClient.SendTeleportFailed("HyperGrid teleport not permitted");
243 return;
244 }
245 240
246 uint curX = 0, curY = 0; 241 uint curX = 0, curY = 0;
247 Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY); 242 Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY);
@@ -307,7 +302,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
307 } 302 }
308 catch (Exception e) 303 catch (Exception e)
309 { 304 {
310 m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Exception on teleport: {0} {1}", e.Message, e.StackTrace); 305 m_log.ErrorFormat(
306 "[ENTITY TRANSFER MODULE]: Exception on teleport of {0} from {1}@{2} to {3}@{4}: {5}{6}",
307 sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName,
308 e.Message, e.StackTrace);
309
311 sp.ControllingClient.SendTeleportFailed("Internal error"); 310 sp.ControllingClient.SendTeleportFailed("Internal error");
312 } 311 }
313 } 312 }
@@ -402,7 +401,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
402 bool logout = false; 401 bool logout = false;
403 if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) 402 if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout))
404 { 403 {
405 sp.ControllingClient.SendTeleportFailed(String.Format("Destination refused: {0}", 404 sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}",
406 reason)); 405 reason));
407 return; 406 return;
408 } 407 }