Merge branch 'master' into avinationmerge

Conflicts:
	OpenSim/Framework/AvatarAppearance.cs
	OpenSim/Framework/Servers/ServerBase.cs
	OpenSim/Framework/VersionInfo.cs
	OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
	OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
	OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
	OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
	OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
	OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
	OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
	OpenSim/Region/PhysicsModules/ConvexDecompositionDotNet/Properties/AssemblyInfo.cs
	OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs
	OpenSim/Region/PhysicsModules/Ode/OdeScene.cs
	OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
	OpenSim/Services/HypergridService/GatekeeperService.cs
	OpenSim/Services/Interfaces/IAvatarService.cs
	OpenSim/Services/LLLoginService/LLLoginService.cs
avinationmerge
UbitUmarov 2015-11-01 03:01:59 +00:00
commit 72684592ba
21 changed files with 235 additions and 122 deletions

View File

@ -873,8 +873,8 @@ namespace OpenSim.Framework.Servers
public string GetVersionText() public string GetVersionText()
{ {
return String.Format("Version: {0} (interface version {1}, SIMULATION/{2})", return String.Format("Version: {0} (SIMULATION/{1} - SIMULATION/{2})",
m_version, VersionInfo.MajorInterfaceVersion, VersionInfo.SimulationServiceVersion); m_version, VersionInfo.SimulationServiceVersionSupportedMin, VersionInfo.SimulationServiceVersionSupportedMax);
} }
/// <summary> /// <summary>

View File

@ -61,7 +61,9 @@ namespace OpenSim
/// This is the external interface version. It is separate from the OpenSimulator project version. /// This is the external interface version. It is separate from the OpenSimulator project version.
/// ///
/// </value> /// </value>
public readonly static int MajorInterfaceVersion = 8; /// Commented because it's not used anymore, see below for new
/// versioning method.
//public readonly static int MajorInterfaceVersion = 8;
/// <summary> /// <summary>
/// This rules versioning regarding teleports, and compatibility between simulators in that regard. /// This rules versioning regarding teleports, and compatibility between simulators in that regard.
@ -80,6 +82,9 @@ namespace OpenSim
/// "SIMULATION/0.1" /// "SIMULATION/0.1"
/// - this is an older teleport protocol used in OpenSimulator 0.7.5 and before. /// - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
/// </remarks> /// </remarks>
public readonly static float SimulationServiceVersion = 0.3f; public readonly static float SimulationServiceVersionAcceptedMin = 0.3f;
public readonly static float SimulationServiceVersionAcceptedMax = 0.4f;
public readonly static float SimulationServiceVersionSupportedMin = 0.3f;
public readonly static float SimulationServiceVersionSupportedMax = 0.4f;
} }
} }

View File

@ -802,6 +802,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0));
} }
/*
[Test] [Test]
public void TestSameSimulatorNeighbouringRegionsTeleportV1() public void TestSameSimulatorNeighbouringRegionsTeleportV1()
{ {
@ -841,7 +842,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule()); sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule());
// FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour
lscm.ServiceVersion = "SIMULATION/0.1"; lscm.ServiceVersion = 0.1f;
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1); UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1);
@ -909,6 +910,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
// Check events // Check events
Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0));
} }
*/
[Test] [Test]
public void TestSameSimulatorNeighbouringRegionsTeleportV2() public void TestSameSimulatorNeighbouringRegionsTeleportV2()

View File

@ -63,19 +63,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
{ {
m_config = config.Configs["Chat"]; m_config = config.Configs["Chat"];
if (null == m_config) if (m_config != null)
{ {
m_log.Info("[CHAT]: no config found, plugin disabled");
m_enabled = false;
return;
}
if (!m_config.GetBoolean("enabled", true)) if (!m_config.GetBoolean("enabled", true))
{ {
m_log.Info("[CHAT]: plugin disabled by configuration"); m_log.Info("[CHAT]: plugin disabled by configuration");
m_enabled = false; m_enabled = false;
return; return;
} }
}
m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance); m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance);
m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance); m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance);

View File

