changes on teleports v7
parent
5663e2c0c8
commit
1847a42a86
|
@ -398,7 +398,8 @@ namespace OpenSim.Framework
|
||||||
// Scripted
|
// Scripted
|
||||||
public ControllerData[] Controllers;
|
public ControllerData[] Controllers;
|
||||||
|
|
||||||
public string CallbackURI;
|
public string CallbackURI; // to remove
|
||||||
|
public string NewCallbackURI;
|
||||||
|
|
||||||
// These two must have the same Count
|
// These two must have the same Count
|
||||||
public List<ISceneObject> AttachmentObjects;
|
public List<ISceneObject> AttachmentObjects;
|
||||||
|
@ -528,6 +529,9 @@ namespace OpenSim.Framework
|
||||||
if ((CallbackURI != null) && (!CallbackURI.Equals("")))
|
if ((CallbackURI != null) && (!CallbackURI.Equals("")))
|
||||||
args["callback_uri"] = OSD.FromString(CallbackURI);
|
args["callback_uri"] = OSD.FromString(CallbackURI);
|
||||||
|
|
||||||
|
if ((NewCallbackURI != null) && (!NewCallbackURI.Equals("")))
|
||||||
|
args["cb_uri"] = OSD.FromString(NewCallbackURI);
|
||||||
|
|
||||||
// Attachment objects for fatpack messages
|
// Attachment objects for fatpack messages
|
||||||
if (AttachmentObjects != null)
|
if (AttachmentObjects != null)
|
||||||
{
|
{
|
||||||
|
@ -811,12 +815,7 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
// end of code to remove
|
// end of code to remove
|
||||||
}
|
}
|
||||||
/* moved above
|
|
||||||
if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map)
|
|
||||||
Appearance = new AvatarAppearance((OSDMap)args["packed_appearance"]);
|
|
||||||
else
|
|
||||||
m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance");
|
|
||||||
*/
|
|
||||||
if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array)
|
if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array)
|
||||||
{
|
{
|
||||||
OSDArray controls = (OSDArray)(args["controllers"]);
|
OSDArray controls = (OSDArray)(args["controllers"]);
|
||||||
|
@ -834,6 +833,9 @@ namespace OpenSim.Framework
|
||||||
if (args["callback_uri"] != null)
|
if (args["callback_uri"] != null)
|
||||||
CallbackURI = args["callback_uri"].AsString();
|
CallbackURI = args["callback_uri"].AsString();
|
||||||
|
|
||||||
|
if (args["cb_uri"] != null)
|
||||||
|
NewCallbackURI = args["cb_uri"].AsString();
|
||||||
|
|
||||||
// Attachment objects
|
// Attachment objects
|
||||||
if (args["attach_objects"] != null && args["attach_objects"].Type == OSDType.Array)
|
if (args["attach_objects"] != null && args["attach_objects"].Type == OSDType.Array)
|
||||||
{
|
{
|
||||||
|
|
|
@ -54,14 +54,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
private static readonly string LogHeader = "[ENTITY TRANSFER MODULE]";
|
private static readonly string LogHeader = "[ENTITY TRANSFER MODULE]";
|
||||||
|
|
||||||
public const int DefaultMaxTransferDistance = 4095;
|
|
||||||
public const bool WaitForAgentArrivedAtDestinationDefault = true;
|
public const bool WaitForAgentArrivedAtDestinationDefault = true;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The maximum distance, in standard region units (256m) that an agent is allowed to transfer.
|
|
||||||
/// </summary>
|
|
||||||
public int MaxTransferDistance { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If true then on a teleport, the source region waits for a callback from the destination region. If
|
/// If true then on a teleport, the source region waits for a callback from the destination region. If
|
||||||
/// a callback fails to arrive within a set time then the user is pulled back into the source region.
|
/// a callback fails to arrive within a set time then the user is pulled back into the source region.
|
||||||
|
@ -227,11 +221,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
WaitForAgentArrivedAtDestination
|
WaitForAgentArrivedAtDestination
|
||||||
= transferConfig.GetBoolean("wait_for_callback", WaitForAgentArrivedAtDestinationDefault);
|
= transferConfig.GetBoolean("wait_for_callback", WaitForAgentArrivedAtDestinationDefault);
|
||||||
|
|
||||||
MaxTransferDistance = transferConfig.GetInt("max_distance", DefaultMaxTransferDistance);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MaxTransferDistance = DefaultMaxTransferDistance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_entityTransferStateMachine = new EntityTransferStateMachine(this);
|
m_entityTransferStateMachine = new EntityTransferStateMachine(this);
|
||||||
|
@ -639,29 +628,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Determines whether this instance is within the max transfer distance.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sourceRegion"></param>
|
|
||||||
/// <param name="destRegion"></param>
|
|
||||||
/// <returns>
|
|
||||||
/// <c>true</c> if this instance is within max transfer distance; otherwise, <c>false</c>.
|
|
||||||
/// </returns>
|
|
||||||
private bool IsWithinMaxTeleportDistance(RegionInfo sourceRegion, GridRegion destRegion)
|
|
||||||
{
|
|
||||||
if(MaxTransferDistance == 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
// Insanely, RegionLoc on RegionInfo is the 256m map co-ord whilst GridRegion.RegionLoc is the raw meters position.
|
|
||||||
return Math.Abs(sourceRegion.RegionLocX - destRegion.RegionCoordX) <= MaxTransferDistance
|
|
||||||
&& Math.Abs(sourceRegion.RegionLocY - destRegion.RegionCoordY) <= MaxTransferDistance;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Wraps DoTeleportInternal() and manages the transfer state.
|
/// Wraps DoTeleportInternal() and manages the transfer state.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -722,18 +688,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
RegionInfo sourceRegion = sp.Scene.RegionInfo;
|
RegionInfo sourceRegion = sp.Scene.RegionInfo;
|
||||||
|
|
||||||
if (!IsWithinMaxTeleportDistance(sourceRegion, finalDestination))
|
|
||||||
{
|
|
||||||
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, finalDestination.RegionCoordX, finalDestination.RegionCoordY,
|
|
||||||
sourceRegion.RegionName, sourceRegion.RegionLocX, sourceRegion.RegionLocY,
|
|
||||||
MaxTransferDistance));
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong destinationHandle = finalDestination.RegionHandle;
|
ulong destinationHandle = finalDestination.RegionHandle;
|
||||||
|
|
||||||
// Let's do DNS resolution only once in this process, please!
|
// Let's do DNS resolution only once in this process, please!
|
||||||
|
@ -1175,7 +1129,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
agent.SenderWantsToWaitForRoot = true;
|
agent.SenderWantsToWaitForRoot = true;
|
||||||
|
|
||||||
//SetCallbackURL(agent, sp.Scene.RegionInfo);
|
if(!sp.IsInLocalTransit)
|
||||||
|
SetNewCallbackURL(agent, sp.Scene.RegionInfo);
|
||||||
|
|
||||||
// Reset the do not close flag. This must be done before the destination opens child connections (here
|
// Reset the do not close flag. This must be done before the destination opens child connections (here
|
||||||
// triggered by UpdateAgent) to avoid race conditions. However, we also want to reset it as late as possible
|
// triggered by UpdateAgent) to avoid race conditions. However, we also want to reset it as late as possible
|
||||||
|
@ -1224,25 +1179,29 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
sp.closeAllChildAgents();
|
sp.closeAllChildAgents();
|
||||||
else
|
else
|
||||||
sp.CloseChildAgents(childRegionsToClose);
|
sp.CloseChildAgents(childRegionsToClose);
|
||||||
|
}
|
||||||
|
|
||||||
// Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone
|
// if far jump we do need to close anyways
|
||||||
// goes by HG hook
|
|
||||||
if (NeedsClosing(reg, OutSideViewRange))
|
if (NeedsClosing(reg, OutSideViewRange))
|
||||||
{
|
{
|
||||||
if (!sp.Scene.IncomingPreCloseClient(sp))
|
int count = 60;
|
||||||
|
do
|
||||||
{
|
{
|
||||||
sp.IsInTransit = false;
|
Thread.Sleep(250);
|
||||||
|
if(sp.IsDeleted)
|
||||||
return;
|
return;
|
||||||
}
|
} while (--count > 0);
|
||||||
|
|
||||||
// viewers and target region take extra time to process the tp
|
if (!sp.IsDeleted)
|
||||||
Thread.Sleep(15000);
|
{
|
||||||
m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
"[ENTITY TRANSFER MODULE]: Closing agent {0} in {1} after teleport", sp.Name, Scene.Name);
|
"[ENTITY TRANSFER MODULE]: Closing agent {0} in {1} after teleport timeout", sp.Name, Scene.Name);
|
||||||
sp.Scene.CloseAgent(sp.UUID, false);
|
sp.Scene.CloseAgent(sp.UUID, false);
|
||||||
}
|
}
|
||||||
sp.IsInTransit = false;
|
return;
|
||||||
}
|
}
|
||||||
|
// otherwise keep child
|
||||||
|
sp.IsInTransit = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1313,6 +1272,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
{
|
{
|
||||||
agent.CallbackURI = region.ServerURI + "agent/" + agent.AgentID.ToString() + "/" + region.RegionID.ToString() + "/release/";
|
agent.CallbackURI = region.ServerURI + "agent/" + agent.AgentID.ToString() + "/" + region.RegionID.ToString() + "/release/";
|
||||||
|
|
||||||
|
//m_log.DebugFormat(
|
||||||
|
// "[ENTITY TRANSFER MODULE]: Set release callback URL to {0} in {1}",
|
||||||
|
// agent.CallbackURI, region.RegionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void SetNewCallbackURL(AgentData agent, RegionInfo region)
|
||||||
|
{
|
||||||
|
agent.NewCallbackURI = region.ServerURI + "agent/" + agent.AgentID.ToString() + "/" + region.RegionID.ToString() + "/release/";
|
||||||
|
|
||||||
m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
"[ENTITY TRANSFER MODULE]: Set release callback URL to {0} in {1}",
|
"[ENTITY TRANSFER MODULE]: Set release callback URL to {0} in {1}",
|
||||||
agent.CallbackURI, region.RegionName);
|
agent.CallbackURI, region.RegionName);
|
||||||
|
@ -2488,7 +2456,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
public void AgentArrivedAtDestination(UUID id)
|
public void AgentArrivedAtDestination(UUID id)
|
||||||
{
|
{
|
||||||
m_entityTransferStateMachine.SetAgentArrivedAtDestination(id);
|
ScenePresence sp = Scene.GetScenePresence(id);
|
||||||
|
if(sp == null || sp.IsDeleted || !sp.IsInTransit)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Scene.CloseAgent(sp.UUID, false);
|
||||||
|
m_entityTransferStateMachine.ResetFromTransit(id); // this needs cleanup
|
||||||
|
//m_entityTransferStateMachine.SetAgentArrivedAtDestination(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -457,9 +457,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
#region For teleports and crossings callbacks
|
#region For teleports and crossings callbacks
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// In the V1 teleport protocol, the destination simulator sends ReleaseAgent to this address.
|
/// the destination simulator sends ReleaseAgent to this address, for very long range tps, HG.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private string m_callbackURI;
|
private string m_callbackURI; // to remove with v1 support
|
||||||
|
private string m_newCallbackURI;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Records the region from which this presence originated, if not from login.
|
/// Records the region from which this presence originated, if not from login.
|
||||||
|
@ -2155,28 +2156,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_log.DebugFormat("[CompleteMovement]: Missing COF for {0} is {1}", client.AgentId, COF);
|
m_log.DebugFormat("[CompleteMovement]: Missing COF for {0} is {1}", client.AgentId, COF);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(m_callbackURI))
|
|
||||||
{
|
|
||||||
// We cannot sleep here since this would hold up the inbound packet processing thread, as
|
|
||||||
// CompleteMovement() is executed synchronously. However, it might be better to delay the release
|
|
||||||
// here until we know for sure that the agent is active in this region. Sending AgentMovementComplete
|
|
||||||
// is not enough for Imprudence clients - there appears to be a small delay (<200ms, <500ms) until they regard this
|
|
||||||
// region as the current region, meaning that a close sent before then will fail the teleport.
|
|
||||||
// System.Threading.Thread.Sleep(2000);
|
|
||||||
|
|
||||||
m_log.DebugFormat(
|
|
||||||
"[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}",
|
|
||||||
client.Name, client.AgentId, m_callbackURI);
|
|
||||||
|
|
||||||
UUID originID;
|
|
||||||
|
|
||||||
lock (m_originRegionIDAccessLock)
|
|
||||||
originID = m_originRegionID;
|
|
||||||
|
|
||||||
Scene.SimulationService.ReleaseAgent(originID, UUID, m_callbackURI);
|
|
||||||
m_callbackURI = null;
|
|
||||||
//m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Tell the client that we're totally ready
|
// Tell the client that we're totally ready
|
||||||
ControllingClient.SendRegionHandshake();
|
ControllingClient.SendRegionHandshake();
|
||||||
|
@ -2381,6 +2360,37 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
//m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts));
|
//m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts));
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(m_callbackURI))
|
||||||
|
{
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[SCENE PRESENCE]: Releasing {0} {1} with old callback to {2}",
|
||||||
|
client.Name, client.AgentId, m_callbackURI);
|
||||||
|
|
||||||
|
UUID originID;
|
||||||
|
|
||||||
|
lock (m_originRegionIDAccessLock)
|
||||||
|
originID = m_originRegionID;
|
||||||
|
|
||||||
|
Scene.SimulationService.ReleaseAgent(originID, UUID, m_callbackURI);
|
||||||
|
m_callbackURI = null;
|
||||||
|
//m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts));
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(m_newCallbackURI))
|
||||||
|
{
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}",
|
||||||
|
client.Name, client.AgentId, m_newCallbackURI);
|
||||||
|
|
||||||
|
UUID originID;
|
||||||
|
|
||||||
|
lock (m_originRegionIDAccessLock)
|
||||||
|
originID = m_originRegionID;
|
||||||
|
|
||||||
|
Scene.SimulationService.ReleaseAgent(originID, UUID, m_newCallbackURI);
|
||||||
|
m_newCallbackURI = null;
|
||||||
|
//m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts));
|
||||||
|
}
|
||||||
|
|
||||||
if (openChildAgents)
|
if (openChildAgents)
|
||||||
{
|
{
|
||||||
IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
|
IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
|
||||||
|
@ -4589,12 +4599,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
byebyeRegions.Add(handle);
|
byebyeRegions.Add(handle);
|
||||||
else if(handle == curRegionHandle)
|
else if(handle == curRegionHandle)
|
||||||
{
|
{
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
RegionInfo curreg = m_scene.RegionInfo;
|
RegionInfo curreg = m_scene.RegionInfo;
|
||||||
if (Util.IsOutsideView(255, curreg.RegionLocX, newRegionX, curreg.RegionLocY, newRegionY,
|
if (Util.IsOutsideView(255, curreg.RegionLocX, newRegionX, curreg.RegionLocY, newRegionY,
|
||||||
(int)curreg.RegionSizeX, (int)curreg.RegionSizeX, newRegionSizeX, newRegionSizeY))
|
(int)curreg.RegionSizeX, (int)curreg.RegionSizeX, newRegionSizeX, newRegionSizeY))
|
||||||
{
|
{
|
||||||
byebyeRegions.Add(handle);
|
byebyeRegions.Add(handle);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -4774,6 +4787,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public void CopyTo(AgentData cAgent, bool isCrossUpdate)
|
public void CopyTo(AgentData cAgent, bool isCrossUpdate)
|
||||||
{
|
{
|
||||||
cAgent.CallbackURI = m_callbackURI;
|
cAgent.CallbackURI = m_callbackURI;
|
||||||
|
cAgent.NewCallbackURI = m_newCallbackURI;
|
||||||
|
|
||||||
cAgent.AgentID = UUID;
|
cAgent.AgentID = UUID;
|
||||||
cAgent.RegionID = Scene.RegionInfo.RegionID;
|
cAgent.RegionID = Scene.RegionInfo.RegionID;
|
||||||
|
@ -4860,6 +4874,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
private void CopyFrom(AgentData cAgent)
|
private void CopyFrom(AgentData cAgent)
|
||||||
{
|
{
|
||||||
m_callbackURI = cAgent.CallbackURI;
|
m_callbackURI = cAgent.CallbackURI;
|
||||||
|
m_newCallbackURI = cAgent.NewCallbackURI;
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[SCENE PRESENCE]: Set callback for {0} in {1} to {2} in CopyFrom()",
|
// "[SCENE PRESENCE]: Set callback for {0} in {1} to {2} in CopyFrom()",
|
||||||
// Name, m_scene.RegionInfo.RegionName, m_callbackURI);
|
// Name, m_scene.RegionInfo.RegionName, m_callbackURI);
|
||||||
|
|
Loading…
Reference in New Issue