From de20f0603fa419ba16c56d16c2ad55301cad8b83 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 24 Jun 2011 19:49:05 +0100
Subject: Tell hypergridders when their teleports fail because of the 4096
limit rather than just saying "destination not found"
Instead of performing the 4096 check when the region is linked (and subsequently removing the link), leave the link in place and perform the check in the entity transfer module
This allows us to explicitly tell the hypergridder why the teleport failed (region out of range).
It also allows people on regions that are within range (on a large source grid) to teleport.
The Check4096 config parameter in the [GridService] section is replaced by a max_distance paramter in a new [EntityTransfer] section in OpenSimDefaults.ini
Since the parameter is in OpenSimDefaults.ini no action needs to be taken unless you want to increase this limit. It could also be decreased.
The check is being made in the base entity transfer module, since I believe the viewer problem occurs both on extremely large grids and while hypergridding.
---
.../EntityTransfer/EntityTransferModule.cs | 52 ++++++++--
.../EntityTransfer/HGEntityTransferModule.cs | 6 +-
.../CoreModules/World/WorldMap/MapSearchModule.cs | 4 +-
.../Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs | 8 +-
OpenSim/Services/GridService/HypergridLinker.cs | 115 +++++++++++----------
bin/OpenSimDefaults.ini | 4 +
bin/config-include/StandaloneCommon.ini.example | 3 -
7 files changed, 117 insertions(+), 75 deletions(-)
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 1341533..d54216a 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 4d77ef4..a87279a 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 00959b0..2e3b21f 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 42efd67..a5bba4f 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 5262598..83ec122 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 fa5392d..7321cad 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 cbe3fa0..ee0523f 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"
--
cgit v1.1