aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs123
-rw-r--r--OpenSim/Region/CoreModules/World/Land/Tests/LandManagementModuleTests.cs155
2 files changed, 211 insertions, 67 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index bbb0176..7f17aff 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -863,72 +863,7 @@ namespace OpenSim.Region.CoreModules.World.Land
863 ); 863 );
864 } 864 }
865 865
866 lock (m_landIDList) 866 return m_landList[m_landIDList[x / 4, y / 4]];
867 {
868 int landID = m_landIDList[x / LandUnit, y / LandUnit];
869 if (landID == 0)
870 {
871 // Zero is the uninitialized value saying there is no parcel for this location.
872 // This sometimes happens when terrain is resized.
873 if (m_landList.Count == 1)
874 {
875 m_log.DebugFormat(
876 "[{0}]: Auto-extending land parcel as landID at {1},{2} is 0 and only one land parcel is present in {3}",
877 LogHeader, x, y, m_scene.Name);
878
879 int onlyParcelID = 0;
880 ILandObject onlyLandObject = null;
881 foreach (KeyValuePair<int, ILandObject> kvp in m_landList)
882 {
883 onlyParcelID = kvp.Key;
884 onlyLandObject = kvp.Value;
885 break;
886 }
887
888 // There is only one parcel. Grow it to fill all the unallocated spaces.
889 for (int xx = 0; xx < m_landIDList.GetLength(0); xx++)
890 for (int yy = 0; yy < m_landIDList.GetLength(1); yy++)
891 if (m_landIDList[xx, yy] == 0)
892 m_landIDList[xx, yy] = onlyParcelID;
893
894 onlyLandObject.LandBitmap = CreateBitmapForID(onlyParcelID);
895 landID = onlyParcelID;
896 }
897 else if (m_landList.Count > 1)
898 {
899 m_log.DebugFormat(
900 "[{0}]: Auto-creating land parcel as landID at {1},{2} is 0 and more than one land parcel is present in {3}",
901 LogHeader, x, y, m_scene.Name);
902
903 // There are several other parcels so we must create a new one for the unassigned space
904 ILandObject newLand = new LandObject(UUID.Zero, false, m_scene);
905 // Claim all the unclaimed "0" ids
906 newLand.SetLandBitmap(CreateBitmapForID(0));
907 newLand.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
908 newLand.LandData.ClaimDate = Util.UnixTimeSinceEpoch();
909 newLand = AddLandObject(newLand);
910
911 if (newLand == null)
912 return null;
913
914 landID = m_lastLandLocalID;
915 }
916 else
917 {
918 // XXX: We're not currently doing anything if there are no parcels, as this might indicate a race
919 // condition where this method is being called before land data is loaded. May need to address
920 // this in another way.
921
922 m_log.WarnFormat(
923 "[{0}]: Ignoring request to auto-create parcel in {1} as there are no other parcels present",
924 LogHeader, m_scene.Name);
925 }
926 }
927
928 ret = m_landList[landID];
929 }
930
931 return ret;
932 } 867 }
933 868
934 // Create a 'parcel is here' bitmap for the parcel identified by the passed landID 869 // Create a 'parcel is here' bitmap for the parcel identified by the passed landID
@@ -1226,6 +1161,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1226 1161
1227 } 1162 }
1228 } 1163 }
1164
1229 if (byteArrayCount != 0) 1165 if (byteArrayCount != 0)
1230 { 1166 {
1231 remote_client.SendLandParcelOverlay(byteArray, sequenceID); 1167 remote_client.SendLandParcelOverlay(byteArray, sequenceID);
@@ -1543,6 +1479,61 @@ namespace OpenSim.Region.CoreModules.World.Land
1543 { 1479 {
1544 for (int i = 0; i < data.Count; i++) 1480 for (int i = 0; i < data.Count; i++)
1545 IncomingLandObjectFromStorage(data[i]); 1481 IncomingLandObjectFromStorage(data[i]);
1482
1483 // Layer data is in landUnit (4m) chunks
1484 for (int y = 0; y < m_scene.RegionInfo.RegionSizeY / Constants.TerrainPatchSize * (Constants.TerrainPatchSize / LandUnit); y++)
1485 {
1486 for (int x = 0; x < m_scene.RegionInfo.RegionSizeX / Constants.TerrainPatchSize * (Constants.TerrainPatchSize / LandUnit); x++)
1487 {
1488 if (m_landIDList[x, y] == 0)
1489 {
1490 if (m_landList.Count == 1)
1491 {
1492 m_log.DebugFormat(
1493 "[{0}]: Auto-extending land parcel as landID at {1},{2} is 0 and only one land parcel is present in {3}",
1494 LogHeader, x, y, m_scene.Name);
1495
1496 int onlyParcelID = 0;
1497 ILandObject onlyLandObject = null;
1498 foreach (KeyValuePair<int, ILandObject> kvp in m_landList)
1499 {
1500 onlyParcelID = kvp.Key;
1501 onlyLandObject = kvp.Value;
1502 break;
1503 }
1504
1505 // There is only one parcel. Grow it to fill all the unallocated spaces.
1506 for (int xx = 0; xx < m_landIDList.GetLength(0); xx++)
1507 for (int yy = 0; yy < m_landIDList.GetLength(1); yy++)
1508 if (m_landIDList[xx, yy] == 0)
1509 m_landIDList[xx, yy] = onlyParcelID;
1510
1511 onlyLandObject.LandBitmap = CreateBitmapForID(onlyParcelID);
1512 }
1513 else if (m_landList.Count > 1)
1514 {
1515 m_log.DebugFormat(
1516 "{0}: Auto-creating land parcel as landID at {1},{2} is 0 and more than one land parcel is present in {3}",
1517 LogHeader, x, y, m_scene.Name);
1518
1519 // There are several other parcels so we must create a new one for the unassigned space
1520 ILandObject newLand = new LandObject(UUID.Zero, false, m_scene);
1521 // Claim all the unclaimed "0" ids
1522 newLand.SetLandBitmap(CreateBitmapForID(0));
1523 newLand.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
1524 newLand.LandData.ClaimDate = Util.UnixTimeSinceEpoch();
1525 newLand = AddLandObject(newLand);
1526 }
1527 else
1528 {
1529 // We should never reach this point as the separate code path when no land data exists should have fired instead.
1530 m_log.WarnFormat(
1531 "{0}: Ignoring request to auto-create parcel in {1} as there are no other parcels present",
1532 LogHeader, m_scene.Name);
1533 }
1534 }
1535 }
1536 }
1546 } 1537 }
1547 } 1538 }
1548 1539
diff --git a/OpenSim/Region/CoreModules/World/Land/Tests/LandManagementModuleTests.cs b/OpenSim/Region/CoreModules/World/Land/Tests/LandManagementModuleTests.cs
index a886e33..6d0253d 100644
--- a/OpenSim/Region/CoreModules/World/Land/Tests/LandManagementModuleTests.cs
+++ b/OpenSim/Region/CoreModules/World/Land/Tests/LandManagementModuleTests.cs
@@ -35,7 +35,7 @@ using OpenSim.Tests.Common.Mock;
35 35
36namespace OpenSim.Region.CoreModules.World.Land.Tests 36namespace OpenSim.Region.CoreModules.World.Land.Tests
37{ 37{
38 public class LandManagementModuleTests 38 public class LandManagementModuleTests : OpenSimTestCase
39 { 39 {
40 [Test] 40 [Test]
41 public void TestAddLandObject() 41 public void TestAddLandObject()
@@ -78,6 +78,159 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
78 } 78 }
79 } 79 }
80 80
81 /// <summary>
82 /// Test parcels on region when no land data exists to be loaded.
83 /// </summary>
84 [Test]
85 public void TestLoadWithNoParcels()
86 {
87 TestHelpers.InMethod();
88// TestHelpers.EnableLogging();
89
90 SceneHelpers sh = new SceneHelpers();
91 LandManagementModule lmm = new LandManagementModule();
92 Scene scene = sh.SetupScene();
93 SceneHelpers.SetupSceneModules(scene, lmm);
94
95 scene.loadAllLandObjectsFromStorage(scene.RegionInfo.RegionID);
96
97 ILandObject loAtCoord1 = lmm.GetLandObject(0, 0);
98 Assert.That(loAtCoord1.LandData.LocalID, Is.Not.EqualTo(0));
99 Assert.That(loAtCoord1.LandData.GlobalID, Is.Not.EqualTo(UUID.Zero));
100
101 ILandObject loAtCoord2 = lmm.GetLandObject((int)Constants.RegionSize - 1, ((int)Constants.RegionSize - 1));
102 Assert.That(loAtCoord2.LandData.LocalID, Is.EqualTo(loAtCoord1.LandData.LocalID));
103 Assert.That(loAtCoord2.LandData.GlobalID, Is.EqualTo(loAtCoord1.LandData.GlobalID));
104 }
105
106 /// <summary>
107 /// Test parcels on region when a single parcel already exists but it does not cover the whole region.
108 /// </summary>
109 [Test]
110 public void TestLoadWithSinglePartialCoveringParcel()
111 {
112 TestHelpers.InMethod();
113// TestHelpers.EnableLogging();
114
115 UUID userId = TestHelpers.ParseTail(0x1);
116
117 SceneHelpers sh = new SceneHelpers();
118 LandManagementModule lmm = new LandManagementModule();
119 Scene scene = sh.SetupScene();
120 SceneHelpers.SetupSceneModules(scene, lmm);
121
122 ILandObject originalLo1 = new LandObject(userId, false, scene);
123 originalLo1.LandData.Name = "lo1";
124 originalLo1.SetLandBitmap(
125 originalLo1.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize / 2));
126
127 sh.SimDataService.StoreLandObject(originalLo1);
128
129 scene.loadAllLandObjectsFromStorage(scene.RegionInfo.RegionID);
130
131 ILandObject loAtCoord1 = lmm.GetLandObject(0, 0);
132 Assert.That(loAtCoord1.LandData.Name, Is.EqualTo(originalLo1.LandData.Name));
133 Assert.That(loAtCoord1.LandData.GlobalID, Is.EqualTo(originalLo1.LandData.GlobalID));
134
135 ILandObject loAtCoord2 = lmm.GetLandObject((int)Constants.RegionSize - 1, ((int)Constants.RegionSize - 1));
136 Assert.That(loAtCoord2.LandData.LocalID, Is.EqualTo(loAtCoord1.LandData.LocalID));
137 Assert.That(loAtCoord2.LandData.GlobalID, Is.EqualTo(loAtCoord1.LandData.GlobalID));
138 }
139
140 /// <summary>
141 /// Test parcels on region when a single parcel already exists but it does not cover the whole region.
142 /// </summary>
143 [Test]
144 public void TestLoadWithMultiplePartialCoveringParcels()
145 {
146 TestHelpers.InMethod();
147// TestHelpers.EnableLogging();
148
149 UUID userId = TestHelpers.ParseTail(0x1);
150
151 SceneHelpers sh = new SceneHelpers();
152 LandManagementModule lmm = new LandManagementModule();
153 Scene scene = sh.SetupScene();
154 SceneHelpers.SetupSceneModules(scene, lmm);
155
156 ILandObject originalLo1 = new LandObject(userId, false, scene);
157 originalLo1.LandData.Name = "lo1";
158 originalLo1.SetLandBitmap(
159 originalLo1.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize / 2));
160
161 sh.SimDataService.StoreLandObject(originalLo1);
162
163 ILandObject originalLo2 = new LandObject(userId, false, scene);
164 originalLo2.LandData.Name = "lo2";
165 originalLo2.SetLandBitmap(
166 originalLo2.GetSquareLandBitmap(
167 0, (int)Constants.RegionSize / 2, (int)Constants.RegionSize, ((int)Constants.RegionSize / 4) * 3));
168
169 sh.SimDataService.StoreLandObject(originalLo2);
170
171 scene.loadAllLandObjectsFromStorage(scene.RegionInfo.RegionID);
172
173 ILandObject loAtCoord1 = lmm.GetLandObject(0, 0);
174 Assert.That(loAtCoord1.LandData.Name, Is.EqualTo(originalLo1.LandData.Name));
175 Assert.That(loAtCoord1.LandData.GlobalID, Is.EqualTo(originalLo1.LandData.GlobalID));
176
177 ILandObject loAtCoord2
178 = lmm.GetLandObject((int)Constants.RegionSize - 1, (((int)Constants.RegionSize / 4) * 3) - 1);
179 Assert.That(loAtCoord2.LandData.Name, Is.EqualTo(originalLo2.LandData.Name));
180 Assert.That(loAtCoord2.LandData.GlobalID, Is.EqualTo(originalLo2.LandData.GlobalID));
181
182 ILandObject loAtCoord3 = lmm.GetLandObject((int)Constants.RegionSize - 1, ((int)Constants.RegionSize - 1));
183 Assert.That(loAtCoord3.LandData.LocalID, Is.Not.EqualTo(loAtCoord1.LandData.LocalID));
184 Assert.That(loAtCoord3.LandData.LocalID, Is.Not.EqualTo(loAtCoord2.LandData.LocalID));
185 Assert.That(loAtCoord3.LandData.GlobalID, Is.Not.EqualTo(loAtCoord1.LandData.GlobalID));
186 Assert.That(loAtCoord3.LandData.GlobalID, Is.Not.EqualTo(loAtCoord2.LandData.GlobalID));
187 }
188
189 /// <summary>
190 /// Test parcels on region when whole region is parcelled (which should normally always be the case).
191 /// </summary>
192 [Test]
193 public void TestLoad()
194 {
195 TestHelpers.InMethod();
196// TestHelpers.EnableLogging();
197
198 UUID userId = TestHelpers.ParseTail(0x1);
199
200 SceneHelpers sh = new SceneHelpers();
201 LandManagementModule lmm = new LandManagementModule();
202 Scene scene = sh.SetupScene();
203 SceneHelpers.SetupSceneModules(scene, lmm);
204
205 ILandObject originalLo1 = new LandObject(userId, false, scene);
206 originalLo1.LandData.Name = "lo1";
207 originalLo1.SetLandBitmap(
208 originalLo1.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize / 2));
209
210 sh.SimDataService.StoreLandObject(originalLo1);
211
212 ILandObject originalLo2 = new LandObject(userId, false, scene);
213 originalLo2.LandData.Name = "lo2";
214 originalLo2.SetLandBitmap(
215 originalLo2.GetSquareLandBitmap(0, (int)Constants.RegionSize / 2, (int)Constants.RegionSize, (int)Constants.RegionSize));
216
217 sh.SimDataService.StoreLandObject(originalLo2);
218
219 scene.loadAllLandObjectsFromStorage(scene.RegionInfo.RegionID);
220
221 {
222 ILandObject loAtCoord = lmm.GetLandObject(0, 0);
223 Assert.That(loAtCoord.LandData.Name, Is.EqualTo(originalLo1.LandData.Name));
224 Assert.That(loAtCoord.LandData.GlobalID, Is.EqualTo(originalLo1.LandData.GlobalID));
225 }
226
227 {
228 ILandObject loAtCoord = lmm.GetLandObject((int)Constants.RegionSize - 1, ((int)Constants.RegionSize - 1));
229 Assert.That(loAtCoord.LandData.Name, Is.EqualTo(originalLo2.LandData.Name));
230 Assert.That(loAtCoord.LandData.GlobalID, Is.EqualTo(originalLo2.LandData.GlobalID));
231 }
232 }
233
81 [Test] 234 [Test]
82 public void TestSubdivide() 235 public void TestSubdivide()
83 { 236 {