aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/MySQL/MySQLSimulationData.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Data/MySQL/MySQLSimulationData.cs')
-rw-r--r--OpenSim/Data/MySQL/MySQLSimulationData.cs199
1 files changed, 152 insertions, 47 deletions
diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs
index 1a2e113..4e7c8af 100644
--- a/OpenSim/Data/MySQL/MySQLSimulationData.cs
+++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs
@@ -66,7 +66,7 @@ namespace OpenSim.Data.MySQL
66 Initialise(connectionString); 66 Initialise(connectionString);
67 } 67 }
68 68
69 public void Initialise(string connectionString) 69 public virtual void Initialise(string connectionString)
70 { 70 {
71 m_connectionString = connectionString; 71 m_connectionString = connectionString;
72 72
@@ -113,14 +113,16 @@ namespace OpenSim.Data.MySQL
113 113
114 public void Dispose() {} 114 public void Dispose() {}
115 115
116 public void StoreObject(SceneObjectGroup obj, UUID regionUUID) 116 public virtual void StoreObject(SceneObjectGroup obj, UUID regionUUID)
117 { 117 {
118 uint flags = obj.RootPart.GetEffectiveObjectFlags(); 118 uint flags = obj.RootPart.GetEffectiveObjectFlags();
119 119
120 // Eligibility check 120 // Eligibility check
121 // 121 //
122 if ((flags & (uint)PrimFlags.Temporary) != 0) 122 // PrimFlags.Temporary is not used in OpenSim code and cannot
123 return; 123 // be guaranteed to always be clear. Don't check it.
124// if ((flags & (uint)PrimFlags.Temporary) != 0)
125// return;
124 if ((flags & (uint)PrimFlags.TemporaryOnRez) != 0) 126 if ((flags & (uint)PrimFlags.TemporaryOnRez) != 0)
125 return; 127 return;
126 128
@@ -135,7 +137,7 @@ namespace OpenSim.Data.MySQL
135 foreach (SceneObjectPart prim in obj.Parts) 137 foreach (SceneObjectPart prim in obj.Parts)
136 { 138 {
137 cmd.Parameters.Clear(); 139 cmd.Parameters.Clear();
138 140
139 cmd.CommandText = "replace into prims (" + 141 cmd.CommandText = "replace into prims (" +
140 "UUID, CreationDate, " + 142 "UUID, CreationDate, " +
141 "Name, Text, Description, " + 143 "Name, Text, Description, " +
@@ -171,7 +173,10 @@ namespace OpenSim.Data.MySQL
171 "ParticleSystem, ClickAction, Material, " + 173 "ParticleSystem, ClickAction, Material, " +
172 "CollisionSound, CollisionSoundVolume, " + 174 "CollisionSound, CollisionSoundVolume, " +
173 "PassTouches, " + 175 "PassTouches, " +
174 "LinkNumber, MediaURL) values (" + "?UUID, " + 176 "PassCollisions, " +
177 "LinkNumber, MediaURL, KeyframeMotion, " +
178 "PhysicsShapeType, Density, GravityModifier, " +
179 "Friction, Restitution) values (" + "?UUID, " +
175 "?CreationDate, ?Name, ?Text, " + 180 "?CreationDate, ?Name, ?Text, " +
176 "?Description, ?SitName, ?TouchName, " + 181 "?Description, ?SitName, ?TouchName, " +
177 "?ObjectFlags, ?OwnerMask, ?NextOwnerMask, " + 182 "?ObjectFlags, ?OwnerMask, ?NextOwnerMask, " +
@@ -202,14 +207,17 @@ namespace OpenSim.Data.MySQL
202 "?SaleType, ?ColorR, ?ColorG, " + 207 "?SaleType, ?ColorR, ?ColorG, " +
203 "?ColorB, ?ColorA, ?ParticleSystem, " + 208 "?ColorB, ?ColorA, ?ParticleSystem, " +
204 "?ClickAction, ?Material, ?CollisionSound, " + 209 "?ClickAction, ?Material, ?CollisionSound, " +
205 "?CollisionSoundVolume, ?PassTouches, ?LinkNumber, ?MediaURL)"; 210 "?CollisionSoundVolume, ?PassTouches, ?PassCollisions, " +
206 211 "?LinkNumber, ?MediaURL, ?KeyframeMotion, " +
212 "?PhysicsShapeType, ?Density, ?GravityModifier, " +
213 "?Friction, ?Restitution)";
214
207 FillPrimCommand(cmd, prim, obj.UUID, regionUUID); 215 FillPrimCommand(cmd, prim, obj.UUID, regionUUID);
208 216
209 ExecuteNonQuery(cmd); 217 ExecuteNonQuery(cmd);
210 218
211 cmd.Parameters.Clear(); 219 cmd.Parameters.Clear();
212 220
213 cmd.CommandText = "replace into primshapes (" + 221 cmd.CommandText = "replace into primshapes (" +
214 "UUID, Shape, ScaleX, ScaleY, " + 222 "UUID, Shape, ScaleX, ScaleY, " +
215 "ScaleZ, PCode, PathBegin, PathEnd, " + 223 "ScaleZ, PCode, PathBegin, PathEnd, " +
@@ -231,9 +239,9 @@ namespace OpenSim.Data.MySQL
231 "?ProfileEnd, ?ProfileCurve, " + 239 "?ProfileEnd, ?ProfileCurve, " +
232 "?ProfileHollow, ?Texture, ?ExtraParams, " + 240 "?ProfileHollow, ?Texture, ?ExtraParams, " +
233 "?State, ?Media)"; 241 "?State, ?Media)";
234 242
235 FillShapeCommand(cmd, prim); 243 FillShapeCommand(cmd, prim);
236 244
237 ExecuteNonQuery(cmd); 245 ExecuteNonQuery(cmd);
238 } 246 }
239 } 247 }
@@ -241,7 +249,7 @@ namespace OpenSim.Data.MySQL
241 } 249 }
242 } 250 }
243 251
244 public void RemoveObject(UUID obj, UUID regionUUID) 252 public virtual void RemoveObject(UUID obj, UUID regionUUID)
245 { 253 {
246// m_log.DebugFormat("[REGION DB]: Deleting scene object {0} from {1} in database", obj, regionUUID); 254// m_log.DebugFormat("[REGION DB]: Deleting scene object {0} from {1} in database", obj, regionUUID);
247 255
@@ -390,7 +398,7 @@ namespace OpenSim.Data.MySQL
390 } 398 }
391 } 399 }
392 400
393 public List<SceneObjectGroup> LoadObjects(UUID regionID) 401 public virtual List<SceneObjectGroup> LoadObjects(UUID regionID)
394 { 402 {
395 const int ROWS_PER_QUERY = 5000; 403 const int ROWS_PER_QUERY = 5000;
396 404
@@ -446,7 +454,11 @@ namespace OpenSim.Data.MySQL
446 foreach (SceneObjectPart prim in prims.Values) 454 foreach (SceneObjectPart prim in prims.Values)
447 { 455 {
448 if (prim.ParentUUID == UUID.Zero) 456 if (prim.ParentUUID == UUID.Zero)
457 {
449 objects[prim.UUID] = new SceneObjectGroup(prim); 458 objects[prim.UUID] = new SceneObjectGroup(prim);
459 if (prim.KeyframeMotion != null)
460 prim.KeyframeMotion.UpdateSceneObject(objects[prim.UUID]);
461 }
450 } 462 }
451 463
452 // Add all of the children objects to the SOGs 464 // Add all of the children objects to the SOGs
@@ -559,36 +571,51 @@ namespace OpenSim.Data.MySQL
559 } 571 }
560 } 572 }
561 573
562 public void StoreTerrain(double[,] ter, UUID regionID) 574 public virtual void StoreTerrain(double[,] ter, UUID regionID)
563 { 575 {
564 m_log.Info("[REGION DB]: Storing terrain"); 576 Util.FireAndForget(delegate(object x)
565
566 lock (m_dbLock)
567 { 577 {
568 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 578 double[,] oldTerrain = LoadTerrain(regionID);
569 {
570 dbcon.Open();
571 579
572 using (MySqlCommand cmd = dbcon.CreateCommand()) 580 m_log.Info("[REGION DB]: Storing terrain");
581
582 lock (m_dbLock)
583 {
584 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
573 { 585 {
574 cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID"; 586 dbcon.Open();
575 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
576 587
577 ExecuteNonQuery(cmd); 588 using (MySqlCommand cmd = dbcon.CreateCommand())
589 {
590 cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID";
591 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
578 592
579 cmd.CommandText = "insert into terrain (RegionUUID, " + 593 using (MySqlCommand cmd2 = dbcon.CreateCommand())
580 "Revision, Heightfield) values (?RegionUUID, " + 594 {
581 "1, ?Heightfield)"; 595 try
596 {
597 cmd2.CommandText = "insert into terrain (RegionUUID, " +
598 "Revision, Heightfield) values (?RegionUUID, " +
599 "1, ?Heightfield)";
582 600
583 cmd.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter)); 601 cmd2.Parameters.AddWithValue("RegionUUID", regionID.ToString());
602 cmd2.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter, oldTerrain));
584 603
585 ExecuteNonQuery(cmd); 604 ExecuteNonQuery(cmd);
605 ExecuteNonQuery(cmd2);
606 }
607 catch (Exception e)
608 {
609 m_log.ErrorFormat(e.ToString());
610 }
611 }
612 }
586 } 613 }
587 } 614 }
588 } 615 });
589 } 616 }
590 617
591 public double[,] LoadTerrain(UUID regionID) 618 public virtual double[,] LoadTerrain(UUID regionID)
592 { 619 {
593 double[,] terrain = null; 620 double[,] terrain = null;
594 621
@@ -638,7 +665,7 @@ namespace OpenSim.Data.MySQL
638 return terrain; 665 return terrain;
639 } 666 }
640 667
641 public void RemoveLandObject(UUID globalID) 668 public virtual void RemoveLandObject(UUID globalID)
642 { 669 {
643 lock (m_dbLock) 670 lock (m_dbLock)
644 { 671 {
@@ -657,7 +684,7 @@ namespace OpenSim.Data.MySQL
657 } 684 }
658 } 685 }
659 686
660 public void StoreLandObject(ILandObject parcel) 687 public virtual void StoreLandObject(ILandObject parcel)
661 { 688 {
662 lock (m_dbLock) 689 lock (m_dbLock)
663 { 690 {
@@ -714,7 +741,7 @@ namespace OpenSim.Data.MySQL
714 } 741 }
715 } 742 }
716 743
717 public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID) 744 public virtual RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
718 { 745 {
719 RegionLightShareData nWP = new RegionLightShareData(); 746 RegionLightShareData nWP = new RegionLightShareData();
720 nWP.OnSave += StoreRegionWindlightSettings; 747 nWP.OnSave += StoreRegionWindlightSettings;
@@ -736,7 +763,7 @@ namespace OpenSim.Data.MySQL
736 { 763 {
737 //No result, so store our default windlight profile and return it 764 //No result, so store our default windlight profile and return it
738 nWP.regionID = regionUUID; 765 nWP.regionID = regionUUID;
739 StoreRegionWindlightSettings(nWP); 766 // StoreRegionWindlightSettings(nWP);
740 return nWP; 767 return nWP;
741 } 768 }
742 else 769 else
@@ -811,7 +838,7 @@ namespace OpenSim.Data.MySQL
811 return nWP; 838 return nWP;
812 } 839 }
813 840
814 public RegionSettings LoadRegionSettings(UUID regionUUID) 841 public virtual RegionSettings LoadRegionSettings(UUID regionUUID)
815 { 842 {
816 RegionSettings rs = null; 843 RegionSettings rs = null;
817 844
@@ -851,7 +878,7 @@ namespace OpenSim.Data.MySQL
851 return rs; 878 return rs;
852 } 879 }
853 880
854 public void StoreRegionWindlightSettings(RegionLightShareData wl) 881 public virtual void StoreRegionWindlightSettings(RegionLightShareData wl)
855 { 882 {
856 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 883 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
857 { 884 {
@@ -954,7 +981,7 @@ namespace OpenSim.Data.MySQL
954 } 981 }
955 } 982 }
956 983
957 public void RemoveRegionWindlightSettings(UUID regionID) 984 public virtual void RemoveRegionWindlightSettings(UUID regionID)
958 { 985 {
959 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 986 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
960 { 987 {
@@ -1031,7 +1058,7 @@ namespace OpenSim.Data.MySQL
1031 } 1058 }
1032 #endregion 1059 #endregion
1033 1060
1034 public void StoreRegionSettings(RegionSettings rs) 1061 public virtual void StoreRegionSettings(RegionSettings rs)
1035 { 1062 {
1036 lock (m_dbLock) 1063 lock (m_dbLock)
1037 { 1064 {
@@ -1058,7 +1085,7 @@ namespace OpenSim.Data.MySQL
1058 "use_estate_sun, fixed_sun, sun_position, " + 1085 "use_estate_sun, fixed_sun, sun_position, " +
1059 "covenant, covenant_datetime, Sandbox, sunvectorx, sunvectory, " + 1086 "covenant, covenant_datetime, Sandbox, sunvectorx, sunvectory, " +
1060 "sunvectorz, loaded_creation_datetime, " + 1087 "sunvectorz, loaded_creation_datetime, " +
1061 "loaded_creation_id, map_tile_ID, " + 1088 "loaded_creation_id, map_tile_ID, block_search, casino, " +
1062 "TelehubObject, parcel_tile_ID) " + 1089 "TelehubObject, parcel_tile_ID) " +
1063 "values (?RegionUUID, ?BlockTerraform, " + 1090 "values (?RegionUUID, ?BlockTerraform, " +
1064 "?BlockFly, ?AllowDamage, ?RestrictPushing, " + 1091 "?BlockFly, ?AllowDamage, ?RestrictPushing, " +
@@ -1075,7 +1102,8 @@ namespace OpenSim.Data.MySQL
1075 "?SunPosition, ?Covenant, ?CovenantChangedDateTime, ?Sandbox, " + 1102 "?SunPosition, ?Covenant, ?CovenantChangedDateTime, ?Sandbox, " +
1076 "?SunVectorX, ?SunVectorY, ?SunVectorZ, " + 1103 "?SunVectorX, ?SunVectorY, ?SunVectorZ, " +
1077 "?LoadedCreationDateTime, ?LoadedCreationID, " + 1104 "?LoadedCreationDateTime, ?LoadedCreationID, " +
1078 "?TerrainImageID, ?TelehubObject, ?ParcelImageID) "; 1105 "?TerrainImageID, ?block_search, ?casino, " +
1106 "?TelehubObject, ?ParcelImageID)";
1079 1107
1080 FillRegionSettingsCommand(cmd, rs); 1108 FillRegionSettingsCommand(cmd, rs);
1081 1109
@@ -1086,7 +1114,7 @@ namespace OpenSim.Data.MySQL
1086 SaveSpawnPoints(rs); 1114 SaveSpawnPoints(rs);
1087 } 1115 }
1088 1116
1089 public List<LandData> LoadLandObjects(UUID regionUUID) 1117 public virtual List<LandData> LoadLandObjects(UUID regionUUID)
1090 { 1118 {
1091 List<LandData> landData = new List<LandData>(); 1119 List<LandData> landData = new List<LandData>();
1092 1120
@@ -1268,11 +1296,31 @@ namespace OpenSim.Data.MySQL
1268 prim.CollisionSoundVolume = (float)(double)row["CollisionSoundVolume"]; 1296 prim.CollisionSoundVolume = (float)(double)row["CollisionSoundVolume"];
1269 1297
1270 prim.PassTouches = ((sbyte)row["PassTouches"] != 0); 1298 prim.PassTouches = ((sbyte)row["PassTouches"] != 0);
1299 prim.PassCollisions = ((sbyte)row["PassCollisions"] != 0);
1271 prim.LinkNum = (int)row["LinkNumber"]; 1300 prim.LinkNum = (int)row["LinkNumber"];
1272 1301
1273 if (!(row["MediaURL"] is System.DBNull)) 1302 if (!(row["MediaURL"] is System.DBNull))
1274 prim.MediaUrl = (string)row["MediaURL"]; 1303 prim.MediaUrl = (string)row["MediaURL"];
1275 1304
1305 if (!(row["KeyframeMotion"] is DBNull))
1306 {
1307 Byte[] data = (byte[])row["KeyframeMotion"];
1308 if (data.Length > 0)
1309 prim.KeyframeMotion = KeyframeMotion.FromData(null, data);
1310 else
1311 prim.KeyframeMotion = null;
1312 }
1313 else
1314 {
1315 prim.KeyframeMotion = null;
1316 }
1317
1318 prim.PhysicsShapeType = (byte)Convert.ToInt32(row["PhysicsShapeType"].ToString());
1319 prim.Density = (float)(double)row["Density"];
1320 prim.GravityModifier = (float)(double)row["GravityModifier"];
1321 prim.Friction = (float)(double)row["Friction"];
1322 prim.Bounciness = (float)(double)row["Restitution"];
1323
1276 return prim; 1324 return prim;
1277 } 1325 }
1278 1326
@@ -1366,6 +1414,9 @@ namespace OpenSim.Data.MySQL
1366 newSettings.ParcelImageID = DBGuid.FromDB(row["parcel_tile_ID"]); 1414 newSettings.ParcelImageID = DBGuid.FromDB(row["parcel_tile_ID"]);
1367 newSettings.TelehubObject = DBGuid.FromDB(row["TelehubObject"]); 1415 newSettings.TelehubObject = DBGuid.FromDB(row["TelehubObject"]);
1368 1416
1417 newSettings.GodBlockSearch = Convert.ToBoolean(row["block_search"]);
1418 newSettings.Casino = Convert.ToBoolean(row["casino"]);
1419
1369 return newSettings; 1420 return newSettings;
1370 } 1421 }
1371 1422
@@ -1463,7 +1514,7 @@ namespace OpenSim.Data.MySQL
1463 /// </summary> 1514 /// </summary>
1464 /// <param name="val"></param> 1515 /// <param name="val"></param>
1465 /// <returns></returns> 1516 /// <returns></returns>
1466 private static Array SerializeTerrain(double[,] val) 1517 private static Array SerializeTerrain(double[,] val, double[,] oldTerrain)
1467 { 1518 {
1468 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double)); 1519 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double));
1469 BinaryWriter bw = new BinaryWriter(str); 1520 BinaryWriter bw = new BinaryWriter(str);
@@ -1472,7 +1523,11 @@ namespace OpenSim.Data.MySQL
1472 for (int x = 0; x < (int)Constants.RegionSize; x++) 1523 for (int x = 0; x < (int)Constants.RegionSize; x++)
1473 for (int y = 0; y < (int)Constants.RegionSize; y++) 1524 for (int y = 0; y < (int)Constants.RegionSize; y++)
1474 { 1525 {
1475 double height = val[x, y]; 1526 double height = 20.0;
1527 if (oldTerrain != null)
1528 height = oldTerrain[x, y];
1529 if (!double.IsNaN(val[x, y]))
1530 height = val[x, y];
1476 if (height == 0.0) 1531 if (height == 0.0)
1477 height = double.Epsilon; 1532 height = double.Epsilon;
1478 1533
@@ -1616,8 +1671,24 @@ namespace OpenSim.Data.MySQL
1616 else 1671 else
1617 cmd.Parameters.AddWithValue("PassTouches", 0); 1672 cmd.Parameters.AddWithValue("PassTouches", 0);
1618 1673
1674 if (prim.PassCollisions)
1675 cmd.Parameters.AddWithValue("PassCollisions", 1);
1676 else
1677 cmd.Parameters.AddWithValue("PassCollisions", 0);
1678
1619 cmd.Parameters.AddWithValue("LinkNumber", prim.LinkNum); 1679 cmd.Parameters.AddWithValue("LinkNumber", prim.LinkNum);
1620 cmd.Parameters.AddWithValue("MediaURL", prim.MediaUrl); 1680 cmd.Parameters.AddWithValue("MediaURL", prim.MediaUrl);
1681
1682 if (prim.KeyframeMotion != null)
1683 cmd.Parameters.AddWithValue("KeyframeMotion", prim.KeyframeMotion.Serialize());
1684 else
1685 cmd.Parameters.AddWithValue("KeyframeMotion", new Byte[0]);
1686
1687 cmd.Parameters.AddWithValue("PhysicsShapeType", prim.PhysicsShapeType);
1688 cmd.Parameters.AddWithValue("Density", (double)prim.Density);
1689 cmd.Parameters.AddWithValue("GravityModifier", (double)prim.GravityModifier);
1690 cmd.Parameters.AddWithValue("Friction", (double)prim.Friction);
1691 cmd.Parameters.AddWithValue("Restitution", (double)prim.Bounciness);
1621 } 1692 }
1622 1693
1623 /// <summary> 1694 /// <summary>
@@ -1696,6 +1767,9 @@ namespace OpenSim.Data.MySQL
1696 cmd.Parameters.AddWithValue("LoadedCreationDateTime", settings.LoadedCreationDateTime); 1767 cmd.Parameters.AddWithValue("LoadedCreationDateTime", settings.LoadedCreationDateTime);
1697 cmd.Parameters.AddWithValue("LoadedCreationID", settings.LoadedCreationID); 1768 cmd.Parameters.AddWithValue("LoadedCreationID", settings.LoadedCreationID);
1698 cmd.Parameters.AddWithValue("TerrainImageID", settings.TerrainImageID); 1769 cmd.Parameters.AddWithValue("TerrainImageID", settings.TerrainImageID);
1770 cmd.Parameters.AddWithValue("block_search", settings.GodBlockSearch);
1771 cmd.Parameters.AddWithValue("casino", settings.Casino);
1772
1699 cmd.Parameters.AddWithValue("ParcelImageID", settings.ParcelImageID); 1773 cmd.Parameters.AddWithValue("ParcelImageID", settings.ParcelImageID);
1700 cmd.Parameters.AddWithValue("TelehubObject", settings.TelehubObject); 1774 cmd.Parameters.AddWithValue("TelehubObject", settings.TelehubObject);
1701 } 1775 }
@@ -1856,7 +1930,7 @@ namespace OpenSim.Data.MySQL
1856 cmd.Parameters.AddWithValue("Media", null == s.Media ? null : s.Media.ToXml()); 1930 cmd.Parameters.AddWithValue("Media", null == s.Media ? null : s.Media.ToXml());
1857 } 1931 }
1858 1932
1859 public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items) 1933 public virtual void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items)
1860 { 1934 {
1861 lock (m_dbLock) 1935 lock (m_dbLock)
1862 { 1936 {
@@ -1900,6 +1974,37 @@ namespace OpenSim.Data.MySQL
1900 } 1974 }
1901 } 1975 }
1902 1976
1977 public UUID[] GetObjectIDs(UUID regionID)
1978 {
1979 List<UUID> uuids = new List<UUID>();
1980
1981 lock (m_dbLock)
1982 {
1983 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
1984 {
1985 dbcon.Open();
1986
1987 using (MySqlCommand cmd = dbcon.CreateCommand())
1988 {
1989 cmd.CommandText = "select UUID from prims where RegionUUID = ?RegionUUID";
1990 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
1991
1992 using (IDataReader reader = ExecuteReader(cmd))
1993 {
1994 while (reader.Read())
1995 {
1996 UUID id = new UUID(reader["UUID"].ToString());
1997
1998 uuids.Add(id);
1999 }
2000 }
2001 }
2002 }
2003 }
2004
2005 return uuids.ToArray();
2006 }
2007
1903 private void LoadSpawnPoints(RegionSettings rs) 2008 private void LoadSpawnPoints(RegionSettings rs)
1904 { 2009 {
1905 rs.ClearSpawnPoints(); 2010 rs.ClearSpawnPoints();