@ -57,14 +57,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
public const int DefaultMaxTransferDistance = 4095; public const int DefaultMaxTransferDistance = 4095;
public const bool WaitForAgentArrivedAtDestinationDefault = true; public const bool WaitForAgentArrivedAtDestinationDefault = true;
public static readonly string OutgoingTransferVersionName = "SIMULATION";
/// <summary>
/// Determine the entity transfer version we will use for teleports.
/// </summary>
public static readonly float OutgoingTransferVersion = VersionInfo.SimulationServiceVersion;
private string m_myVersion = "";
/// <summary> /// <summary>
/// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer.
/// </summary> /// </summary>
@ -243,8 +235,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
MaxTransferDistance = DefaultMaxTransferDistance; MaxTransferDistance = DefaultMaxTransferDistance;
} }
m_myVersion = string.Format("{0}/{1}", OutgoingTransferVersionName, OutgoingTransferVersion);
m_entityTransferStateMachine = new EntityTransferStateMachine(this); m_entityTransferStateMachine = new EntityTransferStateMachine(this);
m_Enabled = true; m_Enabled = true;
@ -736,10 +726,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
sp.Name, sp.Scene.Name, finalDestination.RegionName); sp.Name, sp.Scene.Name, finalDestination.RegionName);
string reason; string reason;
string version; EntityTransferContext ctx = new EntityTransferContext();
if (!Scene.SimulationService.QueryAccess( if (!Scene.SimulationService.QueryAccess(
finalDestination, sp.ControllingClient.AgentId, homeURI, true, position,m_myVersion, sp.Scene.GetFormatsOffered(), out version, out reason)) finalDestination, sp.ControllingClient.AgentId, homeURI, true, position, sp.Scene.GetFormatsOffered(), ctx, out reason))
{ {
sp.ControllingClient.SendTeleportFailed(reason); sp.ControllingClient.SendTeleportFailed(reason);
@ -756,8 +746,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
m_interRegionTeleportAttempts.Value++; m_interRegionTeleportAttempts.Value++;
m_log.DebugFormat( m_log.DebugFormat(
"[ENTITY TRANSFER MODULE]: {0} transfer version is {1}/{2}, {3} version is {4}", "[ENTITY TRANSFER MODULE]: {0} transfer protocol version to {1} is {2} / {3}",
sp.Scene.Name, OutgoingTransferVersionName, OutgoingTransferVersion, finalDestination.RegionName, version); sp.Scene.Name, finalDestination.RegionName, ctx.OutboundVersion, ctx.InboundVersion);
// Fixing a bug where teleporting while sitting results in the avatar ending up removed from // Fixing a bug where teleporting while sitting results in the avatar ending up removed from
// both regions // both regions
@ -837,21 +827,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath();
} }
// We're going to fallback to V1 if the destination gives us anything smaller than 0.2 or we're forcing // We're going to fallback to V1 if the destination gives us anything smaller than 0.2
// use of the earlier protocol if (ctx.OutboundVersion >= 0.2f)
float versionNumber = 0.1f; TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, OutSideViewRange , ctx, out reason);
string[] versionComponents = version.Split(new char[] { '/' });
if (versionComponents.Length >= 2)
float.TryParse(versionComponents[1], out versionNumber);
if (versionNumber >= 0.2f)
TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, OutSideViewRange , version, out reason);
else else
TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, OutSideViewRange, version, out reason); TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, OutSideViewRange, ctx, out reason);
} }
private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination,
IPEndPoint endPoint, uint teleportFlags, bool OutSideViewRange, string version, out string reason) IPEndPoint endPoint, uint teleportFlags, bool OutSideViewRange, EntityTransferContext ctx, out string reason)
{ {
ulong destinationHandle = finalDestination.RegionHandle; ulong destinationHandle = finalDestination.RegionHandle;
AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
@ -1045,13 +1029,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
} }
/*
// TODO: This may be 0.6. Check if still needed
// For backwards compatibility // For backwards compatibility
if (version == "Unknown" || version == string.Empty) if (version == 0f)
{ {
// CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one..."); m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one...");
CrossAttachmentsIntoNewRegion(finalDestination, sp, true); CrossAttachmentsIntoNewRegion(finalDestination, sp, true);
} }
*/
m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp);
@ -1087,7 +1074,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
} }
private void TransferAgent_V2(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, private void TransferAgent_V2(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination,
IPEndPoint endPoint, uint teleportFlags, bool OutSideViewRange, string version, out string reason) IPEndPoint endPoint, uint teleportFlags, bool OutSideViewRange, EntityTransferContext ctx, out string reason)
{ {
ulong destinationHandle = finalDestination.RegionHandle; ulong destinationHandle = finalDestination.RegionHandle;
AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
@ -1494,9 +1481,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
// now only works for crossings // now only works for crossings
public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos,
out string version, out Vector3 newpos, out string failureReason) EntityTransferContext ctx, out Vector3 newpos, out string failureReason)
{ {
version = String.Empty;
newpos = pos; newpos = pos;
failureReason = string.Empty; failureReason = string.Empty;
@ -1532,8 +1518,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
string homeURI = scene.GetAgentHomeURI(agentID); string homeURI = scene.GetAgentHomeURI(agentID);
if (!scene.SimulationService.QueryAccess( if (!scene.SimulationService.QueryAccess(
neighbourRegion, agentID, homeURI, false, newpos, m_myVersion, neighbourRegion, agentID, homeURI, false, newpos,
new List<UUID>(), out version, out failureReason)) scene.GetFormatsOffered(), ctx, out failureReason))
{ {
// remember the fail // remember the fail
m_bannedRegionCache.Add(neighbourRegion.RegionHandle, agentID); m_bannedRegionCache.Add(neighbourRegion.RegionHandle, agentID);
@ -1571,13 +1557,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
uint x; uint x;
uint y; uint y;
Vector3 newpos; Vector3 newpos;
string version; EntityTransferContext ctx = new EntityTransferContext();
string failureReason; string failureReason;
Vector3 pos = agent.AbsolutePosition + agent.Velocity; Vector3 pos = agent.AbsolutePosition + agent.Velocity;
GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, pos, GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, pos,
out version, out newpos, out failureReason); ctx, out newpos, out failureReason);
if (neighbourRegion == null) if (neighbourRegion == null)
{ {
if (failureReason != String.Empty) if (failureReason != String.Empty)
@ -1680,7 +1666,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
/// </summary> /// </summary>
public ScenePresence CrossAgentToNewRegionAsync( public ScenePresence CrossAgentToNewRegionAsync(
ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, ScenePresence agent, Vector3 pos, GridRegion neighbourRegion,
bool isFlying, string version) bool isFlying, EntityTransferContext ctx)
{ {
try try
{ {
@ -1699,7 +1685,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
m_entityTransferStateMachine.ResetFromTransit(agent.UUID); m_entityTransferStateMachine.ResetFromTransit(agent.UUID);
} }
CrossAgentToNewRegionPost(agent, pos, neighbourRegion, isFlying, version); CrossAgentToNewRegionPost(agent, pos, neighbourRegion, isFlying, ctx);
} }
catch (Exception e) catch (Exception e)
{ {
@ -1765,7 +1751,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
} }
public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion,
bool isFlying, string version) bool isFlying, EntityTransferContext ctx)
{ {
string agentcaps; string agentcaps;
@ -1827,6 +1813,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
agent.CloseChildAgents(false, neighbourRegion.RegionHandle, neighbourRegion.RegionSizeX, neighbourRegion.RegionSizeY); agent.CloseChildAgents(false, neighbourRegion.RegionHandle, neighbourRegion.RegionSizeX, neighbourRegion.RegionSizeY);
// TODO: Check since what version this wasn't needed anymore. May be as old as 0.6
/*
// Backwards compatibility. Best effort
if (version == 0f)
{
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one...");
Thread.Sleep(3000); // wait a little now that we're not waiting for the callback
CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true);
}
*/
// the user may change their profile information in other region, // the user may change their profile information in other region,
// so the userinfo in UserProfileCache is not reliable any more, delete it // so the userinfo in UserProfileCache is not reliable any more, delete it

View File

@ -45,11 +45,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Version of this service.
/// </summary>
public string ServiceVersion { get; set; }
/// <summary> /// <summary>
/// Map region ID to scene. /// Map region ID to scene.
/// </summary> /// </summary>
@ -81,8 +76,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
public void InitialiseService(IConfigSource configSource) public void InitialiseService(IConfigSource configSource)
{ {
ServiceVersion = String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersion);
m_log.InfoFormat("[LOCAL SIMULATION CONNECTOR]: Initialized with connector protocol version {0}", ServiceVersion);
} }
public void PostInitialise() public void PostInitialise()
@ -251,11 +244,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
return true; return true;
} }
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> features, EntityTransferContext ctx, out string reason)
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string theirversion, List<UUID> features, out string version, out string reason)
{ {
reason = "Communications failure"; reason = "Communications failure";
version = ServiceVersion;
if (destination == null) if (destination == null)
return false; return false;
@ -264,19 +255,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
// m_log.DebugFormat( // m_log.DebugFormat(
// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", // "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
// s.RegionInfo.RegionName, destination.RegionHandle); // s.RegionInfo.RegionName, destination.RegionHandle);
uint size = m_scenes[destination.RegionID].RegionInfo.RegionSizeX; uint sizeX = m_scenes[destination.RegionID].RegionInfo.RegionSizeX;
uint sizeY = m_scenes[destination.RegionID].RegionInfo.RegionSizeY;
float theirVersionNumber = 0f;
string[] versionComponents = theirversion.Split(new char[] { '/' });
if (versionComponents.Length >= 2)
float.TryParse(versionComponents[1], out theirVersionNumber);
// Var regions here, and the requesting simulator is in an older version. // Var regions here, and the requesting simulator is in an older version.
// We will forbide this, because it crashes the viewers // We will forbide this, because it crashes the viewers
if (theirVersionNumber < 0.3f && size > 256) if (ctx.OutboundVersion < 0.3f && (sizeX != 256 || sizeY != 256))
{ {
reason = "Destination is a variable-sized region, and source is an old simulator. Consider upgrading."; reason = "Destination is a variable-sized region, and source is an old simulator. Consider upgrading.";
m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Request to access this variable-sized region from {0} simulator was denied", theirVersionNumber); m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Request to access this variable-sized region from older simulator was denied");
return false; return false;
} }

View File

@ -205,22 +205,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
return m_remoteConnector.UpdateAgent(destination, cAgentData); return m_remoteConnector.UpdateAgent(destination, cAgentData);
} }
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> features, EntityTransferContext ctx, out string reason)
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string sversion, List<UUID> features, out string version, out string reason)
{ {
reason = "Communications failure"; reason = "Communications failure";
version = "Unknown";
if (destination == null) if (destination == null)
return false; return false;
// Try local first // Try local first
if (m_localBackend.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, sversion, features, out version, out reason)) if (m_localBackend.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, features, ctx, out reason))
return true; return true;
// else do the remote thing // else do the remote thing
if (!m_localBackend.IsLocalRegion(destination.RegionID)) if (!m_localBackend.IsLocalRegion(destination.RegionID))
return m_remoteConnector.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, sversion, features, out version, out reason); return m_remoteConnector.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, features, ctx, out reason);
return false; return false;
} }

