2007-10-31 01:21:04 +00:00
/ *
2008-03-18 05:16:43 +00:00
* Copyright ( c ) Contributors , http : //opensimulator.org/
* See CONTRIBUTORS . TXT for a full list of copyright holders .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
* * Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
2009-06-01 06:37:14 +00:00
* * Neither the name of the OpenSimulator Project nor the
2008-03-18 05:16:43 +00:00
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ` ` AS IS ' ' AND ANY
* EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
* ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
* LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
* /
2007-10-31 01:21:04 +00:00
using System ;
2009-09-21 18:05:01 +00:00
using System.Collections.Generic ;
2007-10-31 01:21:04 +00:00
using System.Net ;
using System.Net.Sockets ;
2010-06-25 17:29:02 +00:00
using System.Reflection ;
2007-12-27 21:41:48 +00:00
using System.Xml ;
2009-06-25 17:53:03 +00:00
using System.IO ;
2010-06-25 17:29:02 +00:00
using log4net ;
2007-12-27 21:41:48 +00:00
using Nini.Config ;
2008-11-08 17:20:54 +00:00
using OpenMetaverse ;
2009-02-14 16:37:55 +00:00
using OpenMetaverse.StructuredData ;
2011-10-25 19:24:21 +00:00
//using OpenSim.Framework.Console;
2007-10-31 01:21:04 +00:00
namespace OpenSim.Framework
2010-04-01 04:30:44 +00:00
{
2010-06-26 22:30:47 +00:00
[Serializable]
2010-03-31 03:20:20 +00:00
public class RegionLightShareData : ICloneable
{
2010-11-03 02:04:17 +00:00
public bool valid = false ;
2010-03-31 03:20:20 +00:00
public UUID regionID = UUID . Zero ;
public Vector3 waterColor = new Vector3 ( 4.0f , 38.0f , 64.0f ) ;
public float waterFogDensityExponent = 4.0f ;
public float underwaterFogModifier = 0.25f ;
public Vector3 reflectionWaveletScale = new Vector3 ( 2.0f , 2.0f , 2.0f ) ;
public float fresnelScale = 0.40f ;
public float fresnelOffset = 0.50f ;
public float refractScaleAbove = 0.03f ;
public float refractScaleBelow = 0.20f ;
public float blurMultiplier = 0.040f ;
public Vector2 bigWaveDirection = new Vector2 ( 1.05f , - 0.42f ) ;
public Vector2 littleWaveDirection = new Vector2 ( 1.11f , - 1.16f ) ;
public UUID normalMapTexture = new UUID ( "822ded49-9a6c-f61c-cb89-6df54f42cdf4" ) ;
public Vector4 horizon = new Vector4 ( 0.25f , 0.25f , 0.32f , 0.32f ) ;
public float hazeHorizon = 0.19f ;
public Vector4 blueDensity = new Vector4 ( 0.12f , 0.22f , 0.38f , 0.38f ) ;
public float hazeDensity = 0.70f ;
public float densityMultiplier = 0.18f ;
public float distanceMultiplier = 0.8f ;
public UInt16 maxAltitude = 1605 ;
public Vector4 sunMoonColor = new Vector4 ( 0.24f , 0.26f , 0.30f , 0.30f ) ;
public float sunMoonPosition = 0.317f ;
public Vector4 ambient = new Vector4 ( 0.35f , 0.35f , 0.35f , 0.35f ) ;
public float eastAngle = 0.0f ;
public float sunGlowFocus = 0.10f ;
public float sunGlowSize = 1.75f ;
public float sceneGamma = 1.0f ;
public float starBrightness = 0.0f ;
public Vector4 cloudColor = new Vector4 ( 0.41f , 0.41f , 0.41f , 0.41f ) ;
public Vector3 cloudXYDensity = new Vector3 ( 1.00f , 0.53f , 1.00f ) ;
public float cloudCoverage = 0.27f ;
public float cloudScale = 0.42f ;
public Vector3 cloudDetailXYDensity = new Vector3 ( 1.00f , 0.53f , 0.12f ) ;
public float cloudScrollX = 0.20f ;
public bool cloudScrollXLock = false ;
public float cloudScrollY = 0.01f ;
public bool cloudScrollYLock = false ;
public bool drawClassicClouds = true ;
public delegate void SaveDelegate ( RegionLightShareData wl ) ;
public event SaveDelegate OnSave ;
public void Save ( )
{
if ( OnSave ! = null )
OnSave ( this ) ;
2010-04-01 04:30:44 +00:00
}
public object Clone ( )
{
return this . MemberwiseClone ( ) ; // call clone method
}
2010-03-31 03:20:20 +00:00
}
2009-12-12 05:14:01 +00:00
public class RegionInfo
2007-10-31 01:21:04 +00:00
{
2010-06-25 17:29:02 +00:00
private static readonly ILog m_log = LogManager . GetLogger ( MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
2013-11-01 23:06:19 +00:00
private static readonly string LogHeader = "[REGION INFO]" ;
2007-10-31 01:21:04 +00:00
2015-09-02 18:54:53 +00:00
2008-04-29 14:04:55 +00:00
public bool commFailTF = false ;
public ConfigurationMember configMember ;
2008-01-15 02:09:55 +00:00
public string DataStore = String . Empty ;
2015-09-02 18:54:53 +00:00
2008-09-18 15:44:05 +00:00
public string RegionFile = String . Empty ;
2007-10-31 01:21:04 +00:00
public bool isSandbox = false ;
2009-07-03 15:36:47 +00:00
public bool Persistent = true ;
2008-04-29 14:04:55 +00:00
private EstateSettings m_estateSettings ;
2008-06-30 14:09:19 +00:00
private RegionSettings m_regionSettings ;
2009-06-25 15:48:54 +00:00
// private IConfigSource m_configSource = null;
2007-10-31 01:21:04 +00:00
2008-09-06 07:52:41 +00:00
public UUID originRegionID = UUID . Zero ;
2008-04-29 14:04:55 +00:00
public string proxyUrl = "" ;
2009-03-02 16:33:11 +00:00
public int ProxyOffset = 0 ;
2008-09-06 07:52:41 +00:00
public string regionSecret = UUID . Random ( ) . ToString ( ) ;
2010-09-12 17:43:49 +00:00
2009-05-02 16:28:30 +00:00
public string osSecret ;
2007-10-31 01:21:04 +00:00
2008-09-06 07:52:41 +00:00
public UUID lastMapUUID = UUID . Zero ;
2008-06-14 02:39:27 +00:00
public string lastMapRefresh = "0" ;
2012-08-06 14:35:40 +00:00
private float m_nonphysPrimMin = 0 ;
2009-01-02 17:41:12 +00:00
private int m_nonphysPrimMax = 0 ;
2012-08-06 14:35:40 +00:00
private float m_physPrimMin = 0 ;
2009-01-02 17:41:12 +00:00
private int m_physPrimMax = 0 ;
private bool m_clampPrimSize = false ;
private int m_objectCapacity = 0 ;
2014-04-11 01:08:54 +00:00
private int m_maxPrimsPerUser = - 1 ;
2012-09-08 12:48:07 +00:00
private int m_linksetCapacity = 0 ;
2009-10-17 13:33:46 +00:00
private string m_regionType = String . Empty ;
2010-03-31 03:20:20 +00:00
private RegionLightShareData m_windlight = new RegionLightShareData ( ) ;
2009-12-12 05:14:01 +00:00
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 ;
public UUID RegionID = UUID . Zero ;
public string RemotingAddress ;
public UUID ScopeID = UUID . Zero ;
2013-01-30 21:43:35 +00:00
private UUID m_maptileStaticUUID = UUID . Zero ;
2009-01-02 17:41:12 +00:00
2013-12-14 15:53:01 +00:00
public uint WorldLocX = 0 ;
public uint WorldLocY = 0 ;
public uint WorldLocZ = 0 ;
2014-05-30 18:38:10 +00:00
/// <summary>
/// X dimension of the region.
/// </summary>
/// <remarks>
/// If this is a varregion then the default size set here will be replaced when we load the region config.
/// </remarks>
2013-09-23 17:38:38 +00:00
public uint RegionSizeX = Constants . RegionSize ;
2014-05-30 18:38:10 +00:00
/// <summary>
/// X dimension of the region.
/// </summary>
/// <remarks>
/// If this is a varregion then the default size set here will be replaced when we load the region config.
/// </remarks>
2013-09-23 17:38:38 +00:00
public uint RegionSizeY = Constants . RegionSize ;
2014-05-30 18:38:10 +00:00
/// <summary>
/// Z dimension of the region.
/// </summary>
/// <remarks>
/// XXX: Unknown if this accounts for regions with negative Z.
/// </remarks>
2013-09-19 21:12:52 +00:00
public uint RegionSizeZ = Constants . RegionHeight ;
2014-04-12 16:32:16 +00:00
private Dictionary < String , String > m_extraSettings = new Dictionary < string , string > ( ) ;
2011-12-12 08:21:19 +00:00
2007-10-31 01:21:04 +00:00
// Apparently, we're applying the same estatesettings regardless of whether it's local or remote.
2007-12-07 02:00:35 +00:00
2008-09-30 10:50:41 +00:00
// MT: Yes. Estates can't span trust boundaries. Therefore, it can be
// assumed that all instances belonging to one estate are able to
// access the same database server. Since estate settings are lodaed
// from there, that should be sufficient for full remote administration
2009-06-25 15:48:54 +00:00
// File based loading
/ /
public RegionInfo ( string description , string filename , bool skipConsoleConfig , IConfigSource configSource ) : this ( description , filename , skipConsoleConfig , configSource , String . Empty )
2007-10-31 01:21:04 +00:00
{
2009-06-25 15:48:54 +00:00
}
public RegionInfo ( string description , string filename , bool skipConsoleConfig , IConfigSource configSource , string configName )
{
// m_configSource = configSource;
if ( filename . ToLower ( ) . EndsWith ( ".ini" ) )
{
2009-06-25 17:53:03 +00:00
if ( ! File . Exists ( filename ) ) // New region config request
{
IniConfigSource newFile = new IniConfigSource ( ) ;
2010-08-14 10:46:17 +00:00
ReadNiniConfig ( newFile , configName ) ;
2009-06-25 17:53:03 +00:00
newFile . Save ( filename ) ;
2009-06-26 00:00:20 +00:00
RegionFile = filename ;
2009-06-25 17:53:03 +00:00
return ;
}
2009-06-25 23:31:55 +00:00
IniConfigSource source = new IniConfigSource ( filename ) ;
bool saveFile = false ;
if ( source . Configs [ configName ] = = null )
saveFile = true ;
2009-06-25 15:48:54 +00:00
ReadNiniConfig ( source , configName ) ;
2009-06-25 23:31:55 +00:00
if ( configName ! = String . Empty & & saveFile )
source . Save ( filename ) ;
2009-06-26 00:00:20 +00:00
RegionFile = filename ;
2009-06-25 15:48:54 +00:00
return ;
}
try
{
// This will throw if it's not legal Nini XML format
/ /
IConfigSource xmlsource = new XmlConfigSource ( filename ) ;
ReadNiniConfig ( xmlsource , configName ) ;
2009-06-26 00:00:20 +00:00
RegionFile = filename ;
2009-06-25 15:48:54 +00:00
return ;
}
catch ( Exception )
{
}
2007-11-03 15:09:21 +00:00
}
2007-12-27 21:41:48 +00:00
2009-06-25 15:48:54 +00:00
// The web loader uses this
/ /
2009-01-02 17:41:12 +00:00
public RegionInfo ( string description , XmlNode xmlNode , bool skipConsoleConfig , IConfigSource configSource )
2007-11-03 15:09:21 +00:00
{
2014-04-12 15:58:07 +00:00
XmlElement elem = ( XmlElement ) xmlNode ;
string name = elem . GetAttribute ( "Name" ) ;
string xmlstr = "<Nini>" + xmlNode . OuterXml + "</Nini>" ;
XmlConfigSource source = new XmlConfigSource ( XmlReader . Create ( new StringReader ( xmlstr ) ) ) ;
ReadNiniConfig ( source , name ) ;
2010-10-11 20:53:00 +00:00
m_serverURI = string . Empty ;
2007-10-31 01:21:04 +00:00
}
2007-12-27 21:41:48 +00:00
2013-09-19 19:14:21 +00:00
public RegionInfo ( uint legacyRegionLocX , uint legacyRegionLocY , IPEndPoint internalEndPoint , string externalUri )
2007-10-31 01:21:04 +00:00
{
2014-01-03 15:41:06 +00:00
RegionLocX = legacyRegionLocX ;
RegionLocY = legacyRegionLocY ;
RegionSizeX = Constants . RegionSize ;
RegionSizeY = Constants . RegionSize ;
2009-12-12 05:14:01 +00:00
m_internalEndPoint = internalEndPoint ;
m_externalHostName = externalUri ;
2010-10-11 20:53:00 +00:00
m_serverURI = string . Empty ;
2007-11-28 06:18:07 +00:00
}
2007-12-27 21:41:48 +00:00
2009-12-12 05:14:01 +00:00
public RegionInfo ( )
2007-12-10 19:16:50 +00:00
{
2010-10-11 20:53:00 +00:00
m_serverURI = string . Empty ;
2007-12-10 19:16:50 +00:00
}
2008-04-29 14:04:55 +00:00
public EstateSettings EstateSettings
{
get
{
if ( m_estateSettings = = null )
{
m_estateSettings = new EstateSettings ( ) ;
}
return m_estateSettings ;
}
2008-07-18 02:40:47 +00:00
set { m_estateSettings = value ; }
2008-04-29 14:04:55 +00:00
}
2008-06-30 14:09:19 +00:00
public RegionSettings RegionSettings
{
get
{
2008-07-06 14:02:22 +00:00
if ( m_regionSettings = = null )
2008-06-30 14:09:19 +00:00
{
m_regionSettings = new RegionSettings ( ) ;
}
return m_regionSettings ;
}
set { m_regionSettings = value ; }
}
2010-03-31 03:20:20 +00:00
public RegionLightShareData WindlightSettings
{
get
{
if ( m_windlight = = null )
{
m_windlight = new RegionLightShareData ( ) ;
}
return m_windlight ;
}
set { m_windlight = value ; }
}
2012-08-06 14:35:40 +00:00
public float NonphysPrimMin
{
get { return m_nonphysPrimMin ; }
}
2009-01-02 17:41:12 +00:00
public int NonphysPrimMax
{
get { return m_nonphysPrimMax ; }
}
2012-08-06 14:35:40 +00:00
public float PhysPrimMin
{
get { return m_physPrimMin ; }
}
2009-01-02 17:41:12 +00:00
public int PhysPrimMax
{
get { return m_physPrimMax ; }
}
public bool ClampPrimSize
{
get { return m_clampPrimSize ; }
}
public int ObjectCapacity
{
get { return m_objectCapacity ; }
}
2014-04-11 01:08:54 +00:00
public int MaxPrimsPerUser
{
get { return m_maxPrimsPerUser ; }
}
2012-09-08 12:48:07 +00:00
public int LinksetCapacity
{
get { return m_linksetCapacity ; }
}
2014-10-31 21:44:31 +00:00
public int AgentCapacity { get ; set ; }
2011-04-15 13:17:26 +00:00
2009-05-12 03:30:37 +00:00
public byte AccessLevel
{
2009-05-13 22:16:14 +00:00
get { return ( byte ) Util . ConvertMaturityToAccessLevel ( ( uint ) RegionSettings . Maturity ) ; }
2009-05-12 03:30:37 +00:00
}
2009-10-17 13:33:46 +00:00
public string RegionType
2009-10-17 12:36:03 +00:00
{
2009-10-17 13:33:46 +00:00
get { return m_regionType ; }
2009-10-17 12:36:03 +00:00
}
2013-01-30 21:43:35 +00:00
public UUID MaptileStaticUUID
{
get { return m_maptileStaticUUID ; }
}
2014-03-17 20:39:36 +00:00
2014-03-26 20:58:58 +00:00
public string MaptileStaticFile { get ; private set ; }
2013-01-30 21:43:35 +00:00
2009-12-12 05:14:01 +00:00
/// <summary>
/// The port by which http communication occurs with the region (most noticeably, CAPS communication)
/// </summary>
public uint HttpPort
{
get { return m_httpPort ; }
set { m_httpPort = value ; }
}
/// <summary>
/// A well-formed URI for the host region server (namely "http://" + ExternalHostName)
/// </summary>
2010-10-11 20:53:00 +00:00
2009-12-12 05:14:01 +00:00
public string ServerURI
{
2010-10-11 20:53:00 +00:00
get {
if ( m_serverURI ! = string . Empty ) {
return m_serverURI ;
} else {
return "http://" + m_externalHostName + ":" + m_httpPort + "/" ;
}
}
set {
if ( value . EndsWith ( "/" ) ) {
m_serverURI = value ;
} else {
m_serverURI = value + '/' ;
}
}
2009-12-12 05:14:01 +00:00
}
public string RegionName
{
get { return m_regionName ; }
set { m_regionName = value ; }
}
public uint RemotingPort
{
get { return m_remotingPort ; }
set { m_remotingPort = value ; }
}
/// <value>
/// This accessor can throw all the exceptions that Dns.GetHostAddresses can throw.
///
/// XXX Isn't this really doing too much to be a simple getter, rather than an explict method?
/// </value>
public IPEndPoint ExternalEndPoint
{
get
{
// Old one defaults to IPv6
//return new IPEndPoint(Dns.GetHostAddresses(m_externalHostName)[0], m_internalEndPoint.Port);
IPAddress ia = null ;
// If it is already an IP, don't resolve it - just return directly
if ( IPAddress . TryParse ( m_externalHostName , out ia ) )
return new IPEndPoint ( ia , m_internalEndPoint . Port ) ;
// Reset for next check
ia = null ;
try
{
foreach ( IPAddress Adr in Dns . GetHostAddresses ( m_externalHostName ) )
{
if ( ia = = null )
ia = Adr ;
if ( Adr . AddressFamily = = AddressFamily . InterNetwork )
{
ia = Adr ;
break ;
}
}
}
catch ( SocketException e )
{
throw new Exception (
"Unable to resolve local hostname " + m_externalHostName + " innerException of type '" +
e + "' attached to this exception" , e ) ;
}
return new IPEndPoint ( ia , m_internalEndPoint . Port ) ;
}
set { m_externalHostName = value . ToString ( ) ; }
}
public string ExternalHostName
{
get { return m_externalHostName ; }
set { m_externalHostName = value ; }
}
public IPEndPoint InternalEndPoint
{
get { return m_internalEndPoint ; }
set { m_internalEndPoint = value ; }
}
2012-03-24 02:16:44 +00:00
/// <summary>
/// The x co-ordinate of this region in map tiles (e.g. 1000).
2013-09-19 19:14:21 +00:00
/// Coordinate is scaled as world coordinates divided by the legacy region size
/// and is thus is the number of legacy regions.
/// </summary>
2009-12-12 05:14:01 +00:00
public uint RegionLocX
{
2013-12-14 15:53:01 +00:00
get { return WorldLocX / Constants . RegionSize ; }
set { WorldLocX = value * Constants . RegionSize ; }
2009-12-12 05:14:01 +00:00
}
2012-03-24 02:16:44 +00:00
/// <summary>
/// The y co-ordinate of this region in map tiles (e.g. 1000).
2013-09-19 19:14:21 +00:00
/// Coordinate is scaled as world coordinates divided by the legacy region size
/// and is thus is the number of legacy regions.
2012-03-24 02:16:44 +00:00
/// </summary>
2009-12-12 05:14:01 +00:00
public uint RegionLocY
{
2013-12-14 15:53:01 +00:00
get { return WorldLocY / Constants . RegionSize ; }
set { WorldLocY = value * Constants . RegionSize ; }
2009-12-12 05:14:01 +00:00
}
2013-09-26 00:21:20 +00:00
public void SetDefaultRegionSize ( )
{
2013-12-14 15:53:01 +00:00
WorldLocX = 0 ;
WorldLocY = 0 ;
WorldLocZ = 0 ;
2013-09-26 00:21:20 +00:00
RegionSizeX = Constants . RegionSize ;
RegionSizeY = Constants . RegionSize ;
RegionSizeZ = Constants . RegionHeight ;
}
2013-09-19 19:14:21 +00:00
// A unique region handle is created from the region's world coordinates.
// This cannot be changed because some code expects to receive the region handle and then
// compute the region coordinates from it.
2009-12-12 05:14:01 +00:00
public ulong RegionHandle
{
2013-12-14 15:53:01 +00:00
get { return Util . UIntsToLong ( WorldLocX , WorldLocY ) ; }
2009-12-12 05:14:01 +00:00
}
2008-03-30 08:01:47 +00:00
public void SetEndPoint ( string ipaddr , int port )
{
IPAddress tmpIP = IPAddress . Parse ( ipaddr ) ;
2008-04-29 14:04:55 +00:00
IPEndPoint tmpEPE = new IPEndPoint ( tmpIP , port ) ;
2008-03-30 08:01:47 +00:00
m_internalEndPoint = tmpEPE ;
}
2007-12-27 21:41:48 +00:00
2014-04-12 16:32:16 +00:00
public string GetSetting ( string key )
2011-12-12 08:21:19 +00:00
{
2012-02-03 01:39:05 +00:00
string val ;
string keylower = key . ToLower ( ) ;
2014-04-12 16:32:16 +00:00
if ( m_extraSettings . TryGetValue ( keylower , out val ) )
2012-02-03 01:39:05 +00:00
return val ;
m_log . DebugFormat ( "[RegionInfo] Could not locate value for parameter {0}" , key ) ;
2012-01-19 10:52:05 +00:00
return null ;
2011-12-12 08:21:19 +00:00
}
2015-03-23 04:53:02 +00:00
public void SetExtraSetting ( string key , string value )
2012-02-03 01:39:05 +00:00
{
2012-01-19 10:52:05 +00:00
string keylower = key . ToLower ( ) ;
2014-04-12 16:32:16 +00:00
m_extraSettings [ keylower ] = value ;
2011-12-12 08:21:19 +00:00
}
2009-06-25 15:48:54 +00:00
private void ReadNiniConfig ( IConfigSource source , string name )
2007-10-31 01:21:04 +00:00
{
2010-03-03 23:03:41 +00:00
// bool creatingNew = false;
2009-06-25 17:53:03 +00:00
if ( source . Configs . Count = = 0 )
{
2009-08-10 09:06:09 +00:00
MainConsole . Instance . Output ( "=====================================\n" ) ;
MainConsole . Instance . Output ( "We are now going to ask a couple of questions about your region.\n" ) ;
MainConsole . Instance . Output ( "You can press 'enter' without typing anything to use the default\n" ) ;
MainConsole . Instance . Output ( "the default is displayed between [ ] brackets.\n" ) ;
MainConsole . Instance . Output ( "=====================================\n" ) ;
2009-06-25 23:31:55 +00:00
if ( name = = String . Empty )
2012-07-27 21:15:25 +00:00
{
while ( name . Trim ( ) = = string . Empty )
{
name = MainConsole . Instance . CmdPrompt ( "New region name" , name ) ;
if ( name . Trim ( ) = = string . Empty )
{
MainConsole . Instance . Output ( "Cannot interactively create region with no name" ) ;
}
}
}
2009-06-25 17:53:03 +00:00
2009-07-15 20:49:58 +00:00
source . AddConfig ( name ) ;
2009-06-25 17:53:03 +00:00
2010-03-03 23:03:41 +00:00
// creatingNew = true;
2009-06-25 17:53:03 +00:00
}
2009-06-25 15:48:54 +00:00
if ( name = = String . Empty )
name = source . Configs [ 0 ] . Name ;
2007-10-31 01:21:04 +00:00
2009-06-25 15:48:54 +00:00
if ( source . Configs [ name ] = = null )
2009-06-25 17:53:03 +00:00
{
2009-07-15 20:49:58 +00:00
source . AddConfig ( name ) ;
2009-06-25 17:53:03 +00:00
}
2007-10-31 01:21:04 +00:00
2011-12-12 08:21:19 +00:00
RegionName = name ;
2009-06-25 15:48:54 +00:00
IConfig config = source . Configs [ name ] ;
2007-10-31 01:21:04 +00:00
2011-12-12 08:21:19 +00:00
// Track all of the keys in this config and remove as they are processed
// The remaining keys will be added to generic key-value storage for
// whoever might need it
HashSet < String > allKeys = new HashSet < String > ( ) ;
foreach ( string s in config . GetKeys ( ) )
{
2012-01-19 10:52:05 +00:00
allKeys . Add ( s ) ;
2011-12-12 08:21:19 +00:00
}
// RegionUUID
2009-06-25 15:48:54 +00:00
/ /
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "RegionUUID" ) ;
2009-06-25 15:48:54 +00:00
string regionUUID = config . GetString ( "RegionUUID" , string . Empty ) ;
2012-07-27 21:15:25 +00:00
if ( ! UUID . TryParse ( regionUUID . Trim ( ) , out RegionID ) )
2009-06-25 17:53:03 +00:00
{
UUID newID = UUID . Random ( ) ;
2012-07-27 21:15:25 +00:00
while ( RegionID = = UUID . Zero )
{
regionUUID = MainConsole . Instance . CmdPrompt ( "RegionUUID" , newID . ToString ( ) ) ;
if ( ! UUID . TryParse ( regionUUID . Trim ( ) , out RegionID ) )
{
MainConsole . Instance . Output ( "RegionUUID must be a valid UUID" ) ;
}
}
2009-06-25 17:53:03 +00:00
config . Set ( "RegionUUID" , regionUUID ) ;
}
2009-06-25 15:48:54 +00:00
2011-12-12 08:21:19 +00:00
originRegionID = RegionID ; // What IS this?! (Needed for RegionCombinerModule?)
2010-09-12 17:43:49 +00:00
2011-12-12 08:21:19 +00:00
// Location
/ /
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "Location" ) ;
2009-06-25 15:48:54 +00:00
string location = config . GetString ( "Location" , String . Empty ) ;
if ( location = = String . Empty )
2009-06-25 17:53:03 +00:00
{
location = MainConsole . Instance . CmdPrompt ( "Region Location" , "1000,1000" ) ;
config . Set ( "Location" , location ) ;
}
2009-06-25 15:48:54 +00:00
string [ ] locationElements = location . Split ( new char [ ] { ',' } ) ;
2013-12-14 15:53:01 +00:00
RegionLocX = Convert . ToUInt32 ( locationElements [ 0 ] ) ;
RegionLocY = Convert . ToUInt32 ( locationElements [ 1 ] ) ;
2009-06-25 15:48:54 +00:00
2013-09-19 21:12:52 +00:00
// Region size
// Default to legacy region size if not specified.
allKeys . Remove ( "SizeX" ) ;
2013-09-23 17:38:38 +00:00
string configSizeX = config . GetString ( "SizeX" , Constants . RegionSize . ToString ( ) ) ;
2013-09-19 21:12:52 +00:00
config . Set ( "SizeX" , configSizeX ) ;
RegionSizeX = Convert . ToUInt32 ( configSizeX ) ;
allKeys . Remove ( "SizeY" ) ;
2013-09-23 17:38:38 +00:00
string configSizeY = config . GetString ( "SizeY" , Constants . RegionSize . ToString ( ) ) ;
2013-09-19 21:12:52 +00:00
config . Set ( "SizeY" , configSizeX ) ;
RegionSizeY = Convert . ToUInt32 ( configSizeY ) ;
allKeys . Remove ( "SizeZ" ) ;
string configSizeZ = config . GetString ( "SizeZ" , Constants . RegionHeight . ToString ( ) ) ;
config . Set ( "SizeZ" , configSizeX ) ;
RegionSizeZ = Convert . ToUInt32 ( configSizeZ ) ;
2013-11-01 23:06:19 +00:00
DoRegionSizeSanityChecks ( ) ;
2011-12-12 08:21:19 +00:00
// InternalAddress
/ /
2009-06-25 17:53:03 +00:00
IPAddress address ;
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "InternalAddress" ) ;
2009-06-25 17:53:03 +00:00
if ( config . Contains ( "InternalAddress" ) )
{
address = IPAddress . Parse ( config . GetString ( "InternalAddress" , String . Empty ) ) ;
}
else
{
2009-08-08 00:42:50 +00:00
address = IPAddress . Parse ( MainConsole . Instance . CmdPrompt ( "Internal IP address" , "0.0.0.0" ) ) ;
2009-06-25 17:53:03 +00:00
config . Set ( "InternalAddress" , address . ToString ( ) ) ;
}
2011-12-12 08:21:19 +00:00
// InternalPort
/ /
2009-06-25 17:53:03 +00:00
int port ;
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "InternalPort" ) ;
2009-06-25 17:53:03 +00:00
if ( config . Contains ( "InternalPort" ) )
{
port = config . GetInt ( "InternalPort" , 9000 ) ;
}
else
{
port = Convert . ToInt32 ( MainConsole . Instance . CmdPrompt ( "Internal port" , "9000" ) ) ;
config . Set ( "InternalPort" , port ) ;
}
2009-06-25 15:48:54 +00:00
m_internalEndPoint = new IPEndPoint ( address , port ) ;
2011-12-12 08:21:19 +00:00
// AllowAlternatePorts
/ /
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "AllowAlternatePorts" ) ;
2009-06-25 17:53:03 +00:00
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 ( ) ) ;
}
2009-06-25 15:48:54 +00:00
2011-12-12 08:21:19 +00:00
// ExternalHostName
2009-06-25 15:48:54 +00:00
/ /
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "ExternalHostName" ) ;
2009-06-25 17:53:03 +00:00
string externalName ;
if ( config . Contains ( "ExternalHostName" ) )
{
externalName = config . GetString ( "ExternalHostName" , "SYSTEMIP" ) ;
}
else
{
externalName = MainConsole . Instance . CmdPrompt ( "External host name" , "SYSTEMIP" ) ;
config . Set ( "ExternalHostName" , externalName ) ;
}
2009-06-25 15:48:54 +00:00
if ( externalName = = "SYSTEMIP" )
2010-06-25 17:29:02 +00:00
{
2007-12-27 21:41:48 +00:00
m_externalHostName = Util . GetLocalHost ( ) . ToString ( ) ;
2010-06-25 17:29:02 +00:00
m_log . InfoFormat (
2010-09-12 17:43:49 +00:00
"[REGIONINFO]: Resolving SYSTEMIP to {0} for external hostname of region {1}" ,
2010-06-25 17:29:02 +00:00
m_externalHostName , name ) ;
}
2009-06-25 15:48:54 +00:00
else
2010-06-25 17:29:02 +00:00
{
2009-06-25 15:48:54 +00:00
m_externalHostName = externalName ;
2010-06-25 17:29:02 +00:00
}
2007-10-31 01:21:04 +00:00
2011-12-12 08:21:19 +00:00
// RegionType
2009-10-17 13:33:46 +00:00
m_regionType = config . GetString ( "RegionType" , String . Empty ) ;
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "RegionType" ) ;
2009-06-25 15:48:54 +00:00
2013-01-30 21:43:35 +00:00
#region Prim and map stuff
2012-08-06 14:35:40 +00:00
2012-09-18 13:47:15 +00:00
m_nonphysPrimMin = config . GetFloat ( "NonPhysicalPrimMin" , 0 ) ;
allKeys . Remove ( "NonPhysicalPrimMin" ) ;
2012-08-06 14:35:40 +00:00
2012-09-18 13:47:15 +00:00
m_nonphysPrimMax = config . GetInt ( "NonPhysicalPrimMax" , 0 ) ;
allKeys . Remove ( "NonPhysicalPrimMax" ) ;
2012-08-06 14:35:40 +00:00
m_physPrimMin = config . GetFloat ( "PhysicalPrimMin" , 0 ) ;
allKeys . Remove ( "PhysicalPrimMin" ) ;
2012-02-05 02:52:55 +00:00
m_physPrimMax = config . GetInt ( "PhysicalPrimMax" , 0 ) ;
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "PhysicalPrimMax" ) ;
2012-08-06 14:35:40 +00:00
2009-06-25 15:48:54 +00:00
m_clampPrimSize = config . GetBoolean ( "ClampPrimSize" , false ) ;
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "ClampPrimSize" ) ;
2012-08-06 14:35:40 +00:00
2009-06-25 15:48:54 +00:00
m_objectCapacity = config . GetInt ( "MaxPrims" , 15000 ) ;
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "MaxPrims" ) ;
2012-09-08 12:48:07 +00:00
2014-04-11 01:08:54 +00:00
m_maxPrimsPerUser = config . GetInt ( "MaxPrimsPerUser" , - 1 ) ;
allKeys . Remove ( "MaxPrimsPerUser" ) ;
2012-09-08 12:48:07 +00:00
m_linksetCapacity = config . GetInt ( "LinksetPrims" , 0 ) ;
allKeys . Remove ( "LinksetPrims" ) ;
2013-01-30 21:43:35 +00:00
allKeys . Remove ( "MaptileStaticUUID" ) ;
string mapTileStaticUUID = config . GetString ( "MaptileStaticUUID" , UUID . Zero . ToString ( ) ) ;
if ( UUID . TryParse ( mapTileStaticUUID . Trim ( ) , out m_maptileStaticUUID ) )
{
config . Set ( "MaptileStaticUUID" , m_maptileStaticUUID . ToString ( ) ) ;
}
2014-03-17 20:39:36 +00:00
2014-03-26 20:58:58 +00:00
MaptileStaticFile = config . GetString ( "MaptileStaticFile" , String . Empty ) ;
2014-03-17 20:39:36 +00:00
allKeys . Remove ( "MaptileStaticFile" ) ;
2012-08-06 14:35:40 +00:00
# endregion
2014-10-31 21:44:31 +00:00
AgentCapacity = config . GetInt ( "MaxAgents" , 100 ) ;
2012-01-19 10:52:05 +00:00
allKeys . Remove ( "MaxAgents" ) ;
2009-06-25 15:48:54 +00:00
// Multi-tenancy
/ /
ScopeID = new UUID ( config . GetString ( "ScopeID" , UUID . Zero . ToString ( ) ) ) ;
2012-02-03 01:39:05 +00:00
allKeys . Remove ( "ScopeID" ) ;
2011-12-12 08:21:19 +00:00
foreach ( String s in allKeys )
{
2014-04-12 16:32:16 +00:00
SetExtraSetting ( s , config . GetString ( s ) ) ;
2011-12-12 08:21:19 +00:00
}
2007-10-31 01:21:04 +00:00
}
2013-11-01 23:06:19 +00:00
// Make sure user specified region sizes are sane.
// Must be multiples of legacy region size (256).
private void DoRegionSizeSanityChecks ( )
{
if ( RegionSizeX ! = Constants . RegionSize | | RegionSizeY ! = Constants . RegionSize )
{
// Doing non-legacy region sizes.
// Enforce region size to be multiples of the legacy region size (256)
uint partial = RegionSizeX % Constants . RegionSize ;
if ( partial ! = 0 )
{
RegionSizeX - = partial ;
if ( RegionSizeX = = 0 )
RegionSizeX = Constants . RegionSize ;
2013-11-02 22:36:16 +00:00
m_log . ErrorFormat ( "{0} Region size must be multiple of {1}. Enforcing {2}.RegionSizeX={3} instead of specified {4}" ,
2013-11-01 23:06:19 +00:00
LogHeader , Constants . RegionSize , m_regionName , RegionSizeX , RegionSizeX + partial ) ;
}
partial = RegionSizeY % Constants . RegionSize ;
if ( partial ! = 0 )
{
RegionSizeY - = partial ;
if ( RegionSizeY = = 0 )
RegionSizeY = Constants . RegionSize ;
2013-11-02 22:36:16 +00:00
m_log . ErrorFormat ( "{0} Region size must be multiple of {1}. Enforcing {2}.RegionSizeY={3} instead of specified {4}" ,
2013-11-01 23:06:19 +00:00
LogHeader , Constants . RegionSize , m_regionName , RegionSizeY , RegionSizeY + partial ) ;
}
2013-11-02 22:36:16 +00:00
// Because of things in the viewer, regions MUST be square.
// Remove this check when viewers have been updated.
if ( RegionSizeX ! = RegionSizeY )
{
uint minSize = Math . Min ( RegionSizeX , RegionSizeY ) ;
RegionSizeX = minSize ;
RegionSizeY = minSize ;
m_log . ErrorFormat ( "{0} Regions must be square until viewers are updated. Forcing region {1} size to <{2},{3}>" ,
2013-11-30 23:28:39 +00:00
LogHeader , m_regionName , RegionSizeX , RegionSizeY ) ;
}
// There is a practical limit to region size.
if ( RegionSizeX > Constants . MaximumRegionSize | | RegionSizeY > Constants . MaximumRegionSize )
{
RegionSizeX = Util . Clamp < uint > ( RegionSizeX , Constants . RegionSize , Constants . MaximumRegionSize ) ;
RegionSizeY = Util . Clamp < uint > ( RegionSizeY , Constants . RegionSize , Constants . MaximumRegionSize ) ;
m_log . ErrorFormat ( "{0} Region dimensions must be less than {1}. Clamping {2}'s size to <{3},{4}>" ,
LogHeader , Constants . MaximumRegionSize , m_regionName , RegionSizeX , RegionSizeY ) ;
2013-11-02 22:36:16 +00:00
}
m_log . InfoFormat ( "{0} Region {1} size set to <{2},{3}>" , LogHeader , m_regionName , RegionSizeX , RegionSizeY ) ;
2013-11-01 23:06:19 +00:00
}
}
2009-06-26 11:32:36 +00:00
private void WriteNiniConfig ( IConfigSource source )
{
IConfig config = source . Configs [ RegionName ] ;
if ( config ! = null )
2010-09-03 21:38:40 +00:00
source . Configs . Remove ( config ) ;
2009-06-26 11:32:36 +00:00
config = source . AddConfig ( RegionName ) ;
config . Set ( "RegionUUID" , RegionID . ToString ( ) ) ;
2013-12-14 15:53:01 +00:00
string location = String . Format ( "{0},{1}" , RegionLocX , RegionLocY ) ;
2009-06-26 11:32:36 +00:00
config . Set ( "Location" , location ) ;
if ( DataStore ! = String . Empty )
config . Set ( "Datastore" , DataStore ) ;
2015-03-28 14:50:04 +00:00
2013-12-28 14:58:15 +00:00
if ( RegionSizeX ! = Constants . RegionSize | | RegionSizeY ! = Constants . RegionSize )
{
2013-09-19 21:12:52 +00:00
config . Set ( "SizeX" , RegionSizeX ) ;
config . Set ( "SizeY" , RegionSizeY ) ;
2015-09-02 18:54:53 +00:00
// if (RegionSizeZ > 0)
// config.Set("SizeZ", RegionSizeZ);
}
2013-09-19 21:12:52 +00:00
2009-06-26 11:32:36 +00:00
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 ) ;
2012-09-08 11:53:30 +00:00
if ( m_nonphysPrimMin > 0 )
2012-08-06 14:35:40 +00:00
config . Set ( "NonphysicalPrimMax" , m_nonphysPrimMin ) ;
2012-09-08 11:53:30 +00:00
if ( m_nonphysPrimMax > 0 )
2009-06-26 11:32:36 +00:00
config . Set ( "NonphysicalPrimMax" , m_nonphysPrimMax ) ;
2012-08-06 14:35:40 +00:00
2012-09-08 11:53:30 +00:00
if ( m_physPrimMin > 0 )
2012-08-06 14:35:40 +00:00
config . Set ( "PhysicalPrimMax" , m_physPrimMin ) ;
2012-09-08 11:53:30 +00:00
if ( m_physPrimMax > 0 )
2009-06-26 11:32:36 +00:00
config . Set ( "PhysicalPrimMax" , m_physPrimMax ) ;
2012-08-06 14:35:40 +00:00
2009-06-26 11:32:36 +00:00
config . Set ( "ClampPrimSize" , m_clampPrimSize . ToString ( ) ) ;
2012-09-08 11:53:30 +00:00
if ( m_objectCapacity > 0 )
2009-06-26 11:32:36 +00:00
config . Set ( "MaxPrims" , m_objectCapacity ) ;
2014-04-11 01:08:54 +00:00
if ( m_maxPrimsPerUser > - 1 )
config . Set ( "MaxPrimsPerUser" , m_maxPrimsPerUser ) ;
2012-09-08 11:53:30 +00:00
if ( m_linksetCapacity > 0 )
2012-09-08 12:48:07 +00:00
config . Set ( "LinksetPrims" , m_linksetCapacity ) ;
2014-10-31 21:44:31 +00:00
if ( AgentCapacity > 0 )
config . Set ( "MaxAgents" , AgentCapacity ) ;
2011-04-15 13:17:26 +00:00
2009-06-26 11:32:36 +00:00
if ( ScopeID ! = UUID . Zero )
config . Set ( "ScopeID" , ScopeID . ToString ( ) ) ;
2009-10-17 12:36:03 +00:00
2009-10-17 13:33:46 +00:00
if ( RegionType ! = String . Empty )
config . Set ( "RegionType" , RegionType ) ;
2013-01-30 21:43:35 +00:00
if ( m_maptileStaticUUID ! = UUID . Zero )
config . Set ( "MaptileStaticUUID" , m_maptileStaticUUID . ToString ( ) ) ;
2014-03-17 20:39:36 +00:00
2015-03-13 23:30:31 +00:00
if ( MaptileStaticFile ! = null & & MaptileStaticFile ! = String . Empty )
2014-03-26 20:58:58 +00:00
config . Set ( "MaptileStaticFile" , MaptileStaticFile ) ;
2009-06-26 11:32:36 +00:00
}
2008-04-29 14:04:55 +00:00
public void SaveRegionToFile ( string description , string filename )
{
2009-06-26 11:32:36 +00:00
if ( filename . ToLower ( ) . EndsWith ( ".ini" ) )
{
IniConfigSource source = new IniConfigSource ( ) ;
try
{
source = new IniConfigSource ( filename ) ; // Load if it exists
}
catch ( Exception )
{
}
WriteNiniConfig ( source ) ;
source . Save ( filename ) ;
return ;
}
2010-09-03 21:38:40 +00:00
else
throw new Exception ( "Invalid file type for region persistence." ) ;
2008-04-11 15:00:41 +00:00
}
public void loadConfigurationOptionsFromMe ( )
{
2008-09-06 07:52:41 +00:00
configMember . addConfigurationOption ( "sim_UUID" , ConfigurationOption . ConfigurationTypes . TYPE_UUID_NULL_FREE ,
2008-04-11 15:00:41 +00:00
"UUID of Region (Default is recommended, random UUID)" ,
RegionID . ToString ( ) , true ) ;
configMember . addConfigurationOption ( "sim_name" , ConfigurationOption . ConfigurationTypes . TYPE_STRING_NOT_EMPTY ,
"Region Name" , RegionName , true ) ;
2013-12-28 14:58:15 +00:00
2008-04-11 15:00:41 +00:00
configMember . addConfigurationOption ( "sim_location_x" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
2013-12-28 14:58:15 +00:00
"Grid Location (X Axis)" , RegionLocX . ToString ( ) , true ) ;
2008-04-11 15:00:41 +00:00
configMember . addConfigurationOption ( "sim_location_y" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
2013-12-28 14:58:15 +00:00
"Grid Location (Y Axis)" , RegionLocY . ToString ( ) , true ) ;
configMember . addConfigurationOption ( "sim_size_x" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
"Size of region in X dimension" , RegionSizeX . ToString ( ) , true ) ;
configMember . addConfigurationOption ( "sim_size_y" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
"Size of region in Y dimension" , RegionSizeY . ToString ( ) , true ) ;
configMember . addConfigurationOption ( "sim_size_z" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
"Size of region in Z dimension" , RegionSizeZ . ToString ( ) , true ) ;
2009-04-17 05:52:46 +00:00
//m_configMember.addConfigurationOption("datastore", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Filename for local storage", "OpenSim.db", false);
2008-04-11 15:00:41 +00:00
configMember . addConfigurationOption ( "internal_ip_address" ,
ConfigurationOption . ConfigurationTypes . TYPE_IP_ADDRESS ,
2008-04-29 14:04:55 +00:00
"Internal IP Address for incoming UDP client connections" ,
2008-04-11 15:00:41 +00:00
m_internalEndPoint . Address . ToString ( ) ,
true ) ;
configMember . addConfigurationOption ( "internal_ip_port" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
"Internal IP Port for incoming UDP client connections" ,
m_internalEndPoint . Port . ToString ( ) , true ) ;
2008-04-29 14:04:55 +00:00
configMember . addConfigurationOption ( "allow_alternate_ports" ,
2008-04-11 15:00:41 +00:00
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 ) ;
2008-09-06 07:52:41 +00:00
configMember . addConfigurationOption ( "lastmap_uuid" , ConfigurationOption . ConfigurationTypes . TYPE_UUID ,
2008-06-14 02:39:27 +00:00
"Last Map UUID" , lastMapUUID . ToString ( ) , true ) ;
2008-08-18 00:39:10 +00:00
configMember . addConfigurationOption ( "lastmap_refresh" , ConfigurationOption . ConfigurationTypes . TYPE_STRING_NOT_EMPTY ,
2008-06-14 02:39:27 +00:00
"Last Map Refresh" , Util . UnixTimeSinceEpoch ( ) . ToString ( ) , true ) ;
2008-08-18 00:39:10 +00:00
2012-08-06 14:35:40 +00:00
configMember . addConfigurationOption ( "nonphysical_prim_min" , ConfigurationOption . ConfigurationTypes . TYPE_FLOAT ,
"Minimum size for nonphysical prims" , m_nonphysPrimMin . ToString ( ) , true ) ;
2009-01-02 17:41:12 +00:00
configMember . addConfigurationOption ( "nonphysical_prim_max" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
"Maximum size for nonphysical prims" , m_nonphysPrimMax . ToString ( ) , true ) ;
2010-09-12 17:43:49 +00:00
2012-08-06 14:35:40 +00:00
configMember . addConfigurationOption ( "physical_prim_min" , ConfigurationOption . ConfigurationTypes . TYPE_FLOAT ,
"Minimum size for nonphysical prims" , m_physPrimMin . ToString ( ) , true ) ;
2009-01-02 17:41:12 +00:00
configMember . addConfigurationOption ( "physical_prim_max" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
"Maximum size for physical prims" , m_physPrimMax . ToString ( ) , true ) ;
2010-09-12 17:43:49 +00:00
2009-01-02 17:41:12 +00:00
configMember . addConfigurationOption ( "clamp_prim_size" , ConfigurationOption . ConfigurationTypes . TYPE_BOOLEAN ,
"Clamp prims to max size" , m_clampPrimSize . ToString ( ) , true ) ;
2010-09-12 17:43:49 +00:00
2009-01-02 17:41:12 +00:00
configMember . addConfigurationOption ( "object_capacity" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
"Max objects this sim will hold" , m_objectCapacity . ToString ( ) , true ) ;
2010-09-12 17:43:49 +00:00
2012-09-08 12:48:07 +00:00
configMember . addConfigurationOption ( "linkset_capacity" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
"Max prims an object will hold" , m_linksetCapacity . ToString ( ) , true ) ;
2011-04-15 13:17:26 +00:00
configMember . addConfigurationOption ( "agent_capacity" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
2015-09-02 18:54:53 +00:00
"Max avatars this sim will hold" , AgentCapacity . ToString ( ) , true ) ;
2011-04-15 13:17:26 +00:00
2009-06-22 12:18:04 +00:00
configMember . addConfigurationOption ( "scope_id" , ConfigurationOption . ConfigurationTypes . TYPE_UUID ,
"Scope ID for this region" , ScopeID . ToString ( ) , true ) ;
2009-10-17 12:36:03 +00:00
2009-10-17 13:33:46 +00:00
configMember . addConfigurationOption ( "region_type" , ConfigurationOption . ConfigurationTypes . TYPE_STRING ,
2009-10-17 22:55:30 +00:00
"Free form string describing the type of region" , String . Empty , true ) ;
2013-01-30 21:43:35 +00:00
configMember . addConfigurationOption ( "region_static_maptile" , ConfigurationOption . ConfigurationTypes . TYPE_UUID ,
"UUID of a texture to use as the map for this region" , m_maptileStaticUUID . ToString ( ) , true ) ;
2008-04-11 15:00:41 +00:00
}
2007-10-31 01:21:04 +00:00
public void loadConfigurationOptions ( )
{
2008-09-06 07:52:41 +00:00
configMember . addConfigurationOption ( "sim_UUID" , ConfigurationOption . ConfigurationTypes . TYPE_UUID ,
2007-12-27 21:41:48 +00:00
"UUID of Region (Default is recommended, random UUID)" ,
2008-09-06 07:52:41 +00:00
UUID . Random ( ) . ToString ( ) , true ) ;
2007-12-27 21:41:48 +00:00
configMember . addConfigurationOption ( "sim_name" , ConfigurationOption . ConfigurationTypes . TYPE_STRING_NOT_EMPTY ,
"Region Name" , "OpenSim Test" , false ) ;
2013-12-28 14:58:15 +00:00
2007-12-27 21:41:48 +00:00
configMember . addConfigurationOption ( "sim_location_x" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
"Grid Location (X Axis)" , "1000" , false ) ;
configMember . addConfigurationOption ( "sim_location_y" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
"Grid Location (Y Axis)" , "1000" , false ) ;
2013-12-28 14:58:15 +00:00
configMember . addConfigurationOption ( "sim_size_x" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
"Size of region in X dimension" , Constants . RegionSize . ToString ( ) , false ) ;
configMember . addConfigurationOption ( "sim_size_y" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
"Size of region in Y dimension" , Constants . RegionSize . ToString ( ) , false ) ;
configMember . addConfigurationOption ( "sim_size_z" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 ,
"Size of region in Z dimension" , Constants . RegionHeight . ToString ( ) , false ) ;
2009-04-17 05:52:46 +00:00
//m_configMember.addConfigurationOption("datastore", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Filename for local storage", "OpenSim.db", false);
2007-12-27 21:41:48 +00:00
configMember . addConfigurationOption ( "internal_ip_address" ,
ConfigurationOption . ConfigurationTypes . TYPE_IP_ADDRESS ,
"Internal IP Address for incoming UDP client connections" , "0.0.0.0" ,
false ) ;
configMember . addConfigurationOption ( "internal_ip_port" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
"Internal IP Port for incoming UDP client connections" ,
2009-04-17 15:09:37 +00:00
ConfigSettings . DefaultRegionHttpPort . ToString ( ) , false ) ;
2008-02-02 06:34:07 +00:00
configMember . addConfigurationOption ( "allow_alternate_ports" , ConfigurationOption . ConfigurationTypes . TYPE_BOOLEAN ,
"Allow sim to find alternate UDP ports when ports are in use?" ,
2008-02-02 07:35:51 +00:00
"false" , true ) ;
2007-12-27 21:41:48 +00:00
configMember . addConfigurationOption ( "external_host_name" ,
ConfigurationOption . ConfigurationTypes . TYPE_STRING_NOT_EMPTY ,
"External Host Name" , "127.0.0.1" , false ) ;
2008-09-06 07:52:41 +00:00
configMember . addConfigurationOption ( "lastmap_uuid" , ConfigurationOption . ConfigurationTypes . TYPE_UUID ,
2008-06-14 02:39:27 +00:00
"Last Map UUID" , lastMapUUID . ToString ( ) , true ) ;
2008-08-18 00:39:10 +00:00
configMember . addConfigurationOption ( "lastmap_refresh" , ConfigurationOption . ConfigurationTypes . TYPE_STRING_NOT_EMPTY ,
2008-06-14 02:39:27 +00:00
"Last Map Refresh" , Util . UnixTimeSinceEpoch ( ) . ToString ( ) , true ) ;
2010-09-12 17:43:49 +00:00
2009-01-02 17:41:12 +00:00
configMember . addConfigurationOption ( "nonphysical_prim_max" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
"Maximum size for nonphysical prims" , "0" , true ) ;
2010-09-12 17:43:49 +00:00
2009-01-02 17:41:12 +00:00
configMember . addConfigurationOption ( "physical_prim_max" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
"Maximum size for physical prims" , "0" , true ) ;
2010-09-12 17:43:49 +00:00
2009-01-02 17:41:12 +00:00
configMember . addConfigurationOption ( "clamp_prim_size" , ConfigurationOption . ConfigurationTypes . TYPE_BOOLEAN ,
"Clamp prims to max size" , "false" , true ) ;
2010-09-12 17:43:49 +00:00
2009-01-02 17:41:12 +00:00
configMember . addConfigurationOption ( "object_capacity" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
2011-07-22 11:36:05 +00:00
"Max objects this sim will hold" , "15000" , true ) ;
configMember . addConfigurationOption ( "agent_capacity" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 ,
"Max avatars this sim will hold" , "100" , true ) ;
2009-06-22 12:18:04 +00:00
configMember . addConfigurationOption ( "scope_id" , ConfigurationOption . ConfigurationTypes . TYPE_UUID ,
"Scope ID for this region" , UUID . Zero . ToString ( ) , true ) ;
2009-10-17 12:36:03 +00:00
2009-10-17 13:33:46 +00:00
configMember . addConfigurationOption ( "region_type" , ConfigurationOption . ConfigurationTypes . TYPE_STRING ,
"Region Type" , String . Empty , true ) ;
2013-01-30 21:43:35 +00:00
configMember . addConfigurationOption ( "region_static_maptile" , ConfigurationOption . ConfigurationTypes . TYPE_UUID ,
"UUID of a texture to use as the map for this region" , String . Empty , true ) ;
2007-11-03 17:49:45 +00:00
}
2007-10-31 01:21:04 +00:00
public bool handleIncomingConfiguration ( string configuration_key , object configuration_result )
{
switch ( configuration_key )
{
case "sim_UUID" :
2008-09-06 07:52:41 +00:00
RegionID = ( UUID ) configuration_result ;
originRegionID = ( UUID ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "sim_name" :
2007-12-27 21:41:48 +00:00
RegionName = ( string ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "sim_location_x" :
2013-12-28 14:58:15 +00:00
RegionLocX = ( uint ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "sim_location_y" :
2013-12-28 14:58:15 +00:00
RegionLocY = ( uint ) configuration_result ;
break ;
case "sim_size_x" :
RegionSizeX = ( uint ) configuration_result ;
break ;
case "sim_size_y" :
RegionSizeY = ( uint ) configuration_result ;
break ;
case "sim_size_z" :
RegionSizeZ = ( uint ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "datastore" :
2007-12-27 21:41:48 +00:00
DataStore = ( string ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "internal_ip_address" :
2007-12-27 21:41:48 +00:00
IPAddress address = ( IPAddress ) configuration_result ;
m_internalEndPoint = new IPEndPoint ( address , 0 ) ;
2007-10-31 01:21:04 +00:00
break ;
case "internal_ip_port" :
2008-04-29 14:04:55 +00:00
m_internalEndPoint . Port = ( int ) configuration_result ;
2008-02-02 06:34:07 +00:00
break ;
case "allow_alternate_ports" :
2008-04-29 14:04:55 +00:00
m_allow_alternate_ports = ( bool ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "external_host_name" :
2007-12-27 21:41:48 +00:00
if ( ( string ) configuration_result ! = "SYSTEMIP" )
2007-10-31 01:21:04 +00:00
{
2007-12-27 21:41:48 +00:00
m_externalHostName = ( string ) configuration_result ;
2007-10-31 01:21:04 +00:00
}
else
{
2007-12-27 21:41:48 +00:00
m_externalHostName = Util . GetLocalHost ( ) . ToString ( ) ;
2007-10-31 01:21:04 +00:00
}
break ;
2008-06-14 02:39:27 +00:00
case "lastmap_uuid" :
2008-09-06 07:52:41 +00:00
lastMapUUID = ( UUID ) configuration_result ;
2008-06-14 02:39:27 +00:00
break ;
case "lastmap_refresh" :
lastMapRefresh = ( string ) configuration_result ;
break ;
2009-01-02 17:41:12 +00:00
case "nonphysical_prim_max" :
m_nonphysPrimMax = ( int ) configuration_result ;
break ;
case "physical_prim_max" :
m_physPrimMax = ( int ) configuration_result ;
break ;
case "clamp_prim_size" :
m_clampPrimSize = ( bool ) configuration_result ;
break ;
case "object_capacity" :
m_objectCapacity = ( int ) configuration_result ;
break ;
2012-09-08 12:48:07 +00:00
case "linkset_capacity" :
m_linksetCapacity = ( int ) configuration_result ;
2009-01-02 17:41:12 +00:00
break ;
2011-04-15 13:17:26 +00:00
case "agent_capacity" :
2015-09-02 18:54:53 +00:00
AgentCapacity = ( int ) configuration_result ;
2011-04-15 13:17:26 +00:00
break ;
2009-06-22 12:18:04 +00:00
case "scope_id" :
ScopeID = ( UUID ) configuration_result ;
break ;
2009-10-17 13:33:46 +00:00
case "region_type" :
m_regionType = ( string ) configuration_result ;
2009-10-17 12:36:03 +00:00
break ;
2013-01-30 21:43:35 +00:00
case "region_static_maptile" :
m_maptileStaticUUID = ( UUID ) configuration_result ;
break ;
2007-10-31 01:21:04 +00:00
}
return true ;
}
2008-03-18 05:16:43 +00:00
2015-09-02 18:54:53 +00:00
2008-09-06 07:52:41 +00:00
public void SaveLastMapUUID ( UUID mapUUID )
2008-06-14 02:39:27 +00:00
{
lastMapUUID = mapUUID ;
lastMapRefresh = Util . UnixTimeSinceEpoch ( ) . ToString ( ) ;
}
2009-02-14 16:37:55 +00:00
public OSDMap PackRegionInfoData ( )
{
OSDMap args = new OSDMap ( ) ;
args [ "region_id" ] = OSD . FromUUID ( RegionID ) ;
if ( ( RegionName ! = null ) & & ! RegionName . Equals ( "" ) )
args [ "region_name" ] = OSD . FromString ( RegionName ) ;
args [ "external_host_name" ] = OSD . FromString ( ExternalHostName ) ;
args [ "http_port" ] = OSD . FromString ( HttpPort . ToString ( ) ) ;
args [ "server_uri" ] = OSD . FromString ( ServerURI ) ;
2013-09-19 21:12:52 +00:00
2013-12-14 15:53:01 +00:00
args [ "region_xloc" ] = OSD . FromString ( RegionLocX . ToString ( ) ) ;
args [ "region_yloc" ] = OSD . FromString ( RegionLocY . ToString ( ) ) ;
2013-09-19 21:12:52 +00:00
args [ "region_size_x" ] = OSD . FromString ( RegionSizeX . ToString ( ) ) ;
args [ "region_size_y" ] = OSD . FromString ( RegionSizeY . ToString ( ) ) ;
args [ "region_size_z" ] = OSD . FromString ( RegionSizeZ . ToString ( ) ) ;
2009-02-14 16:37:55 +00:00
args [ "internal_ep_address" ] = OSD . FromString ( InternalEndPoint . Address . ToString ( ) ) ;
args [ "internal_ep_port" ] = OSD . FromString ( InternalEndPoint . Port . ToString ( ) ) ;
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 ) ;
2009-10-17 13:33:46 +00:00
if ( RegionType ! = String . Empty )
args [ "region_type" ] = OSD . FromString ( RegionType ) ;
2009-02-14 16:37:55 +00:00
return args ;
}
public void UnpackRegionInfoData ( OSDMap args )
{
if ( args [ "region_id" ] ! = null )
RegionID = args [ "region_id" ] . AsUUID ( ) ;
if ( args [ "region_name" ] ! = null )
RegionName = args [ "region_name" ] . AsString ( ) ;
if ( args [ "external_host_name" ] ! = null )
ExternalHostName = args [ "external_host_name" ] . AsString ( ) ;
if ( args [ "http_port" ] ! = null )
UInt32 . TryParse ( args [ "http_port" ] . AsString ( ) , out m_httpPort ) ;
if ( args [ "server_uri" ] ! = null )
ServerURI = args [ "server_uri" ] . AsString ( ) ;
if ( args [ "region_xloc" ] ! = null )
{
uint locx ;
UInt32 . TryParse ( args [ "region_xloc" ] . AsString ( ) , out locx ) ;
2013-12-14 15:53:01 +00:00
RegionLocX = locx ;
2009-02-14 16:37:55 +00:00
}
if ( args [ "region_yloc" ] ! = null )
{
uint locy ;
UInt32 . TryParse ( args [ "region_yloc" ] . AsString ( ) , out locy ) ;
2013-12-14 15:53:01 +00:00
RegionLocY = locy ;
2009-02-14 16:37:55 +00:00
}
2013-09-19 21:12:52 +00:00
if ( args . ContainsKey ( "region_size_x" ) )
RegionSizeX = ( uint ) args [ "region_size_x" ] . AsInteger ( ) ;
if ( args . ContainsKey ( "region_size_y" ) )
RegionSizeY = ( uint ) args [ "region_size_y" ] . AsInteger ( ) ;
if ( args . ContainsKey ( "region_size_z" ) )
RegionSizeZ = ( uint ) args [ "region_size_z" ] . AsInteger ( ) ;
2009-02-14 16:37:55 +00:00
IPAddress ip_addr = null ;
if ( args [ "internal_ep_address" ] ! = null )
{
IPAddress . TryParse ( args [ "internal_ep_address" ] . AsString ( ) , out ip_addr ) ;
}
int port = 0 ;
if ( args [ "internal_ep_port" ] ! = null )
{
Int32 . TryParse ( args [ "internal_ep_port" ] . AsString ( ) , out port ) ;
}
InternalEndPoint = new IPEndPoint ( ip_addr , port ) ;
if ( args [ "remoting_address" ] ! = null )
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 ( ) ;
2009-10-17 13:33:46 +00:00
if ( args [ "region_type" ] ! = null )
m_regionType = args [ "region_type" ] . AsString ( ) ;
2009-02-14 16:37:55 +00:00
}
2009-03-10 09:05:06 +00:00
2009-03-12 10:50:59 +00:00
public static RegionInfo Create ( UUID regionID , string regionName , uint regX , uint regY , string externalHostName , uint httpPort , uint simPort , uint remotingPort , string serverURI )
2009-03-10 09:05:06 +00:00
{
RegionInfo regionInfo ;
2009-09-30 16:00:09 +00:00
IPEndPoint neighbourInternalEndPoint = new IPEndPoint ( Util . GetHostFromDNS ( externalHostName ) , ( int ) simPort ) ;
2009-03-10 09:05:06 +00:00
regionInfo = new RegionInfo ( regX , regY , neighbourInternalEndPoint , externalHostName ) ;
regionInfo . RemotingPort = remotingPort ;
regionInfo . RemotingAddress = externalHostName ;
regionInfo . HttpPort = httpPort ;
regionInfo . RegionID = regionID ;
regionInfo . RegionName = regionName ;
2009-03-12 10:50:59 +00:00
regionInfo . ServerURI = serverURI ;
2009-03-10 09:05:06 +00:00
return regionInfo ;
}
2009-05-12 03:30:37 +00:00
2009-12-12 05:14:01 +00:00
public int getInternalEndPointPort ( )
{
return m_internalEndPoint . Port ;
}
public Dictionary < string , object > ToKeyValuePairs ( )
{
Dictionary < string , object > kvp = new Dictionary < string , object > ( ) ;
kvp [ "uuid" ] = RegionID . ToString ( ) ;
kvp [ "locX" ] = RegionLocX . ToString ( ) ;
kvp [ "locY" ] = RegionLocY . ToString ( ) ;
kvp [ "external_ip_address" ] = ExternalEndPoint . Address . ToString ( ) ;
kvp [ "external_port" ] = ExternalEndPoint . Port . ToString ( ) ;
kvp [ "external_host_name" ] = ExternalHostName ;
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 ( ) ;
kvp [ "server_uri" ] = ServerURI ;
return kvp ;
}
2007-10-31 01:21:04 +00:00
}
2012-09-08 12:48:07 +00:00
}