From 82fb737b8d655187b25267efc8b2da368cfe1e9f Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 9 Dec 2016 08:20:35 +0000 Subject: [PATCH 01/25] HG: add missing information on GetRegion --- OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs index 2d0b2b68f5..6bd24dbc1b 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs @@ -125,6 +125,7 @@ namespace OpenSim.Server.Handlers.Hypergrid hash["hostname"] = regInfo.ExternalHostName; hash["http_port"] = regInfo.HttpPort.ToString(); hash["internal_port"] = regInfo.InternalEndPoint.Port.ToString(); + hash["server_uri"] = regInfo.ServerURI; } if (message != null) From 575825193b51d13c6576aabe1bbaf1f3dda1fad8 Mon Sep 17 00:00:00 2001 From: Mandarinka Tasty Date: Fri, 9 Dec 2016 20:46:27 +0100 Subject: [PATCH 02/25] The new string-parameter: "region_object_bonus" for llGetEnv(string name); Signed-off-by: Mandarinka Tasty Signed-off-by: UbitUmarov --- .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 71e8ca9593..7efdc62d43 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -6307,6 +6307,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { return World.RegionInfo.ObjectCapacity.ToString(); } + else if (name == "region_object_bonus") + { + return World.RegionInfo.RegionSettings.ObjectBonus.ToString(); + } else { return ""; From 66990394c9a60e596cc07c4b547291afd7447133 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 9 Dec 2016 22:56:11 +0000 Subject: [PATCH 03/25] avoid a null ref --- OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs index d1fe3c7c2f..fb63c6a95f 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs @@ -216,7 +216,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap // while we don't fix the hard-coded urls if (flags == 2) { - if (regionInfos.Count == 0) + if (regionInfos == null || regionInfos.Count == 0) remoteClient.SendAgentAlertMessage("No regions found with that name.", true); // else if (regionInfos.Count == 1) // remoteClient.SendAgentAlertMessage("Region found!", false); From a3e2a42f0d7b1e146892de3d5ddb7b5a96df0d4d Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 10 Dec 2016 01:00:48 +0000 Subject: [PATCH 04/25] HG regions URI need to include also the default ports for compatibility --- OpenSim/Services/GridService/HypergridLinker.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs index e00025bfef..ceb2c6e7bb 100644 --- a/OpenSim/Services/GridService/HypergridLinker.cs +++ b/OpenSim/Services/GridService/HypergridLinker.cs @@ -255,11 +255,8 @@ namespace OpenSim.Services.GridService regionName = parts[2]; } - if(port == 80) - serverURI = "http://"+ host + "/"; - else - serverURI = "http://"+ host +":"+ port.ToString() + "/"; - } + serverURI = "http://"+ host +":"+ port.ToString() + "/"; + } } else { @@ -301,6 +298,10 @@ namespace OpenSim.Services.GridService if(!string.IsNullOrEmpty(regionName)) regionName = regionName.Trim(new char[] { '"', ' ' }); serverURI = uri.AbsoluteUri; + if(uri.Port == 80) + serverURI = serverURI.Trim(new char[] { '/', ' ' }) +":80/"; + else if(uri.Port == 443) + serverURI = serverURI.Trim(new char[] { '/', ' ' }) +":443/"; return true; } From f57403909f36fe6cc46d2ee4cc8c9cd59e6aacf3 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 10 Dec 2016 02:03:00 +0000 Subject: [PATCH 05/25] do not try xbakes on HG --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 2cf0e9d3ac..d501b7f32e 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2125,11 +2125,12 @@ namespace OpenSim.Region.Framework.Scenes if (!gotCrossUpdate && !isNPC) Scene.SendLayerData(ControllingClient); - // HG delay - if((m_teleportFlags & TeleportFlags.ViaHGLogin) != 0) + // HG + bool isHGTP = (m_teleportFlags & TeleportFlags.ViaHGLogin) != 0; + if(isHGTP) { - Thread.Sleep(500); - m_log.DebugFormat("[CompleteMovement] HG delay: {0}ms", Util.EnvironmentTickCountSubtract(ts)); +// ControllingClient.SendNameReply(m_uuid, Firstname, Lastname); + m_log.DebugFormat("[CompleteMovement] HG"); } m_previusParcelHide = false; @@ -2151,7 +2152,7 @@ namespace OpenSim.Region.Framework.Scenes cachedbaked = true; else { - if (m_scene.AvatarFactory != null) + if (m_scene.AvatarFactory != null && !isHGTP) cachedbaked = m_scene.AvatarFactory.ValidateBakedTextureCache(this); // not sure we need this From d49a5374c37967110a8bf11844893f62951878ee Mon Sep 17 00:00:00 2001 From: AliciaRaven Date: Sat, 10 Dec 2016 18:03:05 +0000 Subject: [PATCH 06/25] Make it more unlikely that a script teleport will be caught by default region landing point. --- .../Framework/EntityTransfer/EntityTransferModule.cs | 2 +- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index ad094b4b91..58d6cf2675 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -456,7 +456,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } // Check Default Location (Also See ScenePresence.CompleteMovement) - if (position.X == 128f && position.Y == 128f) + if (position.X == 128f && position.Y == 128f && position.Z == 22.5f) position = sp.Scene.RegionInfo.DefaultLandingPoint; // TODO: Get proper AVG Height diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index d501b7f32e..463f6c8d0d 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2044,7 +2044,7 @@ namespace OpenSim.Region.Framework.Scenes } // Check Default Location (Also See EntityTransferModule.TeleportAgentWithinRegion) - if (AbsolutePosition.X == 128f && AbsolutePosition.Y == 128f) + if (AbsolutePosition.X == 128f && AbsolutePosition.Y == 128f && AbsolutePosition.Z == 22.5f) AbsolutePosition = Scene.RegionInfo.DefaultLandingPoint; if (!MakeRootAgent(AbsolutePosition, flying, ref look)) From 5ad8bceb1da94244c7f3b569e0b342b9c386a4aa Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sat, 10 Dec 2016 18:36:10 +0000 Subject: [PATCH 07/25] Fix OpenSim bombing when a MySQL connection string doesn't contain a password. Passwordless connection is perfectly legal and makes sense within a container. --- OpenSim/Framework/Util.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 01a06cd15c..a6fd99f30f 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -1685,6 +1685,8 @@ namespace OpenSim.Framework // hide the password in the connection string passPosition = connectionString.IndexOf("password", StringComparison.OrdinalIgnoreCase); + if (passPosition == -1) + return connectionString; passPosition = connectionString.IndexOf("=", passPosition); if (passPosition < connectionString.Length) passPosition += 1; From 5b7986e6beb3d452a2845fa367b26c818098aba5 Mon Sep 17 00:00:00 2001 From: Mandarinka Tasty Date: Sat, 10 Dec 2016 21:15:22 +0100 Subject: [PATCH 08/25] Setting precise date of creation in NPC's profile. Signed-off-by: Mandarinka Tasty Signed-off-by: UbitUmarov --- .../CoreModules/Avatar/UserProfiles/UserProfileModule.cs | 2 +- OpenSim/Region/Framework/Interfaces/INPCModule.cs | 1 + OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | 7 +++++++ OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index 5be8556eb8..7d68299cd5 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -1009,7 +1009,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles if (p != null && p.isNPC) { - remoteClient.SendAvatarProperties(avatarID, ((INPC)(p.ControllingClient)).profileAbout, "5/25/1977", + remoteClient.SendAvatarProperties(avatarID, ((INPC)(p.ControllingClient)).profileAbout, ((INPC)(p.ControllingClient)).Born, Utils.StringToBytes("Non Player Character (NPC)"), "NPCs have no life", 16, UUID.Zero, UUID.Zero, "", UUID.Zero); remoteClient.SendAvatarInterestsReply(avatarID, 0, "", diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index 13103584e1..dd4226cde7 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -59,6 +59,7 @@ namespace OpenSim.Region.Framework.Interfaces UUID ActiveGroupId { get; set; } UUID Owner { get; } string profileAbout { get; set; } + string Born { get; set; } } public interface INPCModule diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 1096eae7b7..b904353611 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -70,6 +70,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC private readonly UUID m_ownerID; private UUID m_hostGroupID; private string m_profileAbout = ""; + private string m_born; public List SelectedObjects {get; private set;} public NPCAvatar( @@ -611,6 +612,12 @@ namespace OpenSim.Region.OptionalModules.World.NPC set { } } + public string Born + { + get { return m_born; } + set { m_born = value; } + } + public bool IsGroupMember(UUID groupID) { return (m_hostGroupID == groupID); diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 8462661232..ced82e6b57 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -168,6 +168,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC AvatarAppearance appearance) { NPCAvatar npcAvatar = null; + string born = DateTime.UtcNow.ToString(); try { @@ -222,6 +223,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC ScenePresence sp; if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp)) { + npcAvatar.Born = born; npcAvatar.ActiveGroupId = groupID; sp.CompleteMovement(npcAvatar, false); sp.Grouptitle = groupTitle; From ba61b64c424abed18052a68955f996d9eb81d9b7 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sun, 11 Dec 2016 20:50:17 +0000 Subject: [PATCH 09/25] If a region address is resolveable to a single address, resolve it on startup and use that address This change facilitates running opensim within containers and VMs where the external address isn't that of the VM/container but that of the host. --- OpenSim/Framework/RegionInfo.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index ca17793e64..f764a347f6 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -708,7 +708,11 @@ namespace OpenSim.Framework } else { - m_externalHostName = externalName; + IPAddress[] addrs = Dns.GetHostAddresses(externalName); + if (addrs.Length != 1) // If it is ambiguous or not resolveable, use it literally + m_externalHostName = externalName; + else + m_externalHostName = addrs[0].ToString(); } // RegionType From 4d1536f1ecde8ed03e1f2e69f45207eb9dddfa7c Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Mon, 12 Dec 2016 00:07:36 +0000 Subject: [PATCH 10/25] Allow OpenSim to respond to Unix signals. This may need work to be properly ignoed on Windows. Windows devs, please test and check for platform flags if this causes issues in Windows --- OpenSim/Region/Application/OpenSim.cs | 25 +++++++++++++++++++++++-- bin/Mono.Posix.dll | Bin 0 -> 207872 bytes prebuild.xml | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100755 bin/Mono.Posix.dll diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index cf2bf33231..203fe5ec8b 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -26,6 +26,7 @@ */ using System; +using System.Threading; using System.Collections; using System.Collections.Generic; using System.Diagnostics; @@ -74,7 +75,7 @@ namespace OpenSim private string m_timedScript = "disabled"; private int m_timeInterval = 1200; - private Timer m_scriptTimer; + private System.Timers.Timer m_scriptTimer; public OpenSim(IConfigSource configSource) : base(configSource) { @@ -125,6 +126,25 @@ namespace OpenSim m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod); } + private static Mono.Unix.UnixSignal[] signals = new Mono.Unix.UnixSignal[] + { +// new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGINT), + new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGTERM) + }; + + private Thread signal_thread = new Thread (delegate () + { + System.Console.WriteLine("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"); + while (true) + { + // Wait for a signal to be delivered + int index = Mono.Unix.UnixSignal.WaitAny (signals, -1); + + //Mono.Unix.Native.Signum signal = signals [index].Signum; + MainConsole.Instance.RunCommand("shutdown"); + } + }); + /// /// Performs initialisation of the scene, such as loading configuration from disk. /// @@ -134,6 +154,7 @@ namespace OpenSim m_log.Info("========================= STARTING OPENSIM ========================="); m_log.Info("===================================================================="); + signal_thread.Start(); //m_log.InfoFormat("[OPENSIM MAIN]: GC Is Server GC: {0}", GCSettings.IsServerGC.ToString()); // http://msdn.microsoft.com/en-us/library/bb384202.aspx //GCSettings.LatencyMode = GCLatencyMode.Batch; @@ -217,7 +238,7 @@ namespace OpenSim // Start timer script (run a script every xx seconds) if (m_timedScript != "disabled") { - m_scriptTimer = new Timer(); + m_scriptTimer = new System.Timers.Timer(); m_scriptTimer.Enabled = true; m_scriptTimer.Interval = m_timeInterval*1000; m_scriptTimer.Elapsed += RunAutoTimerScript; diff --git a/bin/Mono.Posix.dll b/bin/Mono.Posix.dll new file mode 100755 index 0000000000000000000000000000000000000000..97ec8bf3f272f87c5b83ecabc37101b2f3eb0b84 GIT binary patch literal 207872 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

wh3F&xmBb#e>OU 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 j8l{|CW5 B&`AIQ literal 0 HcmV?d00001 diff --git a/prebuild.xml b/prebuild.xml index 2bb053ec51..cb39e18e16 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1790,6 +1790,7 @@ + From da2c1e8aadd3de2821e1aa1e002259876077d271 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 12 Dec 2016 00:54:41 +0000 Subject: [PATCH 11/25] don't do unix signals on windows --- OpenSim/Region/Application/OpenSim.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 203fe5ec8b..aba09e03c0 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -126,11 +126,8 @@ namespace OpenSim m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod); } - private static Mono.Unix.UnixSignal[] signals = new Mono.Unix.UnixSignal[] - { -// new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGINT), - new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGTERM) - }; + private static Mono.Unix.UnixSignal[] signals; + private Thread signal_thread = new Thread (delegate () { @@ -154,7 +151,16 @@ namespace OpenSim m_log.Info("========================= STARTING OPENSIM ========================="); m_log.Info("===================================================================="); - signal_thread.Start(); + if(!Util.IsWindows()) + { + // linux mac os specifics + signals = new Mono.Unix.UnixSignal[] + { +// new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGINT), + new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGTERM) + }; + signal_thread.Start(); + } //m_log.InfoFormat("[OPENSIM MAIN]: GC Is Server GC: {0}", GCSettings.IsServerGC.ToString()); // http://msdn.microsoft.com/en-us/library/bb384202.aspx //GCSettings.LatencyMode = GCLatencyMode.Batch; From cdfdf6322defc614a1261a38c710bf3f73cd4dc7 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Mon, 12 Dec 2016 09:26:12 +0000 Subject: [PATCH 12/25] Applying a modified version of TomTheDragon's patch to prevent the sim from crashing when signals are unavailable. --- OpenSim/Region/Application/OpenSim.cs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index aba09e03c0..3cb999bee5 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -131,7 +131,6 @@ namespace OpenSim private Thread signal_thread = new Thread (delegate () { - System.Console.WriteLine("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"); while (true) { // Wait for a signal to be delivered @@ -153,13 +152,21 @@ namespace OpenSim if(!Util.IsWindows()) { - // linux mac os specifics - signals = new Mono.Unix.UnixSignal[] + try { -// new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGINT), - new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGTERM) - }; - signal_thread.Start(); + // linux mac os specifics + signals = new Mono.Unix.UnixSignal[] + { + new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGTERM) + }; + signal_thread.Start(); + } + catch (Exception e) + { + m_log.Info("Could not set up UNIX signal handlers. SIGTERM will not"); + m_log.InfoFormat("shut down gracefully: {0}", e.Message); + m_log.Debug("Exception was: ", e); + } } //m_log.InfoFormat("[OPENSIM MAIN]: GC Is Server GC: {0}", GCSettings.IsServerGC.ToString()); // http://msdn.microsoft.com/en-us/library/bb384202.aspx From 9ef9dde0f3ea9185bb9aca03d173e5312e1ba308 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Mon, 12 Dec 2016 10:08:31 +0000 Subject: [PATCH 13/25] Make resolving the IP on startup optional. Adds ResolveAddress boolean to regions.ini --- OpenSim/Framework/RegionInfo.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index f764a347f6..d7a51ec975 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -147,6 +147,7 @@ namespace OpenSim.Framework public string RemotingAddress; public UUID ScopeID = UUID.Zero; private UUID m_maptileStaticUUID = UUID.Zero; + private bool m_resolveAddress = false; public uint WorldLocX = 0; public uint WorldLocY = 0; @@ -686,6 +687,20 @@ namespace OpenSim.Framework config.Set("AllowAlternatePorts", m_allow_alternate_ports.ToString()); } + // ResolveAddress + // + allKeys.Remove("ResolveAddress"); + if (config.Contains("ResolveAddress")) + { + m_resolveAddress = config.GetBoolean("ResolveAddress", false); + } + else + { + m_resolveAddress = Convert.ToBoolean(MainConsole.Instance.CmdPrompt("Resolve hostname to IP on start (for running inside Docker)", "False")); + + config.Set("ResolveAddress", m_resolveAddress.ToString()); + } + // ExternalHostName // allKeys.Remove("ExternalHostName"); @@ -706,6 +721,10 @@ namespace OpenSim.Framework "[REGIONINFO]: Resolving SYSTEMIP to {0} for external hostname of region {1}", m_externalHostName, name); } + else if (!m_resolveAddress) + { + m_externalHostName = externalName; + } else { IPAddress[] addrs = Dns.GetHostAddresses(externalName); From bebfbd0600671a34e87303dc6ba34e994182f993 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Mon, 12 Dec 2016 10:14:16 +0000 Subject: [PATCH 14/25] Only ask for the new parameter when starting from scratch. It is set to false implicitly on existing regions. --- OpenSim/Framework/RegionInfo.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index d7a51ec975..adffe13237 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -545,7 +545,7 @@ namespace OpenSim.Framework private void ReadNiniConfig(IConfigSource source, string name) { -// bool creatingNew = false; + bool creatingNew = false; if (source.Configs.Count == 0) { @@ -569,7 +569,7 @@ namespace OpenSim.Framework source.AddConfig(name); -// creatingNew = true; + creatingNew = true; } if (name == String.Empty) @@ -696,7 +696,8 @@ namespace OpenSim.Framework } else { - m_resolveAddress = Convert.ToBoolean(MainConsole.Instance.CmdPrompt("Resolve hostname to IP on start (for running inside Docker)", "False")); + if (creatingNew) + m_resolveAddress = Convert.ToBoolean(MainConsole.Instance.CmdPrompt("Resolve hostname to IP on start (for running inside Docker)", "False")); config.Set("ResolveAddress", m_resolveAddress.ToString()); } From 1388ac2ef7d774b4d25f18d237fdad89d7ac43ac Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Mon, 12 Dec 2016 11:09:38 +0000 Subject: [PATCH 15/25] Rename charterMember to membershipType to show what it actually is. This field started out as a simple flag in the protocol to indicate a user being a SL charter member. It has since then taken on additional functionality that means that the name is no longer appropriate. --- OpenSim/Framework/IClientAPI.cs | 2 +- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 4 ++-- .../CoreModules/Avatar/Profile/BasicProfileModule.cs | 4 ++-- .../Avatar/UserProfiles/UserProfileModule.cs | 12 ++++++------ .../InternetRelayClientView/Server/IRCClientView.cs | 2 +- .../Region/OptionalModules/World/NPC/NPCAvatar.cs | 2 +- .../Services/Connectors/SimianGrid/SimianProfiles.cs | 8 ++++---- OpenSim/Tests/Common/Mock/TestClient.cs | 2 +- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index f1290b9a2a..c4de81e93a 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -1293,7 +1293,7 @@ namespace OpenSim.Framework void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks); void SendViewerTime(int phase); - void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember, string flAbout, + void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] membershipType, string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID); void SendScriptQuestion(UUID taskID, string taskName, string ownerName, UUID itemID, int question); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ce7ee98d9b..a69b670cd7 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -2704,7 +2704,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP OutPacket(packet, ThrottleOutPacketType.Task); } - public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember, + public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] membershipType, string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID) { @@ -2716,7 +2716,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP else avatarReply.PropertiesData.AboutText = Utils.EmptyBytes; avatarReply.PropertiesData.BornOn = Util.StringToBytes256(bornOn); - avatarReply.PropertiesData.CharterMember = charterMember; + avatarReply.PropertiesData.CharterMember = membershipType; if (flAbout != null) avatarReply.PropertiesData.FLAboutText = Util.StringToBytes256(flAbout); else diff --git a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs index 2bb24ae880..0b1dbc71ca 100644 --- a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs @@ -154,7 +154,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile name = account.FirstName + " " + account.LastName; created = account.Created; } - Byte[] charterMember = Utils.StringToBytes(name); + Byte[] membershipType = Utils.StringToBytes(name); profileUrl = "No profile data"; aboutText = string.Empty; @@ -166,7 +166,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile remoteClient.SendAvatarProperties(avatarID, aboutText, Util.ToDateTime(created).ToString( "M/d/yyyy", CultureInfo.InvariantCulture), - charterMember, firstLifeAboutText, + membershipType, firstLifeAboutText, (uint)(0 & 0xff), firstLifeImage, image, profileUrl, partner); diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index 7d68299cd5..ce5816bf9b 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -1032,7 +1032,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles userInfo = new Dictionary(); } - Byte[] charterMember = new Byte[1]; + Byte[] membershipType = new Byte[1]; string born = String.Empty; uint flags = 0x00; @@ -1040,11 +1040,11 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles { if (account.UserTitle == "") { - charterMember[0] = (Byte)((account.UserFlags & 0xf00) >> 8); + membershipType[0] = (Byte)((account.UserFlags & 0xf00) >> 8); } else { - charterMember = Utils.StringToBytes(account.UserTitle); + membershipType = Utils.StringToBytes(account.UserTitle); } born = Util.ToDateTime(account.Created).ToString( @@ -1057,11 +1057,11 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles { if ((string)userInfo["user_title"] == "") { - charterMember[0] = (Byte)(((Byte)userInfo["user_flags"] & 0xf00) >> 8); + membershipType[0] = (Byte)(((Byte)userInfo["user_flags"] & 0xf00) >> 8); } else { - charterMember = Utils.StringToBytes((string)userInfo["user_title"]); + membershipType = Utils.StringToBytes((string)userInfo["user_title"]); } int val_born = (int)userInfo["user_created"]; @@ -1085,7 +1085,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles return; } - remoteClient.SendAvatarProperties(props.UserId, props.AboutText, born, charterMember , props.FirstLifeText, flags, + remoteClient.SendAvatarProperties(props.UserId, props.AboutText, born, membershipType , props.FirstLifeText, flags, props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId); diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 15d31bddbb..8b8ebe0915 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -1247,7 +1247,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } - public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, byte[] charterMember, string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID) + public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, byte[] membershipType, string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID) { } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index b904353611..a929e80602 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -981,7 +981,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC { } - public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember, + public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] membershipType, string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID) { diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs index 8fc766d9e0..17f4fc694b 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs @@ -308,11 +308,11 @@ namespace OpenSim.Services.Connectors.SimianGrid about = new OSDMap(0); // Check if this user is a grid operator - byte[] charterMember; + byte[] membershipType; if (user["AccessLevel"].AsInteger() >= 200) - charterMember = Utils.StringToBytes("Operator"); + membershipType = Utils.StringToBytes("Operator"); else - charterMember = Utils.EmptyBytes; + membershipType = Utils.EmptyBytes; // Check if the user is online if (client.Scene is Scene) @@ -327,7 +327,7 @@ namespace OpenSim.Services.Connectors.SimianGrid flags |= ProfileFlags.Identified; client.SendAvatarProperties(avatarID, about["About"].AsString(), user["CreationDate"].AsDate().ToString("M/d/yyyy", - System.Globalization.CultureInfo.InvariantCulture), charterMember, about["FLAbout"].AsString(), (uint)flags, + System.Globalization.CultureInfo.InvariantCulture), membershipType, about["FLAbout"].AsString(), (uint)flags, about["FLImage"].AsUUID(), about["Image"].AsUUID(), about["URL"].AsString(), user["Partner"].AsUUID()); OSDMap interests = null; diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 9251c4fcd3..f407e5a7c1 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -990,7 +990,7 @@ namespace OpenSim.Tests.Common { } - public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember, + public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] membershipType, string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID) { From fe3303dc110b4932717031278d64ab2e6900e99b Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 12 Dec 2016 17:53:40 +0000 Subject: [PATCH 16/25] ubOde simple spheres and boxes with type convex have no holes on physics(long forgotten fix) --- .../PhysicsModules/ubOde/ODEMeshWorker.cs | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs index a9774730e6..5a3008d09a 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs @@ -239,7 +239,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (m_scene.haveActor(repData.actor)) { - if (needsMeshing(repData.pbs)) // no need for pbs now? + if (needsMeshing(repData)) // no need for pbs now? { repData.comand = meshWorkerCmnds.changefull; createqueue.Enqueue(repData); @@ -284,8 +284,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde /// /// /// - public bool needsMeshing(PrimitiveBaseShape pbs) + public bool needsMeshing(ODEPhysRepData repData) { + PrimitiveBaseShape pbs = repData.pbs; // check sculpts or meshs if (pbs.SculptEntry) { @@ -301,6 +302,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (forceSimplePrimMeshing) return true; + // convex shapes have no holes + ushort profilehollow = pbs.ProfileHollow; + if(repData.shapetype == 2) + profilehollow = 0; + // if it's a standard box or sphere with no cuts, hollows, twist or top shear, return false since ODE can use an internal representation for the prim if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) @@ -309,7 +315,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 - && pbs.ProfileHollow == 0 + && profilehollow == 0 && pbs.PathTwist == 0 && pbs.PathTwistBegin == 0 && pbs.PathBegin == 0 && pbs.PathEnd == 0 && pbs.PathTaperX == 0 && pbs.PathTaperY == 0 @@ -326,7 +332,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde int iPropertiesNotSupportedDefault = 0; - if (pbs.ProfileHollow != 0) + if (profilehollow != 0) iPropertiesNotSupportedDefault++; if ((pbs.PathBegin != 0) || pbs.PathEnd != 0) @@ -407,7 +413,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde PhysicsActor actor = repData.actor; PrimitiveBaseShape pbs = repData.pbs; - if (!needsMeshing(pbs)) + if (!needsMeshing(repData)) { repData.meshState = MeshState.noNeed; repData.hasOBB = false; @@ -417,16 +423,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde IMesh mesh = null; Vector3 size = repData.size; - byte shapetype = repData.shapetype; - - bool convex; int clod = (int)LevelOfDetail.High; + bool convex; + byte shapetype = repData.shapetype; if (shapetype == 0) convex = false; else { convex = true; + // sculpts pseudo convex if (pbs.SculptType != (byte)SculptType.Mesh) clod = (int)LevelOfDetail.Low; } @@ -483,7 +489,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde repData.mesh = null; repData.hasOBB = false; - if (!needsMeshing(pbs)) + if (!needsMeshing(repData)) { repData.meshState = MeshState.noNeed; return; From 7d8cb244d1148d70b43c51add04e095bd1160cd7 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 12 Dec 2016 19:16:51 +0000 Subject: [PATCH 17/25] ubOde other convex type objects other than mesh and sculpt also don't have holes --- OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs | 2 +- .../Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs index 5a3008d09a..bb661e54ad 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs @@ -433,7 +433,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { convex = true; // sculpts pseudo convex - if (pbs.SculptType != (byte)SculptType.Mesh) + if (pbs.SculptEntry && pbs.SculptType != (byte)SculptType.Mesh) clod = (int)LevelOfDetail.Low; } diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs index 2ae0881e78..7f0713a7c3 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs @@ -349,7 +349,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing } else { - if (!GenerateCoordsAndFacesFromPrimShapeData(primName, primShape, lod, out coords, out faces)) + if (!GenerateCoordsAndFacesFromPrimShapeData(primName, primShape, lod, convex, out coords, out faces)) return null; } @@ -942,7 +942,8 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing /// Faces are added to this list by the method. /// true if coords and faces were successfully generated, false if not private bool GenerateCoordsAndFacesFromPrimShapeData( - string primName, PrimitiveBaseShape primShape, float lod, out List coords, out List faces) + string primName, PrimitiveBaseShape primShape, float lod, bool convex, + out List coords, out List faces) { PrimMesh primMesh; coords = new List(); @@ -970,7 +971,9 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing profileBegin = profileEnd - 0.02f; float profileHollow = (float)primShape.ProfileHollow * 2.0e-5f; - if (profileHollow > 0.95f) + if(convex) + profileHollow = 0.0f; + else if (profileHollow > 0.95f) profileHollow = 0.95f; int sides = 4; From ee58beddece251f58e3befb0b6aa7f78d5ab372b Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Tue, 13 Dec 2016 14:43:10 +0000 Subject: [PATCH 18/25] Make sure sims on Linux can be restarted without waiting on a 2 mintue socket timeout --- .../Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs index 4d726b43dd..fffd02c347 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs @@ -217,10 +217,6 @@ namespace OpenMetaverse SocketType.Dgram, ProtocolType.Udp); - // OpenSim may need this but in AVN, this messes up automated - // sim restarts badly - //m_udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, false); - try { if (m_udpSocket.Ttl < 128) @@ -248,7 +244,13 @@ namespace OpenMetaverse // we never want two regions to listen on the same port as they cannot demultiplex each other's messages, // leading to a confusing bug. // By default, Windows does not allow two sockets to bind to the same port. - m_udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, false); + // + // Unfortunately, this also causes a crashed sim to leave the socket in a state + // where it appears to be in use but is really just hung from the old process + // crashing rather than closing it. While this protects agains misconfiguration, + // allowing crashed sims to be started up again right away, rather than having to + // wait 2 minutes for the socket to clear is more valuable. Commented 12/13/2016 + // m_udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, false); if (recvBufferSize != 0) m_udpSocket.ReceiveBufferSize = recvBufferSize; From 69776aa70ce662ccd0ad3d9f2ecefb86671bbcb3 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Tue, 13 Dec 2016 19:47:26 +0000 Subject: [PATCH 19/25] Remove the AllowAlternatePorts option. It wasn't implemented anyway. Instead, handle the port being 0 as "any port" and assign a random port for regions in that case. --- OpenSim/Framework/RegionInfo.cs | 34 ++----------------- .../ClientStack/Linden/UDP/LLUDPServer.cs | 11 +++--- .../ClientStack/Linden/UDP/OpenSimUDPBase.cs | 8 +++++ .../Common/Helpers/ClientStackHelpers.cs | 4 +-- OpenSim/Tests/Common/Mock/TestLLUDPServer.cs | 4 +-- 5 files changed, 21 insertions(+), 40 deletions(-) diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index adffe13237..8f754a5ef2 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -138,8 +138,6 @@ namespace OpenSim.Framework protected uint m_httpPort; protected string m_serverURI; protected string m_regionName = String.Empty; - protected bool Allow_Alternate_Ports; - public bool m_allow_alternate_ports; protected string m_externalHostName; protected IPEndPoint m_internalEndPoint; protected uint m_remotingPort; @@ -673,20 +671,6 @@ namespace OpenSim.Framework } m_internalEndPoint = new IPEndPoint(address, port); - // AllowAlternatePorts - // - allKeys.Remove("AllowAlternatePorts"); - if (config.Contains("AllowAlternatePorts")) - { - m_allow_alternate_ports = config.GetBoolean("AllowAlternatePorts", true); - } - else - { - m_allow_alternate_ports = Convert.ToBoolean(MainConsole.Instance.CmdPrompt("Allow alternate ports", "False")); - - config.Set("AllowAlternatePorts", m_allow_alternate_ports.ToString()); - } - // ResolveAddress // allKeys.Remove("ResolveAddress"); @@ -925,8 +909,6 @@ namespace OpenSim.Framework config.Set("InternalAddress", m_internalEndPoint.Address.ToString()); config.Set("InternalPort", m_internalEndPoint.Port); - config.Set("AllowAlternatePorts", m_allow_alternate_ports.ToString()); - config.Set("ExternalHostName", m_externalHostName); if (m_nonphysPrimMin > 0) @@ -1019,10 +1001,6 @@ namespace OpenSim.Framework configMember.addConfigurationOption("internal_ip_port", ConfigurationOption.ConfigurationTypes.TYPE_INT32, "Internal IP Port for incoming UDP client connections", m_internalEndPoint.Port.ToString(), true); - configMember.addConfigurationOption("allow_alternate_ports", - ConfigurationOption.ConfigurationTypes.TYPE_BOOLEAN, - "Allow sim to find alternate UDP ports when ports are in use?", - m_allow_alternate_ports.ToString(), true); configMember.addConfigurationOption("external_host_name", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "External Host Name", m_externalHostName, true); @@ -1092,9 +1070,6 @@ namespace OpenSim.Framework configMember.addConfigurationOption("internal_ip_port", ConfigurationOption.ConfigurationTypes.TYPE_INT32, "Internal IP Port for incoming UDP client connections", ConfigSettings.DefaultRegionHttpPort.ToString(), false); - configMember.addConfigurationOption("allow_alternate_ports", ConfigurationOption.ConfigurationTypes.TYPE_BOOLEAN, - "Allow sim to find alternate UDP ports when ports are in use?", - "false", true); configMember.addConfigurationOption("external_host_name", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "External Host Name", "127.0.0.1", false); @@ -1165,9 +1140,6 @@ namespace OpenSim.Framework case "internal_ip_port": m_internalEndPoint.Port = (int) configuration_result; break; - case "allow_alternate_ports": - m_allow_alternate_ports = (bool) configuration_result; - break; case "external_host_name": if ((string) configuration_result != "SYSTEMIP") { @@ -1244,7 +1216,6 @@ namespace OpenSim.Framework if ((RemotingAddress != null) && !RemotingAddress.Equals("")) args["remoting_address"] = OSD.FromString(RemotingAddress); args["remoting_port"] = OSD.FromString(RemotingPort.ToString()); - args["allow_alt_ports"] = OSD.FromBoolean(m_allow_alternate_ports); if ((proxyUrl != null) && !proxyUrl.Equals("")) args["proxy_url"] = OSD.FromString(proxyUrl); if (RegionType != String.Empty) @@ -1299,8 +1270,6 @@ namespace OpenSim.Framework RemotingAddress = args["remoting_address"].AsString(); if (args["remoting_port"] != null) UInt32.TryParse(args["remoting_port"].AsString(), out m_remotingPort); - if (args["allow_alt_ports"] != null) - m_allow_alternate_ports = args["allow_alt_ports"].AsBoolean(); if (args["proxy_url"] != null) proxyUrl = args["proxy_url"].AsString(); if (args["region_type"] != null) @@ -1338,7 +1307,8 @@ namespace OpenSim.Framework kvp["http_port"] = HttpPort.ToString(); kvp["internal_ip_address"] = InternalEndPoint.Address.ToString(); kvp["internal_port"] = InternalEndPoint.Port.ToString(); - kvp["alternate_ports"] = m_allow_alternate_ports.ToString(); + // TODO: Remove in next major version + kvp["alternate_ports"] = "False"; kvp["server_uri"] = ServerURI; return kvp; diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index a868e3aa44..cedb9b4fec 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -81,7 +81,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP uint port = (uint)scene.RegionInfo.InternalEndPoint.Port; IPAddress listenIP = scene.RegionInfo.InternalEndPoint.Address; - Initialise(listenIP, ref port, scene.RegionInfo.ProxyOffset, scene.RegionInfo.m_allow_alternate_ports, m_Config, scene.AuthenticateHandler); + Initialise(listenIP, ref port, scene.RegionInfo.ProxyOffset, m_Config, scene.AuthenticateHandler); scene.RegionInfo.InternalEndPoint.Port = (int)port; AddScene(scene); @@ -98,9 +98,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP } #endregion - public virtual void Initialise(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager) + public virtual void Initialise(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, IConfigSource configSource, AgentCircuitManager circuitManager) { - m_udpServer = new LLUDPServer(listenIP, ref port, proxyPortOffsetParm, allow_alternate_port, configSource, circuitManager); + m_udpServer = new LLUDPServer(listenIP, ref port, proxyPortOffsetParm, configSource, circuitManager); } public virtual void AddScene(IScene scene) @@ -430,12 +430,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP public JobEngine OqrEngine { get; protected set; } public LLUDPServer( - IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, + IPAddress listenIP, ref uint port, int proxyPortOffsetParm, IConfigSource configSource, AgentCircuitManager circuitManager) : base(listenIP, (int)port) { #region Environment.TickCount Measurement + // Update the port with the one we actually got + port = (uint)Port; + // Measure the resolution of Environment.TickCount TickCountResolution = 0f; for (int i = 0; i < 10; i++) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs index fffd02c347..831381e8ce 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs @@ -107,6 +107,11 @@ namespace OpenMetaverse /// public float AverageReceiveTicksForLastSamplePeriod { get; private set; } + public int Port + { + get { return m_udpPort; } + } + #region PacketDropDebugging ///

/// For debugging purposes only... random number generator for dropping @@ -257,6 +262,9 @@ namespace OpenMetaverse m_udpSocket.Bind(ipep); + if (m_udpPort == 0) + m_udpPort = ((IPEndPoint)m_udpSocket.LocalEndPoint).Port; + IsRunningInbound = true; // kick off an async receive. The Start() method will return, the diff --git a/OpenSim/Tests/Common/Helpers/ClientStackHelpers.cs b/OpenSim/Tests/Common/Helpers/ClientStackHelpers.cs index 33cd8a2cd4..df9f6f22c8 100644 --- a/OpenSim/Tests/Common/Helpers/ClientStackHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/ClientStackHelpers.cs @@ -86,10 +86,10 @@ namespace OpenSim.Tests.Common uint port = 0; AgentCircuitManager acm = scene.AuthenticateHandler; - TestLLUDPServer udpServer = new TestLLUDPServer(IPAddress.Any, ref port, 0, false, configSource, acm); + TestLLUDPServer udpServer = new TestLLUDPServer(IPAddress.Any, ref port, 0, configSource, acm); udpServer.AddScene(scene); return udpServer; } } -} \ No newline at end of file +} diff --git a/OpenSim/Tests/Common/Mock/TestLLUDPServer.cs b/OpenSim/Tests/Common/Mock/TestLLUDPServer.cs index 26887c9ebd..b2c6a8cc4c 100644 --- a/OpenSim/Tests/Common/Mock/TestLLUDPServer.cs +++ b/OpenSim/Tests/Common/Mock/TestLLUDPServer.cs @@ -43,8 +43,8 @@ namespace OpenSim.Tests.Common { public List PacketsSent { get; private set; } - public TestLLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager) - : base(listenIP, ref port, proxyPortOffsetParm, allow_alternate_port, configSource, circuitManager) + public TestLLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, IConfigSource configSource, AgentCircuitManager circuitManager) + : base(listenIP, ref port, proxyPortOffsetParm, configSource, circuitManager) { PacketsSent = new List(); } From ec883d0f1504e8573f763882231cb1da06bdc2a1 Mon Sep 17 00:00:00 2001 From: Mandarinka Tasty Date: Wed, 14 Dec 2016 01:14:23 +0100 Subject: [PATCH 20/25] New OSSL function: osNpcSetProfileImage(LSL_Key npc, string image); This patch gives possibility to set image in created NPC's profile. You can use UUID of the texture or name of texture included in prim's inventory. Signed-off-by: Mandarinka Tasty Signed-off-by: UbitUmarov --- .../Avatar/UserProfiles/UserProfileModule.cs | 2 +- .../Region/Framework/Interfaces/INPCModule.cs | 1 + .../OptionalModules/World/NPC/NPCAvatar.cs | 8 +++++ .../Shared/Api/Implementation/OSSL_Api.cs | 29 +++++++++++++++++++ .../Shared/Api/Interface/IOSSL_Api.cs | 1 + .../Shared/Api/Runtime/OSSL_Stub.cs | 5 ++++ 6 files changed, 45 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index ce5816bf9b..5314927c17 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -1011,7 +1011,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles { remoteClient.SendAvatarProperties(avatarID, ((INPC)(p.ControllingClient)).profileAbout, ((INPC)(p.ControllingClient)).Born, Utils.StringToBytes("Non Player Character (NPC)"), "NPCs have no life", 16, - UUID.Zero, UUID.Zero, "", UUID.Zero); + UUID.Zero, ((INPC)(p.ControllingClient)).profileImage, "", UUID.Zero); remoteClient.SendAvatarInterestsReply(avatarID, 0, "", 0, "Getting into trouble", "Droidspeak"); return; diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index dd4226cde7..813be4f93e 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -59,6 +59,7 @@ namespace OpenSim.Region.Framework.Interfaces UUID ActiveGroupId { get; set; } UUID Owner { get; } string profileAbout { get; set; } + UUID profileImage { get; set; } string Born { get; set; } } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index a929e80602..0cabe47c0a 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -70,6 +70,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC private readonly UUID m_ownerID; private UUID m_hostGroupID; private string m_profileAbout = ""; + private UUID m_profileImage = UUID.Zero; private string m_born; public List SelectedObjects {get; private set;} @@ -110,6 +111,13 @@ namespace OpenSim.Region.OptionalModules.World.NPC m_profileAbout = value; } } + + public UUID profileImage + { + get { return m_profileImage; } + set { m_profileImage = value; } + } + public IScene Scene { get { return m_scene; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index b101cf9b44..dd4da0a620 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -3018,6 +3018,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } + public void osNpcSetProfileImage(LSL_Key npc, string image) + { + CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); + m_host.AddScriptLPS(1); + + INPCModule module = World.RequestModuleInterface(); + if (module != null) + { + UUID npcId = new UUID(npc.m_string); + + if (!module.CheckPermissions(npcId, m_host.OwnerID)) + return; + + UUID ImageID = new UUID(); + + ImageID = ScriptUtils.GetAssetIdFromItemName(m_host, image, (int)AssetType.Texture); + + if (ImageID == null || ImageID == UUID.Zero) + { + if (!UUID.TryParse(image, out ImageID)) + return; + } + + ScenePresence sp = World.GetScenePresence(npcId); + if (sp != null) + ((INPC)(sp.ControllingClient)).profileImage = ImageID; + } + } + public void osNpcSay(LSL_Key npc, string message) { osNpcSay(npc, 0, message); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 87b09675b2..cf3e6df31d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -344,6 +344,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void osNpcSetRot(LSL_Key npc, rotation rot); void osNpcStopMoveToTarget(LSL_Key npc); void osNpcSetProfileAbout(LSL_Key npc, string about); + void osNpcSetProfileImage(LSL_Key npc, string image); void osNpcSay(key npc, string message); void osNpcSay(key npc, int channel, string message); void osNpcShout(key npc, int channel, string message); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 5bc998e8c1..2e8a76c34e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -642,6 +642,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_OSSL_Functions.osNpcSetProfileAbout(npc, about); } + public void osNpcSetProfileImage(LSL_Key npc, string image) + { + m_OSSL_Functions.osNpcSetProfileImage(npc, image); + } + public void osNpcSay(key npc, string message) { m_OSSL_Functions.osNpcSay(npc, message); From a75c16e1bfee8679f61e513426e876635b3345cf Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Wed, 14 Dec 2016 01:00:48 +0000 Subject: [PATCH 21/25] Fox threat level line on SetProfileImage. It is ALWAYS the name of the function! Low is justified because setting an image requires having a NPC in the first place.... --- .../Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index dd4da0a620..a827e30137 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -3020,7 +3020,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcSetProfileImage(LSL_Key npc, string image) { - CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); + CheckThreatLevel(ThreatLevel.Low, "osNpcSetProfileImage"); m_host.AddScriptLPS(1); INPCModule module = World.RequestModuleInterface(); From 1c08b3d8f9e10ba11b70e99a92b7ca1272079a94 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 14 Dec 2016 01:16:21 +0000 Subject: [PATCH 22/25] also fox chekc threat level on osNpcSetProfileAbout --- .../Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index a827e30137..bdecf72c3b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -3001,7 +3001,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcSetProfileAbout(LSL_Key npc, string about) { - CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); + CheckThreatLevel(ThreatLevel.High, "osNpcSetProfileAbout"); m_host.AddScriptLPS(1); INPCModule module = World.RequestModuleInterface(); From 1ffc81c8690b039a578155fb76bbbd2307ae3ebc Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 14 Dec 2016 01:31:16 +0000 Subject: [PATCH 23/25] also reduce check threat level of osNpcSetProfileAbout to Low; update osslEnable.ini --- .../Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 +- bin/config-include/osslEnable.ini | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index bdecf72c3b..9742119d66 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -3001,7 +3001,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcSetProfileAbout(LSL_Key npc, string about) { - CheckThreatLevel(ThreatLevel.High, "osNpcSetProfileAbout"); + CheckThreatLevel(ThreatLevel.Low, "osNpcSetProfileAbout"); m_host.AddScriptLPS(1); INPCModule module = World.RequestModuleInterface(); diff --git a/bin/config-include/osslEnable.ini b/bin/config-include/osslEnable.ini index 4c6be1604c..59a162a98d 100644 --- a/bin/config-include/osslEnable.ini +++ b/bin/config-include/osslEnable.ini @@ -139,6 +139,8 @@ Allow_osMessageObject = ${XEngine|osslParcelOG}ESTATE_MANAGER,ESTATE_OWNER Allow_osRegexIsMatch = true Allow_osGetAvatarHomeURI = ${XEngine|osslParcelOG}ESTATE_MANAGER,ESTATE_OWNER + Allow_osNpcSetProfileAbout = ${XEngine|osslParcelOG}ESTATE_MANAGER,ESTATE_OWNER + Allow_osNpcSetProfileImage = ${XEngine|osslParcelOG}ESTATE_MANAGER,ESTATE_OWNER ; ThreatLevel Moderate Allow_osDropAttachment = ${XEngine|osslParcelO}ESTATE_MANAGER,ESTATE_OWNER From 364d58635ba4479d4eb267a4b021cc2be211bbde Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 14 Dec 2016 03:02:57 +0000 Subject: [PATCH 24/25] avoid a null ref --- OpenSim/Region/OptionalModules/DataSnapshot/LandSnapshot.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/OptionalModules/DataSnapshot/LandSnapshot.cs b/OpenSim/Region/OptionalModules/DataSnapshot/LandSnapshot.cs index 5c791e6e76..eb2867d548 100644 --- a/OpenSim/Region/OptionalModules/DataSnapshot/LandSnapshot.cs +++ b/OpenSim/Region/OptionalModules/DataSnapshot/LandSnapshot.cs @@ -268,8 +268,12 @@ namespace OpenSim.Region.DataSnapshot.Providers { XmlNode username = nodeFactory.CreateNode(XmlNodeType.Element, "name", ""); UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, userOwnerUUID); - username.InnerText = account.FirstName + " " + account.LastName; + if(account != null) + username.InnerText = account.FirstName + " " + account.LastName; + else + username.InnerText = "UnKnown"; userblock.AppendChild(username); + } catch (Exception) { From 50842347ace4f9ada316364d08ccc0675901f84b Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 14 Dec 2016 04:00:48 +0000 Subject: [PATCH 25/25] fix: check for region_handle before region_id, viewers are so funny.. --- .../World/Land/LandManagementModule.cs | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 98f1f3bd44..bec5322341 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -72,8 +72,6 @@ namespace OpenSim.Region.CoreModules.World.Land public const int LandUnit = 4; - private static readonly string remoteParcelRequestPath = "0009/"; - private LandChannel landChannel; private Scene m_scene; @@ -1682,12 +1680,13 @@ namespace OpenSim.Region.CoreModules.World.Land private void EventManagerOnRegisterCaps(UUID agentID, Caps caps) { + //string capsBase = "/CAPS/" + UUID.Random(); string capsBase = "/CAPS/" + caps.CapsObjectPath; caps.RegisterHandler( "RemoteParcelRequest", new RestStreamHandler( "POST", - capsBase + remoteParcelRequestPath, + capsBase, (request, path, param, httpRequest, httpResponse) => RemoteParcelRequest(request, path, param, agentID, caps), "RemoteParcelRequest", @@ -1807,24 +1806,7 @@ namespace OpenSim.Region.CoreModules.World.Land ArrayList list = (ArrayList)hash["location"]; uint x = (uint)(double)list[0]; uint y = (uint)(double)list[1]; - if(hash.ContainsKey("region_id")) - { - UUID regionID = (UUID)hash["region_id"]; - if (regionID == m_scene.RegionInfo.RegionID) - { - // a parcel request for a local parcel => no need to query the grid - parcelID = Util.BuildFakeParcelID(m_scene.RegionInfo.RegionHandle, x, y); - } - else - { - // a parcel request for a parcel in another region. Ask the grid about the region - GridRegion info = m_scene.GridService.GetRegionByUUID(scope, regionID); - if (info != null) - parcelID = Util.BuildFakeParcelID(info.RegionHandle, x, y); - } - } - - else if (hash.ContainsKey("region_handle")) + if (hash.ContainsKey("region_handle")) { // if you do a "About Landmark" on a landmark a second time, the viewer sends the // region_handle it got earlier via RegionHandleRequest @@ -1847,6 +1829,24 @@ namespace OpenSim.Region.CoreModules.World.Land } } } + else if(hash.ContainsKey("region_id")) + { + UUID regionID = (UUID)hash["region_id"]; + if (regionID == m_scene.RegionInfo.RegionID) + { + // a parcel request for a local parcel => no need to query the grid + parcelID = Util.BuildFakeParcelID(m_scene.RegionInfo.RegionHandle, x, y); + } + else + { + // a parcel request for a parcel in another region. Ask the grid about the region + GridRegion info = m_scene.GridService.GetRegionByUUID(scope, regionID); + if (info != null) + parcelID = Util.BuildFakeParcelID(info.RegionHandle, x, y); + } + } + + } } catch (LLSD.LLSDParseException e)