View File

@ -100,7 +100,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
m_console.Commands.AddCommand( m_console.Commands.AddCommand(
"Regions", false, "region set", "Regions", false, "region set",
"region get", "region set",
"Set control information for the currently selected region.", "Set control information for the currently selected region.",
"Currently, the following parameters can be set:\n" "Currently, the following parameters can be set:\n"
+ "agent-limit <int> - Current root agent limit. This is persisted over restart.\n" + "agent-limit <int> - Current root agent limit. This is persisted over restart.\n"

View File

@ -35,7 +35,7 @@ using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.Framework.Interfaces namespace OpenSim.Region.Framework.Interfaces
{ {
public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, string version); public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, EntityTransferContext ctx);
public delegate ScenePresence CrossAsyncDelegate(ScenePresence agent, bool isFlying); public delegate ScenePresence CrossAsyncDelegate(ScenePresence agent, bool isFlying);
public interface IEntityTransferModule public interface IEntityTransferModule
@ -93,13 +93,14 @@ namespace OpenSim.Region.Framework.Interfaces
void EnableChildAgent(ScenePresence agent, GridRegion region); void EnableChildAgent(ScenePresence agent, GridRegion region);
GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out string version, out Vector3 newpos); GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, EntityTransferContext ctx,
out Vector3 newpos, out string reason);
GridRegion GetObjectDestination(SceneObjectGroup grp, Vector3 targetPosition, out Vector3 newpos); GridRegion GetObjectDestination(SceneObjectGroup grp, Vector3 targetPosition, out Vector3 newpos);
bool checkAgentAccessToRegion(ScenePresence agent, GridRegion destiny, Vector3 position, out string version, out string reason); bool checkAgentAccessToRegion(ScenePresence agent, GridRegion destiny, Vector3 position, EntityTransferContext ctx, out string reason);
// void Cross(SceneObjectGroup sog, Vector3 position, bool silent);
bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent, bool removeScripts); bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent, bool removeScripts);
ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, string version); ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, EntityTransferContext ctx);
bool HandleIncomingSceneObject(SceneObjectGroup so, Vector3 newPosition); bool HandleIncomingSceneObject(SceneObjectGroup so, Vector3 newPosition);
} }

