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/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index ca17793e64..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; @@ -147,6 +145,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; @@ -544,7 +543,7 @@ namespace OpenSim.Framework private void ReadNiniConfig(IConfigSource source, string name) { -// bool creatingNew = false; + bool creatingNew = false; if (source.Configs.Count == 0) { @@ -568,7 +567,7 @@ namespace OpenSim.Framework source.AddConfig(name); -// creatingNew = true; + creatingNew = true; } if (name == String.Empty) @@ -672,18 +671,19 @@ namespace OpenSim.Framework } m_internalEndPoint = new IPEndPoint(address, port); - // AllowAlternatePorts + // ResolveAddress // - allKeys.Remove("AllowAlternatePorts"); - if (config.Contains("AllowAlternatePorts")) + allKeys.Remove("ResolveAddress"); + if (config.Contains("ResolveAddress")) { - m_allow_alternate_ports = config.GetBoolean("AllowAlternatePorts", true); + m_resolveAddress = config.GetBoolean("ResolveAddress", false); } else { - m_allow_alternate_ports = Convert.ToBoolean(MainConsole.Instance.CmdPrompt("Allow alternate ports", "False")); + if (creatingNew) + m_resolveAddress = Convert.ToBoolean(MainConsole.Instance.CmdPrompt("Resolve hostname to IP on start (for running inside Docker)", "False")); - config.Set("AllowAlternatePorts", m_allow_alternate_ports.ToString()); + config.Set("ResolveAddress", m_resolveAddress.ToString()); } // ExternalHostName @@ -706,10 +706,18 @@ namespace OpenSim.Framework "[REGIONINFO]: Resolving SYSTEMIP to {0} for external hostname of region {1}", m_externalHostName, name); } - else + else if (!m_resolveAddress) { m_externalHostName = externalName; } + else + { + 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 m_regionType = config.GetString("RegionType", String.Empty); @@ -901,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) @@ -995,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); @@ -1068,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); @@ -1141,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") { @@ -1220,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) @@ -1275,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) @@ -1314,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/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; diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index cf2bf33231..3cb999bee5 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,21 @@ namespace OpenSim m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod); } + private static Mono.Unix.UnixSignal[] signals; + + + private Thread signal_thread = new Thread (delegate () + { + 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 +150,24 @@ namespace OpenSim m_log.Info("========================= STARTING OPENSIM ========================="); m_log.Info("===================================================================="); + if(!Util.IsWindows()) + { + try + { + // 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 //GCSettings.LatencyMode = GCLatencyMode.Batch; @@ -217,7 +251,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/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/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 4d726b43dd..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 @@ -217,10 +222,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,13 +249,22 @@ 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; 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/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 5be8556eb8..5314927c17 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -1009,9 +1009,9 @@ 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); + UUID.Zero, ((INPC)(p.ControllingClient)).profileImage, "", UUID.Zero); remoteClient.SendAvatarInterestsReply(avatarID, 0, "", 0, "Getting into trouble", "Droidspeak"); return; @@ -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/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/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) 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); diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index 13103584e1..813be4f93e 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -59,6 +59,8 @@ namespace OpenSim.Region.Framework.Interfaces UUID ActiveGroupId { get; set; } UUID Owner { get; } string profileAbout { get; set; } + UUID profileImage { get; set; } + string Born { get; set; } } public interface INPCModule diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 2cf0e9d3ac..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)) @@ -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 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/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) { diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 1096eae7b7..0cabe47c0a 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -70,6 +70,8 @@ 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;} public NPCAvatar( @@ -109,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; } @@ -611,6 +620,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); @@ -974,7 +989,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/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; diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEMeshWorker.cs index a9774730e6..bb661e54ad 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,17 +423,17 @@ 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; - if (pbs.SculptType != (byte)SculptType.Mesh) + // sculpts pseudo convex + if (pbs.SculptEntry && 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; 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; 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 ""; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index b101cf9b44..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, "osNpcCreate"); + CheckThreatLevel(ThreatLevel.Low, "osNpcSetProfileAbout"); m_host.AddScriptLPS(1); INPCModule module = World.RequestModuleInterface(); @@ -3018,6 +3018,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } + public void osNpcSetProfileImage(LSL_Key npc, string image) + { + CheckThreatLevel(ThreatLevel.Low, "osNpcSetProfileImage"); + 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); 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) 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/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; } 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/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) { 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(); } diff --git a/bin/Mono.Posix.dll b/bin/Mono.Posix.dll new file mode 100755 index 0000000000..97ec8bf3f2 Binary files /dev/null and b/bin/Mono.Posix.dll differ 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 diff --git a/prebuild.xml b/prebuild.xml index 2bb053ec51..cb39e18e16 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1790,6 +1790,7 @@ +