aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorHomer Horwitz2008-10-05 19:06:00 +0000
committerHomer Horwitz2008-10-05 19:06:00 +0000
commit5a31fb9df4ed0df20aca27f4f12e595b2bb3a5f6 (patch)
treef37730a5bbfb1abbbbeb2777c09fee291da7b601
parent* Fixes the last snag with the EventQueue. The situation where the seedcap g... (diff)
downloadopensim-SC-5a31fb9df4ed0df20aca27f4f12e595b2bb3a5f6.zip
opensim-SC-5a31fb9df4ed0df20aca27f4f12e595b2bb3a5f6.tar.gz
opensim-SC-5a31fb9df4ed0df20aca27f4f12e595b2bb3a5f6.tar.bz2
opensim-SC-5a31fb9df4ed0df20aca27f4f12e595b2bb3a5f6.tar.xz
Fix a problem with land-search and non-convex parcels.
You'll need to update your snapshots.
-rw-r--r--OpenSim/Region/DataSnapshot/LandSnapshot.cs41
1 files changed, 39 insertions, 2 deletions
diff --git a/OpenSim/Region/DataSnapshot/LandSnapshot.cs b/OpenSim/Region/DataSnapshot/LandSnapshot.cs
index 680a1fa..5288c74 100644
--- a/OpenSim/Region/DataSnapshot/LandSnapshot.cs
+++ b/OpenSim/Region/DataSnapshot/LandSnapshot.cs
@@ -189,9 +189,10 @@ namespace OpenSim.Region.DataSnapshot.Providers
189 xmlparcel.AppendChild(tpLocation); 189 xmlparcel.AppendChild(tpLocation);
190 190
191 XmlNode infouuid = nodeFactory.CreateNode(XmlNodeType.Element, "infouuid", ""); 191 XmlNode infouuid = nodeFactory.CreateNode(XmlNodeType.Element, "infouuid", "");
192 uint x = (uint)loc.X, y = (uint)loc.Y;
193 findPointInParcel(land, ref x, ref y); // find a suitable spot
192 infouuid.InnerText = Util.BuildFakeParcelID( 194 infouuid.InnerText = Util.BuildFakeParcelID(
193 m_scene.RegionInfo.RegionHandle, 195 m_scene.RegionInfo.RegionHandle, x, y).ToString();
194 (uint)loc.X, (uint)loc.Y).ToString();
195 xmlparcel.AppendChild(infouuid); 196 xmlparcel.AppendChild(infouuid);
196 197
197 XmlNode dwell = nodeFactory.CreateNode(XmlNodeType.Element, "dwell", ""); 198 XmlNode dwell = nodeFactory.CreateNode(XmlNodeType.Element, "dwell", "");
@@ -345,5 +346,41 @@ namespace OpenSim.Region.DataSnapshot.Providers
345 } 346 }
346 347
347 #endregion 348 #endregion
349
350 // this is needed for non-convex parcels (example: rectangular parcel, and in the exact center
351 // another, smaller rectangular parcel). Both will have the same initial coordinates.
352 private void findPointInParcel(ILandObject land, ref uint refX, ref uint refY)
353 {
354 m_log.DebugFormat("[LAND] trying {0}, {1}", refX, refY);
355 // the point we started with already is in the parcel
356 if (land.containsPoint((int)refX, (int)refY)) return;
357
358 // ... otherwise, we have to search for a point within the parcel
359 uint startX = (uint)land.landData.AABBMin.X;
360 uint startY = (uint)land.landData.AABBMin.Y;
361 uint endX = (uint)land.landData.AABBMax.X;
362 uint endY = (uint)land.landData.AABBMax.Y;
363
364 // default: center of the parcel
365 refX = (startX + endX) / 2;
366 refY = (startY + endY) / 2;
367 // If the center point is within the parcel, take that one
368 if (land.containsPoint((int)refX, (int)refY)) return;
369
370 // otherwise, go the long way.
371 for (uint y = startY; y <= endY; ++y)
372 {
373 for (uint x = startX; x <= endX; ++x)
374 {
375 if (land.containsPoint((int)x, (int)y))
376 {
377 // found a point
378 refX = x;
379 refY = y;
380 return;
381 }
382 }
383 }
384 }
348 } 385 }
349} 386}