View File

@ -42,6 +42,7 @@ using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.PhysicsModules.SharedBase; using OpenSim.Region.PhysicsModules.SharedBase;
using OpenSim.Region.Framework.Scenes.Serialization; using OpenSim.Region.Framework.Scenes.Serialization;
using PermissionMask = OpenSim.Framework.PermissionMask; using PermissionMask = OpenSim.Framework.PermissionMask;
using OpenSim.Services.Interfaces;
namespace OpenSim.Region.Framework.Scenes namespace OpenSim.Region.Framework.Scenes
{ {
@ -534,7 +535,8 @@ namespace OpenSim.Region.Framework.Scenes
/// <returns></returns> /// <returns></returns>
public bool IsAttachmentCheckFull() public bool IsAttachmentCheckFull()
{ {
return (IsAttachment || (m_rootPart.Shape.PCode == (byte)PCodeEnum.Primitive && m_rootPart.Shape.State != 0)); return (IsAttachment ||
(m_rootPart.Shape.PCode == (byte)PCodeEnum.Primitive && m_rootPart.Shape.State != 0));
} }
private struct avtocrossInfo private struct avtocrossInfo
@ -679,7 +681,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
string reason = String.Empty; string reason = String.Empty;
string version = String.Empty; EntityTransferContext ctx = new EntityTransferContext();
foreach (ScenePresence av in sog.m_sittingAvatars) foreach (ScenePresence av in sog.m_sittingAvatars)
{ {
@ -691,7 +693,7 @@ namespace OpenSim.Region.Framework.Scenes
// We set the avatar position as being the object // We set the avatar position as being the object
// position to get the region to send to // position to get the region to send to
if(!entityTransfer.checkAgentAccessToRegion(av, destination, newpos, out version, out reason)) if(!entityTransfer.checkAgentAccessToRegion(av, destination, newpos, ctx, out reason))
{ {
return sog; return sog;
} }
@ -731,7 +733,7 @@ namespace OpenSim.Region.Framework.Scenes
// CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync; // CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync;
// d.BeginInvoke(av, val, destination, av.Flying, version, CrossAgentToNewRegionCompleted, d); // d.BeginInvoke(av, val, destination, av.Flying, version, CrossAgentToNewRegionCompleted, d);
entityTransfer.CrossAgentToNewRegionAsync(av, newpos, destination, av.Flying, version); entityTransfer.CrossAgentToNewRegionAsync(av, newpos, destination, av.Flying, ctx);
if (av.IsChildAgent) if (av.IsChildAgent)
{ {
// avatar crossed do some extra cleanup // avatar crossed do some extra cleanup

View File

@ -2121,7 +2121,8 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
if ((!isPhantom || isPhysical || _VolumeDetectActive) && !ParentGroup.IsAttachment if ((!isPhantom || isPhysical || _VolumeDetectActive)
&& !ParentGroup.IsAttachmentCheckFull()
&& !(Shape.PathCurve == (byte)Extrusion.Flexible)) && !(Shape.PathCurve == (byte)Extrusion.Flexible))
{ {
AddToPhysics(isPhysical, isPhantom, building, isPhysical); AddToPhysics(isPhysical, isPhantom, building, isPhysical);

View File

@ -105,6 +105,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt));
} }
/*
[Test] [Test]
public void TestSameSimulatorIsolatedRegionsV1() public void TestSameSimulatorIsolatedRegionsV1()
{ {
@ -136,7 +137,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
// FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour
lscm.ServiceVersion = "SIMULATION/0.1"; lscm.ServiceVersion = 0.1f;
Vector3 teleportPosition = new Vector3(10, 11, 12); Vector3 teleportPosition = new Vector3(10, 11, 12);
Vector3 teleportLookAt = new Vector3(20, 21, 22); Vector3 teleportLookAt = new Vector3(20, 21, 22);
@ -178,6 +179,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
// position instead). // position instead).
// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt));
} }
*/
[Test] [Test]
public void TestSameSimulatorIsolatedRegionsV2() public void TestSameSimulatorIsolatedRegionsV2()
@ -488,6 +490,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
// TestHelpers.DisableLogging(); // TestHelpers.DisableLogging();
} }
/*
[Test] [Test]
public void TestSameSimulatorNeighbouringRegionsV1() public void TestSameSimulatorNeighbouringRegionsV1()
{ {
@ -519,7 +522,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB); SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB);
// FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour
lscm.ServiceVersion = "SIMULATION/0.1"; lscm.ServiceVersion = 0.1f;
Vector3 teleportPosition = new Vector3(10, 11, 12); Vector3 teleportPosition = new Vector3(10, 11, 12);
Vector3 teleportLookAt = new Vector3(20, 21, 22); Vector3 teleportLookAt = new Vector3(20, 21, 22);
@ -573,6 +576,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
// TestHelpers.DisableLogging(); // TestHelpers.DisableLogging();
} }
*/
[Test] [Test]
public void TestSameSimulatorNeighbouringRegionsV2() public void TestSameSimulatorNeighbouringRegionsV2()

View File

@ -33,3 +33,4 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.8.3.*")] [assembly: AssemblyVersion("0.8.3.*")]

View File

@ -172,7 +172,7 @@ namespace OpenSim.Region.PhysicsModule.ODE
/// <param name="req"></param> /// <param name="req"></param>
private void RayCast(ODERayCastRequest req) private void RayCast(ODERayCastRequest req)
{ {
// NOTE: limit ray lenght or collisions will take all avaiable stack space // NOTE: limit ray length or collisions will take all avaiable stack space
// this value may still be too large, depending on machine configuration // this value may still be too large, depending on machine configuration
// of maximum stack // of maximum stack
float len = req.length; float len = req.length;

View File

@ -145,9 +145,90 @@ namespace OpenSim.Server.Handlers.Simulation
if (args.ContainsKey("agent_home_uri")) if (args.ContainsKey("agent_home_uri"))
agentHomeURI = args["agent_home_uri"].AsString(); agentHomeURI = args["agent_home_uri"].AsString();
string theirVersion = string.Empty; // Decode the legacy (string) version and extract the number
float theirVersion = 0f;
if (args.ContainsKey("my_version")) if (args.ContainsKey("my_version"))
theirVersion = args["my_version"].AsString(); {
string theirVersionStr = args["my_version"].AsString();
string[] parts = theirVersionStr.Split(new char[] {'/'});
if (parts.Length > 1)
theirVersion = float.Parse(parts[1]);
}
// Decode the new versioning data
float minVersionRequired = 0f;
float maxVersionRequired = 0f;
float minVersionProvided = 0f;
float maxVersionProvided = 0f;
if (args.ContainsKey("simulation_service_supported_min"))
minVersionProvided = (float)args["simulation_service_supported_min"].AsReal();
if (args.ContainsKey("simulation_service_supported_max"))
maxVersionProvided = (float)args["simulation_service_supported_max"].AsReal();
if (args.ContainsKey("simulation_service_accepted_min"))
minVersionRequired = (float)args["simulation_service_accepted_min"].AsReal();
if (args.ContainsKey("simulation_service_accepted_max"))
maxVersionRequired = (float)args["simulation_service_accepted_max"].AsReal();
responsedata["int_response_code"] = HttpStatusCode.OK;
OSDMap resp = new OSDMap(3);
float version = 0f;
float outboundVersion = 0f;
float inboundVersion = 0f;
if (minVersionProvided == 0f) // string version or older
{
// If there is no version in the packet at all we're looking at 0.6 or
// even more ancient. Refuse it.
if(theirVersion == 0f)
{
resp["success"] = OSD.FromBoolean(false);
resp["reason"] = OSD.FromString("Your region is running a old version of opensim no longer supported. Consider updating it");
responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true);
return;
}
version = theirVersion;
if (version < VersionInfo.SimulationServiceVersionAcceptedMin ||
version > VersionInfo.SimulationServiceVersionAcceptedMax )
{
resp["success"] = OSD.FromBoolean(false);
resp["reason"] = OSD.FromString(String.Format("Your region protocol version is {0} and we accept only {1} - {2}. No version overlap.", theirVersion, VersionInfo.SimulationServiceVersionAcceptedMin, VersionInfo.SimulationServiceVersionAcceptedMax));
responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true);
return;
}
}
else
{
// Test for no overlap
if (minVersionProvided > VersionInfo.SimulationServiceVersionAcceptedMax ||
maxVersionProvided < VersionInfo.SimulationServiceVersionAcceptedMin)
{
resp["success"] = OSD.FromBoolean(false);
resp["reason"] = OSD.FromString(String.Format("Your region provide protocol versions {0} - {1} and we accept only {2} - {3}. No version overlap.", minVersionProvided, maxVersionProvided, VersionInfo.SimulationServiceVersionAcceptedMin, VersionInfo.SimulationServiceVersionAcceptedMax));
responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true);
return;
}
if (minVersionRequired > VersionInfo.SimulationServiceVersionSupportedMax ||
maxVersionRequired < VersionInfo.SimulationServiceVersionSupportedMin)
{
resp["success"] = OSD.FromBoolean(false);
resp["reason"] = OSD.FromString(String.Format("You require region protocol versions {0} - {1} and we provide only {2} - {3}. No version overlap.", minVersionRequired, maxVersionRequired, VersionInfo.SimulationServiceVersionSupportedMin, VersionInfo.SimulationServiceVersionSupportedMax));
responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true);
return;
}
// Determine versions to use
// This is intentionally inverted. Inbound and Outbound refer to the direction of the transfer.
// Therefore outbound means from the sender to the receier and inbound means from the receiver to the sender.
// So outbound is what we will accept and inbound is what we will send. Confused yet?
outboundVersion = Math.Min(maxVersionProvided, VersionInfo.SimulationServiceVersionAcceptedMax);
inboundVersion = Math.Min(maxVersionRequired, VersionInfo.SimulationServiceVersionSupportedMax);
}
List<UUID> features = new List<UUID>(); List<UUID> features = new List<UUID>();
@ -163,16 +244,25 @@ namespace OpenSim.Server.Handlers.Simulation
destination.RegionID = regionID; destination.RegionID = regionID;
string reason; string reason;
string version; // We're sending the version numbers down to the local connector to do the varregion check.
bool result = m_SimulationService.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, theirVersion, features, out version, out reason); EntityTransferContext ctx = new EntityTransferContext();
ctx.InboundVersion = inboundVersion;
ctx.OutboundVersion = outboundVersion;
if (minVersionProvided == 0f)
{
ctx.InboundVersion = version;
ctx.OutboundVersion = version;
}
responsedata["int_response_code"] = HttpStatusCode.OK; bool result = m_SimulationService.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, features, ctx, out reason);
OSDMap resp = new OSDMap(3);
resp["success"] = OSD.FromBoolean(result); resp["success"] = OSD.FromBoolean(result);
resp["reason"] = OSD.FromString(reason); resp["reason"] = OSD.FromString(reason);
resp["version"] = OSD.FromString(version); string legacyVersion = String.Format("SIMULATION/{0}", version);
resp["version"] = OSD.FromString(legacyVersion);
resp["negotiated_inbound_version"] = OSD.FromReal(inboundVersion);
resp["negotiated_outbound_version"] = OSD.FromReal(outboundVersion);
resp["variable_wearables_count_supported"] = OSD.FromBoolean(true);
OSDArray featuresWanted = new OSDArray(); OSDArray featuresWanted = new OSDArray();
foreach (UUID feature in features) foreach (UUID feature in features)

