aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/RegionInfo.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/RegionInfo.cs')
-rw-r--r--OpenSim/Framework/RegionInfo.cs219
1 files changed, 178 insertions, 41 deletions
diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs
index 24b9c89..63b3d89 100644
--- a/OpenSim/Framework/RegionInfo.cs
+++ b/OpenSim/Framework/RegionInfo.cs
@@ -99,6 +99,7 @@ namespace OpenSim.Framework
99 public class RegionInfo 99 public class RegionInfo
100 { 100 {
101 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 101 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
102 private static readonly string LogHeader = "[REGION INFO]";
102 103
103 public bool commFailTF = false; 104 public bool commFailTF = false;
104 public ConfigurationMember configMember; 105 public ConfigurationMember configMember;
@@ -137,16 +138,20 @@ namespace OpenSim.Framework
137 public bool m_allow_alternate_ports; 138 public bool m_allow_alternate_ports;
138 protected string m_externalHostName; 139 protected string m_externalHostName;
139 protected IPEndPoint m_internalEndPoint; 140 protected IPEndPoint m_internalEndPoint;
140 protected uint? m_regionLocX;
141 protected uint? m_regionLocY;
142 protected uint m_remotingPort; 141 protected uint m_remotingPort;
143 public UUID RegionID = UUID.Zero; 142 public UUID RegionID = UUID.Zero;
144 public string RemotingAddress; 143 public string RemotingAddress;
145 public UUID ScopeID = UUID.Zero; 144 public UUID ScopeID = UUID.Zero;
146 private UUID m_maptileStaticUUID = UUID.Zero; 145 private UUID m_maptileStaticUUID = UUID.Zero;
147 146
148 private Dictionary<String, String> m_otherSettings = new Dictionary<string, string>(); 147 public uint RegionWorldLocX = 0;
148 public uint RegionWorldLocY = 0;
149 public uint RegionWorldLocZ = 0;
150 public uint RegionSizeX = Constants.RegionSize;
151 public uint RegionSizeY = Constants.RegionSize;
152 public uint RegionSizeZ = Constants.RegionHeight;
149 153
154 private Dictionary<String, String> m_otherSettings = new Dictionary<string, string>();
150 155
151 // Apparently, we're applying the same estatesettings regardless of whether it's local or remote. 156 // Apparently, we're applying the same estatesettings regardless of whether it's local or remote.
152 157
@@ -229,11 +234,8 @@ namespace OpenSim.Framework
229 m_serverURI = string.Empty; 234 m_serverURI = string.Empty;
230 } 235 }
231 236
232 public RegionInfo(uint regionLocX, uint regionLocY, IPEndPoint internalEndPoint, string externalUri) 237 public RegionInfo(uint legacyRegionLocX, uint legacyRegionLocY, IPEndPoint internalEndPoint, string externalUri)
233 { 238 {
234 m_regionLocX = regionLocX;
235 m_regionLocY = regionLocY;
236
237 m_internalEndPoint = internalEndPoint; 239 m_internalEndPoint = internalEndPoint;
238 m_externalHostName = externalUri; 240 m_externalHostName = externalUri;
239 m_serverURI = string.Empty; 241 m_serverURI = string.Empty;
@@ -447,25 +449,66 @@ namespace OpenSim.Framework
447 449
448 /// <summary> 450 /// <summary>
449 /// The x co-ordinate of this region in map tiles (e.g. 1000). 451 /// The x co-ordinate of this region in map tiles (e.g. 1000).
452 /// Coordinate is scaled as world coordinates divided by the legacy region size
453 /// and is thus is the number of legacy regions.
454 /// </summary>
455 public uint LegacyRegionLocX
456 {
457 get { return RegionWorldLocX / Constants.RegionSize; }
458 set { RegionWorldLocX = value * Constants.RegionSize; }
459 }
460
461 /// <summary>
462 /// The y co-ordinate of this region in map tiles (e.g. 1000).
463 /// Coordinate is scaled as world coordinates divided by the legacy region size
464 /// and is thus is the number of legacy regions.
465 /// </summary>
466 public uint LegacyRegionLocY
467 {
468 get { return RegionWorldLocY / Constants.RegionSize; }
469 set { RegionWorldLocY = value * Constants.RegionSize; }
470 }
471
472 /// <summary>
473 /// The x co-ordinate of this region in map tiles (e.g. 1000).
474 /// Coordinate is scaled as world coordinates divided by the legacy region size
475 /// and is thus is the number of legacy regions.
476 /// DO NOT USE FOR NEW CODE! This entrypoint exists for downward compatability with external modules.
450 /// </summary> 477 /// </summary>
451 public uint RegionLocX 478 public uint RegionLocX
452 { 479 {
453 get { return m_regionLocX.Value; } 480 get { return LegacyRegionLocX; }
454 set { m_regionLocX = value; } 481 set { LegacyRegionLocX = value; }
455 } 482 }
456 483
457 /// <summary> 484 /// <summary>
458 /// The y co-ordinate of this region in map tiles (e.g. 1000). 485 /// The y co-ordinate of this region in map tiles (e.g. 1000).
486 /// Coordinate is scaled as world coordinates divided by the legacy region size
487 /// and is thus is the number of legacy regions.
488 /// DO NOT USE FOR NEW CODE! This entrypoint exists for downward compatability with external modules.
459 /// </summary> 489 /// </summary>
460 public uint RegionLocY 490 public uint RegionLocY
461 { 491 {
462 get { return m_regionLocY.Value; } 492 get { return LegacyRegionLocY; }
463 set { m_regionLocY = value; } 493 set { LegacyRegionLocY = value; }
494 }
495
496 public void SetDefaultRegionSize()
497 {
498 RegionWorldLocX = 0;
499 RegionWorldLocY = 0;
500 RegionWorldLocZ = 0;
501 RegionSizeX = Constants.RegionSize;
502 RegionSizeY = Constants.RegionSize;
503 RegionSizeZ = Constants.RegionHeight;
464 } 504 }
465 505
506 // A unique region handle is created from the region's world coordinates.
507 // This cannot be changed because some code expects to receive the region handle and then
508 // compute the region coordinates from it.
466 public ulong RegionHandle 509 public ulong RegionHandle
467 { 510 {
468 get { return Util.UIntsToLong((RegionLocX * (uint) Constants.RegionSize), (RegionLocY * (uint) Constants.RegionSize)); } 511 get { return Util.UIntsToLong(RegionWorldLocX, RegionWorldLocY); }
469 } 512 }
470 513
471 public void SetEndPoint(string ipaddr, int port) 514 public void SetEndPoint(string ipaddr, int port)
@@ -572,8 +615,25 @@ namespace OpenSim.Framework
572 615
573 string[] locationElements = location.Split(new char[] {','}); 616 string[] locationElements = location.Split(new char[] {','});
574 617
575 m_regionLocX = Convert.ToUInt32(locationElements[0]); 618 LegacyRegionLocX = Convert.ToUInt32(locationElements[0]);
576 m_regionLocY = Convert.ToUInt32(locationElements[1]); 619 LegacyRegionLocY = Convert.ToUInt32(locationElements[1]);
620
621 // Region size
622 // Default to legacy region size if not specified.
623 allKeys.Remove("SizeX");
624 string configSizeX = config.GetString("SizeX", Constants.RegionSize.ToString());
625 config.Set("SizeX", configSizeX);
626 RegionSizeX = Convert.ToUInt32(configSizeX);
627 allKeys.Remove("SizeY");
628 string configSizeY = config.GetString("SizeY", Constants.RegionSize.ToString());
629 config.Set("SizeY", configSizeX);
630 RegionSizeY = Convert.ToUInt32(configSizeY);
631 allKeys.Remove("SizeZ");
632 string configSizeZ = config.GetString("SizeZ", Constants.RegionHeight.ToString());
633 config.Set("SizeZ", configSizeX);
634 RegionSizeZ = Convert.ToUInt32(configSizeZ);
635
636 DoRegionSizeSanityChecks();
577 637
578 // InternalAddress 638 // InternalAddress
579 // 639 //
@@ -693,6 +753,57 @@ namespace OpenSim.Framework
693 } 753 }
694 } 754 }
695 755
756 // Make sure user specified region sizes are sane.
757 // Must be multiples of legacy region size (256).
758 private void DoRegionSizeSanityChecks()
759 {
760 if (RegionSizeX != Constants.RegionSize || RegionSizeY != Constants.RegionSize)
761 {
762 // Doing non-legacy region sizes.
763 // Enforce region size to be multiples of the legacy region size (256)
764 uint partial = RegionSizeX % Constants.RegionSize;
765 if (partial != 0)
766 {
767 RegionSizeX -= partial;
768 if (RegionSizeX == 0)
769 RegionSizeX = Constants.RegionSize;
770 m_log.ErrorFormat("{0} Region size must be multiple of {1}. Enforcing {2}.RegionSizeX={3} instead of specified {4}",
771 LogHeader, Constants.RegionSize, m_regionName, RegionSizeX, RegionSizeX + partial);
772 }
773 partial = RegionSizeY % Constants.RegionSize;
774 if (partial != 0)
775 {
776 RegionSizeY -= partial;
777 if (RegionSizeY == 0)
778 RegionSizeY = Constants.RegionSize;
779 m_log.ErrorFormat("{0} Region size must be multiple of {1}. Enforcing {2}.RegionSizeY={3} instead of specified {4}",
780 LogHeader, Constants.RegionSize, m_regionName, RegionSizeY, RegionSizeY + partial);
781 }
782
783 // Because of things in the viewer, regions MUST be square.
784 // Remove this check when viewers have been updated.
785 if (RegionSizeX != RegionSizeY)
786 {
787 uint minSize = Math.Min(RegionSizeX, RegionSizeY);
788 RegionSizeX = minSize;
789 RegionSizeY = minSize;
790 m_log.ErrorFormat("{0} Regions must be square until viewers are updated. Forcing region {1} size to <{2},{3}>",
791 LogHeader, m_regionName, RegionSizeX, RegionSizeY);
792 }
793
794 // There is a practical limit to region size.
795 if (RegionSizeX > Constants.MaximumRegionSize || RegionSizeY > Constants.MaximumRegionSize)
796 {
797 RegionSizeX = Util.Clamp<uint>(RegionSizeX, Constants.RegionSize, Constants.MaximumRegionSize);
798 RegionSizeY = Util.Clamp<uint>(RegionSizeY, Constants.RegionSize, Constants.MaximumRegionSize);
799 m_log.ErrorFormat("{0} Region dimensions must be less than {1}. Clamping {2}'s size to <{3},{4}>",
800 LogHeader, Constants.MaximumRegionSize, m_regionName, RegionSizeX, RegionSizeY);
801 }
802
803 m_log.InfoFormat("{0} Region {1} size set to <{2},{3}>", LogHeader, m_regionName, RegionSizeX, RegionSizeY);
804 }
805 }
806
696 private void WriteNiniConfig(IConfigSource source) 807 private void WriteNiniConfig(IConfigSource source)
697 { 808 {
698 IConfig config = source.Configs[RegionName]; 809 IConfig config = source.Configs[RegionName];
@@ -704,9 +815,16 @@ namespace OpenSim.Framework
704 815
705 config.Set("RegionUUID", RegionID.ToString()); 816 config.Set("RegionUUID", RegionID.ToString());
706 817
707 string location = String.Format("{0},{1}", m_regionLocX, m_regionLocY); 818 string location = String.Format("{0},{1}", LegacyRegionLocX, LegacyRegionLocY);
708 config.Set("Location", location); 819 config.Set("Location", location);
709 820
821 if (RegionSizeX != Constants.RegionSize || RegionSizeY != Constants.RegionSize)
822 {
823 config.Set("SizeX", RegionSizeX);
824 config.Set("SizeY", RegionSizeY);
825 config.Set("SizeZ", RegionSizeZ);
826 }
827
710 config.Set("InternalAddress", m_internalEndPoint.Address.ToString()); 828 config.Set("InternalAddress", m_internalEndPoint.Address.ToString());
711 config.Set("InternalPort", m_internalEndPoint.Port); 829 config.Set("InternalPort", m_internalEndPoint.Port);
712 830
@@ -789,10 +907,18 @@ namespace OpenSim.Framework
789 RegionID.ToString(), true); 907 RegionID.ToString(), true);
790 configMember.addConfigurationOption("sim_name", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, 908 configMember.addConfigurationOption("sim_name", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY,
791 "Region Name", RegionName, true); 909 "Region Name", RegionName, true);
910
792 configMember.addConfigurationOption("sim_location_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, 911 configMember.addConfigurationOption("sim_location_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
793 "Grid Location (X Axis)", m_regionLocX.ToString(), true); 912 "Grid Location (X Axis)", LegacyRegionLocX.ToString(), true);
794 configMember.addConfigurationOption("sim_location_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, 913 configMember.addConfigurationOption("sim_location_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
795 "Grid Location (Y Axis)", m_regionLocY.ToString(), true); 914 "Grid Location (Y Axis)", LegacyRegionLocY.ToString(), true);
915 configMember.addConfigurationOption("sim_size_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
916 "Size of region in X dimension", RegionSizeX.ToString(), true);
917 configMember.addConfigurationOption("sim_size_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
918 "Size of region in Y dimension", RegionSizeY.ToString(), true);
919 configMember.addConfigurationOption("sim_size_z", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
920 "Size of region in Z dimension", RegionSizeZ.ToString(), true);
921
796 //m_configMember.addConfigurationOption("datastore", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Filename for local storage", "OpenSim.db", false); 922 //m_configMember.addConfigurationOption("datastore", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Filename for local storage", "OpenSim.db", false);
797 configMember.addConfigurationOption("internal_ip_address", 923 configMember.addConfigurationOption("internal_ip_address",
798 ConfigurationOption.ConfigurationTypes.TYPE_IP_ADDRESS, 924 ConfigurationOption.ConfigurationTypes.TYPE_IP_ADDRESS,
@@ -855,10 +981,18 @@ namespace OpenSim.Framework
855 UUID.Random().ToString(), true); 981 UUID.Random().ToString(), true);
856 configMember.addConfigurationOption("sim_name", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, 982 configMember.addConfigurationOption("sim_name", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY,
857 "Region Name", "OpenSim Test", false); 983 "Region Name", "OpenSim Test", false);
984
858 configMember.addConfigurationOption("sim_location_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, 985 configMember.addConfigurationOption("sim_location_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
859 "Grid Location (X Axis)", "1000", false); 986 "Grid Location (X Axis)", "1000", false);
860 configMember.addConfigurationOption("sim_location_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, 987 configMember.addConfigurationOption("sim_location_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
861 "Grid Location (Y Axis)", "1000", false); 988 "Grid Location (Y Axis)", "1000", false);
989 configMember.addConfigurationOption("sim_size_x", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
990 "Size of region in X dimension", Constants.RegionSize.ToString(), false);
991 configMember.addConfigurationOption("sim_size_y", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
992 "Size of region in Y dimension", Constants.RegionSize.ToString(), false);
993 configMember.addConfigurationOption("sim_size_z", ConfigurationOption.ConfigurationTypes.TYPE_UINT32,
994 "Size of region in Z dimension", Constants.RegionHeight.ToString(), false);
995
862 //m_configMember.addConfigurationOption("datastore", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Filename for local storage", "OpenSim.db", false); 996 //m_configMember.addConfigurationOption("datastore", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Filename for local storage", "OpenSim.db", false);
863 configMember.addConfigurationOption("internal_ip_address", 997 configMember.addConfigurationOption("internal_ip_address",
864 ConfigurationOption.ConfigurationTypes.TYPE_IP_ADDRESS, 998 ConfigurationOption.ConfigurationTypes.TYPE_IP_ADDRESS,
@@ -916,10 +1050,19 @@ namespace OpenSim.Framework
916 RegionName = (string) configuration_result; 1050 RegionName = (string) configuration_result;
917 break; 1051 break;
918 case "sim_location_x": 1052 case "sim_location_x":
919 m_regionLocX = (uint) configuration_result; 1053 LegacyRegionLocX = (uint) configuration_result;
920 break; 1054 break;
921 case "sim_location_y": 1055 case "sim_location_y":
922 m_regionLocY = (uint) configuration_result; 1056 LegacyRegionLocY = (uint) configuration_result;
1057 break;
1058 case "sim_size_x":
1059 RegionSizeX = (uint) configuration_result;
1060 break;
1061 case "sim_size_y":
1062 RegionSizeY = (uint) configuration_result;
1063 break;
1064 case "sim_size_z":
1065 RegionSizeZ = (uint) configuration_result;
923 break; 1066 break;
924 case "internal_ip_address": 1067 case "internal_ip_address":
925 IPAddress address = (IPAddress) configuration_result; 1068 IPAddress address = (IPAddress) configuration_result;
@@ -1000,8 +1143,13 @@ namespace OpenSim.Framework
1000 args["external_host_name"] = OSD.FromString(ExternalHostName); 1143 args["external_host_name"] = OSD.FromString(ExternalHostName);
1001 args["http_port"] = OSD.FromString(HttpPort.ToString()); 1144 args["http_port"] = OSD.FromString(HttpPort.ToString());
1002 args["server_uri"] = OSD.FromString(ServerURI); 1145 args["server_uri"] = OSD.FromString(ServerURI);
1003 args["region_xloc"] = OSD.FromString(RegionLocX.ToString()); 1146
1004 args["region_yloc"] = OSD.FromString(RegionLocY.ToString()); 1147 args["region_xloc"] = OSD.FromString(LegacyRegionLocX.ToString());
1148 args["region_yloc"] = OSD.FromString(LegacyRegionLocY.ToString());
1149 args["region_size_x"] = OSD.FromString(RegionSizeX.ToString());
1150 args["region_size_y"] = OSD.FromString(RegionSizeY.ToString());
1151 args["region_size_z"] = OSD.FromString(RegionSizeZ.ToString());
1152
1005 args["internal_ep_address"] = OSD.FromString(InternalEndPoint.Address.ToString()); 1153 args["internal_ep_address"] = OSD.FromString(InternalEndPoint.Address.ToString());
1006 args["internal_ep_port"] = OSD.FromString(InternalEndPoint.Port.ToString()); 1154 args["internal_ep_port"] = OSD.FromString(InternalEndPoint.Port.ToString());
1007 if ((RemotingAddress != null) && !RemotingAddress.Equals("")) 1155 if ((RemotingAddress != null) && !RemotingAddress.Equals(""))
@@ -1032,14 +1180,21 @@ namespace OpenSim.Framework
1032 { 1180 {
1033 uint locx; 1181 uint locx;
1034 UInt32.TryParse(args["region_xloc"].AsString(), out locx); 1182 UInt32.TryParse(args["region_xloc"].AsString(), out locx);
1035 RegionLocX = locx; 1183 LegacyRegionLocX = locx;
1036 } 1184 }
1037 if (args["region_yloc"] != null) 1185 if (args["region_yloc"] != null)
1038 { 1186 {
1039 uint locy; 1187 uint locy;
1040 UInt32.TryParse(args["region_yloc"].AsString(), out locy); 1188 UInt32.TryParse(args["region_yloc"].AsString(), out locy);
1041 RegionLocY = locy; 1189 LegacyRegionLocY = locy;
1042 } 1190 }
1191 if (args.ContainsKey("region_size_x"))
1192 RegionSizeX = (uint)args["region_size_x"].AsInteger();
1193 if (args.ContainsKey("region_size_y"))
1194 RegionSizeY = (uint)args["region_size_y"].AsInteger();
1195 if (args.ContainsKey("region_size_z"))
1196 RegionSizeZ = (uint)args["region_size_z"].AsInteger();
1197
1043 IPAddress ip_addr = null; 1198 IPAddress ip_addr = null;
1044 if (args["internal_ep_address"] != null) 1199 if (args["internal_ep_address"] != null)
1045 { 1200 {
@@ -1076,23 +1231,5 @@ namespace OpenSim.Framework
1076 regionInfo.ServerURI = serverURI; 1231 regionInfo.ServerURI = serverURI;
1077 return regionInfo; 1232 return regionInfo;
1078 } 1233 }
1079
1080 public Dictionary<string, object> ToKeyValuePairs()
1081 {
1082 Dictionary<string, object> kvp = new Dictionary<string, object>();
1083 kvp["uuid"] = RegionID.ToString();
1084 kvp["locX"] = RegionLocX.ToString();
1085 kvp["locY"] = RegionLocY.ToString();
1086 kvp["external_ip_address"] = ExternalEndPoint.Address.ToString();
1087 kvp["external_port"] = ExternalEndPoint.Port.ToString();
1088 kvp["external_host_name"] = ExternalHostName;
1089 kvp["http_port"] = HttpPort.ToString();
1090 kvp["internal_ip_address"] = InternalEndPoint.Address.ToString();
1091 kvp["internal_port"] = InternalEndPoint.Port.ToString();
1092 kvp["alternate_ports"] = m_allow_alternate_ports.ToString();
1093 kvp["server_uri"] = ServerURI;
1094
1095 return kvp;
1096 }
1097 } 1234 }
1098} 1235}