diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 1341533167..d54216a8fe 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -50,6 +50,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ ///
+ /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer.
+ ///
+ public int MaxTransferDistance { get; set; }
+
protected bool m_Enabled = false;
protected Scene m_aScene;
protected List m_Scenes = new List();
@@ -78,13 +83,26 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
string name = moduleConfig.GetString("EntityTransferModule", "");
if (name == Name)
{
- m_agentsInTransit = new List();
- m_Enabled = true;
- m_log.InfoFormat("[ENTITY TRANSFER MODULE]: {0} enabled.", Name);
+ InitialiseCommon(source);
+ m_log.DebugFormat("[ENTITY TRANSFER MODULE]: {0} enabled.", Name);
}
}
}
+ ///
+ /// Initialize config common for this module and any descendents.
+ ///
+ ///
+ protected virtual void InitialiseCommon(IConfigSource source)
+ {
+ IConfig transferConfig = source.Configs["EntityTransfer"];
+ if (transferConfig != null)
+ MaxTransferDistance = transferConfig.GetInt("max_distance", 4095);
+
+ m_agentsInTransit = new List();
+ m_Enabled = true;
+ }
+
public virtual void PostInitialise()
{
}
@@ -114,7 +132,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return;
}
-
public virtual void RemoveRegion(Scene scene)
{
if (!m_Enabled)
@@ -129,7 +146,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
{
if (!m_Enabled)
return;
-
}
#endregion
@@ -204,8 +220,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
sp.ControllingClient.SendTeleportFailed("Problem at destination");
return;
}
- m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final destination is x={0} y={1} {2}@{3}",
- finalDestination.RegionLocX / Constants.RegionSize, finalDestination.RegionLocY / Constants.RegionSize, finalDestination.RegionID, finalDestination.ServerURI);
+
+ uint curX = 0, curY = 0;
+ Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY);
+ int curCellX = (int)(curX / Constants.RegionSize);
+ int curCellY = (int)(curY / Constants.RegionSize);
+ int destCellX = (int)(finalDestination.RegionLocX / Constants.RegionSize);
+ int destCellY = (int)(finalDestination.RegionLocY / Constants.RegionSize);
+
+// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY);
+//
+// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}",
+// destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI);
// Check that these are not the same coordinates
if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX &&
@@ -216,6 +242,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return;
}
+ if (Math.Abs(curCellX - destCellX) > MaxTransferDistance || Math.Abs(curCellY - destCellY) > MaxTransferDistance)
+ {
+ sp.ControllingClient.SendTeleportFailed(
+ string.Format(
+ "Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way",
+ finalDestination.RegionName, destCellX, destCellY,
+ sp.Scene.RegionInfo.RegionName, curCellX, curCellY,
+ MaxTransferDistance));
+
+ return;
+ }
+
//
// This is it
//
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 4d77ef478d..a87279aed9 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -67,10 +67,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
string name = moduleConfig.GetString("EntityTransferModule", "");
if (name == Name)
{
- m_agentsInTransit = new List();
-
- m_Enabled = true;
- m_log.InfoFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
+ InitialiseCommon(source);
+ m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
}
}
}
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
index 00959b04c4..2e3b21fac4 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
@@ -91,6 +91,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
remoteClient.SendAlertMessage("Use a search string with at least 3 characters");
return;
}
+
+m_log.DebugFormat("MAP NAME=({0})", mapName);
// try to fetch from GridServer
List regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20);
@@ -103,7 +105,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
if (info != null)
regionInfos.Add(info);
}
- else if (regionInfos.Count == 0 && mapName.StartsWith("http://"))
+ else if (regionInfos.Count == 0)
remoteClient.SendAlertMessage("Hyperlink could not be established.");
m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions. Flags={2}", mapName, regionInfos.Count, flags);
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
index 42efd67d53..a5bba4f136 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
@@ -417,9 +417,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
public string ParcelVoiceInfoRequest(Scene scene, string request, string path, string param,
UUID agentID, Caps caps)
{
-// m_log.DebugFormat(
-// "[FreeSwitchVoice][PARCELVOICE]: ParcelVoiceInfoRequest() on {0} for {1}",
-// scene.RegionInfo.RegionName, agentID);
+ m_log.DebugFormat(
+ "[FreeSwitchVoice][PARCELVOICE]: ParcelVoiceInfoRequest() on {0} for {1}",
+ scene.RegionInfo.RegionName, agentID);
ScenePresence avatar = scene.GetScenePresence(agentID);
string avatarName = avatar.Name;
@@ -885,4 +885,4 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
#endregion
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs
index 52625980cc..83ec1229ac 100644
--- a/OpenSim/Services/GridService/HypergridLinker.cs
+++ b/OpenSim/Services/GridService/HypergridLinker.cs
@@ -63,7 +63,7 @@ namespace OpenSim.Services.GridService
protected GatekeeperServiceConnector m_GatekeeperConnector;
protected UUID m_ScopeID = UUID.Zero;
- protected bool m_Check4096 = true;
+// protected bool m_Check4096 = true;
protected string m_MapTileDirectory = string.Empty;
protected string m_ThisGatekeeper = string.Empty;
protected Uri m_ThisGatekeeperURI = null;
@@ -121,7 +121,7 @@ namespace OpenSim.Services.GridService
if (scope != string.Empty)
UUID.TryParse(scope, out m_ScopeID);
- m_Check4096 = gridConfig.GetBoolean("Check4096", true);
+// m_Check4096 = gridConfig.GetBoolean("Check4096", true);
m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles");
@@ -347,14 +347,18 @@ namespace OpenSim.Services.GridService
return true;
}
- uint x, y;
- if (m_Check4096 && !Check4096(handle, out x, out y))
- {
- RemoveHyperlinkRegion(regInfo.RegionID);
- reason = "Region is too far (" + x + ", " + y + ")";
- m_log.Info("[HYPERGRID LINKER]: Unable to link, region is too far (" + x + ", " + y + ")");
- return false;
- }
+ // We are now performing this check for each individual teleport in the EntityTransferModule instead. This
+ // allows us to give better feedback when teleports fail because of the distance reason (which can't be
+ // done here) and it also hypergrid teleports that are within range (possibly because the source grid
+ // itself has regions that are very far apart).
+// uint x, y;
+// if (m_Check4096 && !Check4096(handle, out x, out y))
+// {
+// //RemoveHyperlinkRegion(regInfo.RegionID);
+// reason = "Region is too far (" + x + ", " + y + ")";
+// m_log.Info("[HYPERGRID LINKER]: Unable to link, region is too far (" + x + ", " + y + ")");
+// //return false;
+// }
regInfo.RegionID = regionID;
@@ -405,60 +409,59 @@ namespace OpenSim.Services.GridService
}
}
- ///
- /// Cope with this viewer limitation.
- ///
- ///
- ///
- public bool Check4096(ulong realHandle, out uint x, out uint y)
- {
- uint ux = 0, uy = 0;
- Utils.LongToUInts(realHandle, out ux, out uy);
- x = ux / Constants.RegionSize;
- y = uy / Constants.RegionSize;
-
- const uint limit = (4096 - 1) * Constants.RegionSize;
- uint xmin = ux - limit;
- uint xmax = ux + limit;
- uint ymin = uy - limit;
- uint ymax = uy + limit;
- // World map boundary checks
- if (xmin < 0 || xmin > ux)
- xmin = 0;
- if (xmax > int.MaxValue || xmax < ux)
- xmax = int.MaxValue;
- if (ymin < 0 || ymin > uy)
- ymin = 0;
- if (ymax > int.MaxValue || ymax < uy)
- ymax = int.MaxValue;
-
- // Check for any regions that are within the possible teleport range to the linked region
- List regions = m_GridService.GetRegionRange(m_ScopeID, (int)xmin, (int)xmax, (int)ymin, (int)ymax);
- if (regions.Count == 0)
- {
- return false;
- }
- else
- {
- // Check for regions which are not linked regions
- List hyperlinks = m_GridService.GetHyperlinks(m_ScopeID);
- IEnumerable availableRegions = regions.Except(hyperlinks);
- if (availableRegions.Count() == 0)
- return false;
- }
-
- return true;
- }
+// Not currently used
+// ///
+// /// Cope with this viewer limitation.
+// ///
+// ///
+// ///
+// public bool Check4096(ulong realHandle, out uint x, out uint y)
+// {
+// uint ux = 0, uy = 0;
+// Utils.LongToUInts(realHandle, out ux, out uy);
+// x = ux / Constants.RegionSize;
+// y = uy / Constants.RegionSize;
+//
+// const uint limit = (4096 - 1) * Constants.RegionSize;
+// uint xmin = ux - limit;
+// uint xmax = ux + limit;
+// uint ymin = uy - limit;
+// uint ymax = uy + limit;
+// // World map boundary checks
+// if (xmin < 0 || xmin > ux)
+// xmin = 0;
+// if (xmax > int.MaxValue || xmax < ux)
+// xmax = int.MaxValue;
+// if (ymin < 0 || ymin > uy)
+// ymin = 0;
+// if (ymax > int.MaxValue || ymax < uy)
+// ymax = int.MaxValue;
+//
+// // Check for any regions that are within the possible teleport range to the linked region
+// List regions = m_GridService.GetRegionRange(m_ScopeID, (int)xmin, (int)xmax, (int)ymin, (int)ymax);
+// if (regions.Count == 0)
+// {
+// return false;
+// }
+// else
+// {
+// // Check for regions which are not linked regions
+// List hyperlinks = m_GridService.GetHyperlinks(m_ScopeID);
+// IEnumerable availableRegions = regions.Except(hyperlinks);
+// if (availableRegions.Count() == 0)
+// return false;
+// }
+//
+// return true;
+// }
private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle)
{
-
RegionData rdata = m_GridService.RegionInfo2RegionData(regionInfo);
int flags = (int)OpenSim.Data.RegionFlags.Hyperlink + (int)OpenSim.Data.RegionFlags.NoDirectLogin + (int)OpenSim.Data.RegionFlags.RegionOnline;
rdata.Data["flags"] = flags.ToString();
m_Database.Store(rdata);
-
}
private void RemoveHyperlinkRegion(UUID regionID)
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini
index fa5392dc42..7321cad5a7 100644
--- a/bin/OpenSimDefaults.ini
+++ b/bin/OpenSimDefaults.ini
@@ -504,6 +504,10 @@
; Distance in meters that shouts should travel. Default is 100m
shout_distance = 100
+[EntityTransfer]
+ ; The maximum distance in regions that an agent is allowed to teleport along the x or y axis
+ ; This is set to 4095 because current viewers can't handle teleports that are greater than this distance
+ max_distance = 4095
[Messaging]
; Control which region module is used for instant messaging.
diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example
index cbe3fa0aef..ee0523f91a 100644
--- a/bin/config-include/StandaloneCommon.ini.example
+++ b/bin/config-include/StandaloneCommon.ini.example
@@ -63,9 +63,6 @@
;;--- For MySql region storage (alternative)
;StorageProvider = "OpenSim.Data.MySQL.dll:MySqlRegionData"
- ;; With hypergrid, perform distance check for the creation of a linked region
- ; Check4096 = true
-
;; Directory for map tile images of remote regions
; MapTileDirectory = "./maptiles"