View File

@ -524,7 +524,9 @@ namespace OpenSim.Services.Connectors
{ {
InventoryItemBase retrieved = null; InventoryItemBase retrieved = null;
if (m_ItemCache.TryGetValue(item.ID, out retrieved)) if (m_ItemCache.TryGetValue(item.ID, out retrieved))
{
return retrieved; return retrieved;
}
try try
{ {

View File

@ -283,11 +283,9 @@ namespace OpenSim.Services.Connectors.Simulation
} }
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> featuresAvailable, EntityTransferContext ctx, out string reason)
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string myversion, List<UUID> featuresAvailable, out string version, out string reason)
{ {
reason = "Failed to contact destination"; reason = "Failed to contact destination";
version = "Unknown";
// m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position); // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position);
@ -300,7 +298,14 @@ namespace OpenSim.Services.Connectors.Simulation
OSDMap request = new OSDMap(); OSDMap request = new OSDMap();
request.Add("viaTeleport", OSD.FromBoolean(viaTeleport)); request.Add("viaTeleport", OSD.FromBoolean(viaTeleport));
request.Add("position", OSD.FromString(position.ToString())); request.Add("position", OSD.FromString(position.ToString()));
request.Add("my_version", OSD.FromString(myversion)); // To those who still understad this field, we're telling them
// the lowest version just to be safe
request.Add("my_version", OSD.FromString(String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersionSupportedMin)));
// New simulation service negotiation
request.Add("simulation_service_supported_min", OSD.FromReal(VersionInfo.SimulationServiceVersionSupportedMin));
request.Add("simulation_service_supported_max", OSD.FromReal(VersionInfo.SimulationServiceVersionSupportedMax));
request.Add("simulation_service_accepted_min", OSD.FromReal(VersionInfo.SimulationServiceVersionAcceptedMin));
request.Add("simulation_service_accepted_max", OSD.FromReal(VersionInfo.SimulationServiceVersionAcceptedMax));
OSDArray features = new OSDArray(); OSDArray features = new OSDArray();
foreach (UUID feature in featuresAvailable) foreach (UUID feature in featuresAvailable)
@ -324,15 +329,30 @@ namespace OpenSim.Services.Connectors.Simulation
success = data["success"]; success = data["success"];
reason = data["reason"].AsString(); reason = data["reason"].AsString();
if (data["version"] != null && data["version"].AsString() != string.Empty) // We will need to plumb this and start sing the outbound version as well
version = data["version"].AsString(); // TODO: lay the pipe for version plumbing
if (data.ContainsKey("negotiated_inbound_version") && data["negotiated_inbound_version"] != null)
m_log.DebugFormat( {
"[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1}, reason {2}, version {3} ({4})", ctx.InboundVersion = (float)data["negotiated_inbound_version"].AsReal();
uri, success, reason, version, data["version"].AsString()); ctx.OutboundVersion = (float)data["negotiated_outbound_version"].AsReal();
}
else if (data["version"] != null && data["version"].AsString() != string.Empty)
{
string versionString = data["version"].AsString();
String[] parts = versionString.Split(new char[] {'/'});
if (parts.Length > 1)
{
ctx.InboundVersion = float.Parse(parts[1]);
ctx.OutboundVersion = float.Parse(parts[1]);
}
} }
if (!success) m_log.DebugFormat(
"[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1}, reason {2}, version {3}/{4}",
uri, success, reason, ctx.InboundVersion, ctx.OutboundVersion);
}
if (!success || ctx.InboundVersion == 0f || ctx.OutboundVersion == 0f)
{ {
// If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the // If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the
// actual failure message // actual failure message
@ -451,7 +471,6 @@ namespace OpenSim.Services.Connectors.Simulation
args["destination_name"] = OSD.FromString(destination.RegionName); args["destination_name"] = OSD.FromString(destination.RegionName);
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
OSDMap result = WebUtil.PostToService(uri, args, 40000, false); OSDMap result = WebUtil.PostToService(uri, args, 40000, false);
if (result == null) if (result == null)

View File

@ -452,12 +452,12 @@ namespace OpenSim.Services.HypergridService
m_log.DebugFormat("[GATEKEEPER SERVICE]: Launching {0}, Teleport Flags: {1}", aCircuit.Name, loginFlag); m_log.DebugFormat("[GATEKEEPER SERVICE]: Launching {0}, Teleport Flags: {1}", aCircuit.Name, loginFlag);
string version; EntityTransferContext ctx = new EntityTransferContext();
string myversion = String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersion); string myversion = String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersion);
if (!m_SimulationService.QueryAccess( if (!m_SimulationService.QueryAccess(
destination, aCircuit.AgentID, aCircuit.ServiceURLs["HomeURI"].ToString(), destination, aCircuit.AgentID, aCircuit.ServiceURLs["HomeURI"].ToString(),
true, aCircuit.startpos, myversion, new List<UUID>(), out version, out reason)) true, aCircuit.startpos, new List<UUID>(), ctx, out reason))
return false; return false;
return m_SimulationService.CreateAgent(source, destination, aCircuit, (uint)loginFlag, out reason); return m_SimulationService.CreateAgent(source, destination, aCircuit, (uint)loginFlag, out reason);

