diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 9302784173..c1c86720a1 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -56,6 +56,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
public const int DefaultMaxTransferDistance = 4095;
public const bool WaitForAgentArrivedAtDestinationDefault = true;
+ public string OutgoingTransferVersionName { get; set; }
+
+ ///
+ /// Determine the maximum entity transfer version we will use for teleports.
+ ///
+ public float MaxOutgoingTransferVersion { get; set; }
+
///
/// The maximum distance, in standard region units (256m) that an agent is allowed to transfer.
///
@@ -151,9 +158,35 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
///
protected virtual void InitialiseCommon(IConfigSource source)
{
+ string transferVersionName = "SIMULATION";
+ float maxTransferVersion = 0.2f;
+
IConfig transferConfig = source.Configs["EntityTransfer"];
if (transferConfig != null)
{
+ string rawVersion
+ = transferConfig.GetString(
+ "MaxOutgoingTransferVersion",
+ string.Format("{0}/{1}", transferVersionName, maxTransferVersion));
+
+ string[] rawVersionComponents = rawVersion.Split(new char[] { '/' });
+
+ bool versionValid = false;
+
+ if (rawVersionComponents.Length >= 2)
+ versionValid = float.TryParse(rawVersionComponents[1], out maxTransferVersion);
+
+ if (!versionValid)
+ {
+ m_log.ErrorFormat(
+ "[ENTITY TRANSFER MODULE]: MaxOutgoingTransferVersion {0} is invalid, using {1}",
+ rawVersion, string.Format("{0}/{1}", transferVersionName, maxTransferVersion));
+ }
+ else
+ {
+ transferVersionName = rawVersionComponents[0];
+ }
+
DisableInterRegionTeleportCancellation
= transferConfig.GetBoolean("DisableInterRegionTeleportCancellation", false);
@@ -167,6 +200,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
MaxTransferDistance = DefaultMaxTransferDistance;
}
+ OutgoingTransferVersionName = transferVersionName;
+ MaxOutgoingTransferVersion = maxTransferVersion;
+
m_entityTransferStateMachine = new EntityTransferStateMachine(this);
m_Enabled = true;
@@ -623,7 +659,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (!sp.ValidateAttachments())
m_log.DebugFormat(
"[ENTITY TRANSFER MODULE]: Failed validation of all attachments for teleport of {0} from {1} to {2}. Continuing.",
- sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName);
+ sp.Name, sp.Scene.Name, finalDestination.RegionName);
string reason;
string version;
@@ -634,7 +670,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
m_log.DebugFormat(
"[ENTITY TRANSFER MODULE]: {0} was stopped from teleporting from {1} to {2} because {3}",
- sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason);
+ sp.Name, sp.Scene.Name, finalDestination.RegionName, reason);
return;
}
@@ -644,7 +680,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
// as server attempts.
m_interRegionTeleportAttempts.Value++;
- m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version);
+ m_log.DebugFormat(
+ "[ENTITY TRANSFER MODULE]: {0} max transfer version is {1}/{2}, {3} max version is {4}",
+ sp.Scene.Name, OutgoingTransferVersionName, MaxOutgoingTransferVersion, finalDestination.RegionName, version);
// Fixing a bug where teleporting while sitting results in the avatar ending up removed from
// both regions
@@ -689,7 +727,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath();
}
- if (version.Equals("SIMULATION/0.2"))
+ // We're going to fallback to V1 if the destination gives us anything smaller than 0.2 or we're forcing
+ // use of the earlier protocol
+ float versionNumber = 0.1f;
+ string[] versionComponents = version.Split(new char[] { '/' });
+ if (versionComponents.Length >= 2)
+ float.TryParse(versionComponents[1], out versionNumber);
+
+ if (versionNumber == 0.2f && MaxOutgoingTransferVersion >= versionNumber)
TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
else
TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
index 8c25dbcf8e..3ba34dd2a9 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
@@ -185,7 +185,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
public void TestSameSimulatorIsolatedRegionsV2()
{
TestHelpers.InMethod();
-// TestHelpers.EnableLogging();
+ TestHelpers.EnableLogging();
UUID userId = TestHelpers.ParseTail(0x1);
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini
index 7954a14c51..8da4daf48b 100644
--- a/bin/OpenSimDefaults.ini
+++ b/bin/OpenSimDefaults.ini
@@ -636,7 +636,6 @@
Cap_AvatarPickerSearch = "localhost"
-
[Chat]
; Controls whether the chat module is enabled. Default is true.
enabled = true;
@@ -652,6 +651,15 @@
[EntityTransfer]
+ ; The maximum protocol version that we will use for outgoing transfers
+ ; Valid values are
+ ; "SIMULATION/0.2"
+ ; - this is the default. A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
+ ; - this protocol is more efficient than "SIMULATION/0.1"
+ ; "SIMULATION/0.1"
+ ; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
+ MaxOutgoingTransferVersion = "SIMULATION/0.2"
+
; The maximum distance in regions that an agent is allowed to teleport
; along the x or y axis. This is set to 16383 because current viewers
; can't handle teleports that are greater than this distance