View File

@ -167,7 +167,6 @@ namespace OpenSim.Services.Interfaces
// for (int i = 0 ; i < AvatarAppearance.VISUALPARAM_COUNT ; i++) // for (int i = 0 ; i < AvatarAppearance.VISUALPARAM_COUNT ; i++)
byte[] binary = appearance.VisualParams; byte[] binary = appearance.VisualParams;
string[] vps = new string[binary.Length]; string[] vps = new string[binary.Length];
@ -291,7 +290,6 @@ namespace OpenSim.Services.Interfaces
byte[] binary = new byte[vps.Length]; byte[] binary = new byte[vps.Length];
for (int i = 0; i < vps.Length; i++) for (int i = 0; i < vps.Length; i++)
binary[i] = (byte)Convert.ToInt32(vps[i]); binary[i] = (byte)Convert.ToInt32(vps[i]);
appearance.VisualParams = binary; appearance.VisualParams = binary;

View File

@ -34,6 +34,18 @@ using GridRegion = OpenSim.Services.Interfaces.GridRegion;
namespace OpenSim.Services.Interfaces namespace OpenSim.Services.Interfaces
{ {
public class EntityTransferContext
{
public EntityTransferContext()
{
InboundVersion = VersionInfo.SimulationServiceVersionAcceptedMax;
OutboundVersion = VersionInfo.SimulationServiceVersionSupportedMax;
}
public float InboundVersion { get; set; }
public float OutboundVersion { get; set; }
}
public interface ISimulationService public interface ISimulationService
{ {
/// <summary> /// <summary>
@ -93,7 +105,7 @@ namespace OpenSim.Services.Interfaces
/// <param name="version">Version that the target simulator is running</param> /// <param name="version">Version that the target simulator is running</param>
/// <param name="reason">[out] Optional error message</param> /// <param name="reason">[out] Optional error message</param>
/// <returns>True: ok; False: not allowed</returns> /// <returns>True: ok; False: not allowed</returns>
bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string sversion, List<UUID> features, out string version, out string reason); bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> features, EntityTransferContext ctx, out string reason);
/// <summary> /// <summary>
/// Message from receiving region to departing region, telling it got contacted by the client. /// Message from receiving region to departing region, telling it got contacted by the client.

View File

@ -993,11 +993,10 @@ namespace OpenSim.Services.LLLoginService
private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason)
{ {
string myversion = String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersion); EntityTransferContext ctx = new EntityTransferContext();
string version;
if (!simConnector.QueryAccess( if (!simConnector.QueryAccess(
region, aCircuit.AgentID, null, true, aCircuit.startpos, myversion, new List<UUID>(), out version, out reason)) region, aCircuit.AgentID, null, true, aCircuit.startpos, new List<UUID>(), ctx, out reason))
return false; return false;
return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason); return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason);