aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/GridService
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Services/GridService')
-rw-r--r--OpenSim/Services/GridService/GridService.cs16
-rw-r--r--OpenSim/Services/GridService/HypergridLinker.cs45
2 files changed, 56 insertions, 5 deletions
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index ebaed42..ce6f64b 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -426,6 +426,22 @@ namespace OpenSim.Services.GridService
426 return ret; 426 return ret;
427 } 427 }
428 428
429 public List<GridRegion> GetHyperlinks(UUID scopeID)
430 {
431 List<GridRegion> ret = new List<GridRegion>();
432
433 List<RegionData> regions = m_Database.GetHyperlinks(scopeID);
434
435 foreach (RegionData r in regions)
436 {
437 if ((Convert.ToInt32(r.Data["flags"]) & (int)OpenSim.Data.RegionFlags.RegionOnline) != 0)
438 ret.Add(RegionData2RegionInfo(r));
439 }
440
441 m_log.DebugFormat("[GRID SERVICE]: Hyperlinks returned {0} regions", ret.Count);
442 return ret;
443 }
444
429 public int GetRegionFlags(UUID scopeID, UUID regionID) 445 public int GetRegionFlags(UUID scopeID, UUID regionID)
430 { 446 {
431 RegionData region = m_Database.Get(regionID, scopeID); 447 RegionData region = m_Database.Get(regionID, scopeID);
diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs
index 1f53007..b190f93 100644
--- a/OpenSim/Services/GridService/HypergridLinker.cs
+++ b/OpenSim/Services/GridService/HypergridLinker.cs
@@ -62,6 +62,7 @@ namespace OpenSim.Services.GridService
62 protected GatekeeperServiceConnector m_GatekeeperConnector; 62 protected GatekeeperServiceConnector m_GatekeeperConnector;
63 63
64 protected UUID m_ScopeID = UUID.Zero; 64 protected UUID m_ScopeID = UUID.Zero;
65 protected bool m_Check4096 = true;
65 66
66 // Hyperlink regions are hyperlinks on the map 67 // Hyperlink regions are hyperlinks on the map
67 public readonly Dictionary<UUID, GridRegion> m_HyperlinkRegions = new Dictionary<UUID, GridRegion>(); 68 public readonly Dictionary<UUID, GridRegion> m_HyperlinkRegions = new Dictionary<UUID, GridRegion>();
@@ -116,6 +117,8 @@ namespace OpenSim.Services.GridService
116 if (scope != string.Empty) 117 if (scope != string.Empty)
117 UUID.TryParse(scope, out m_ScopeID); 118 UUID.TryParse(scope, out m_ScopeID);
118 119
120 m_Check4096 = gridConfig.GetBoolean("Check4096", true);
121
119 m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService); 122 m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService);
120 123
121 m_log.DebugFormat("[HYPERGRID LINKER]: Loaded all services..."); 124 m_log.DebugFormat("[HYPERGRID LINKER]: Loaded all services...");
@@ -277,7 +280,7 @@ namespace OpenSim.Services.GridService
277 } 280 }
278 281
279 uint x, y; 282 uint x, y;
280 if (!Check4096(handle, out x, out y)) 283 if (m_Check4096 && !Check4096(handle, out x, out y))
281 { 284 {
282 RemoveHyperlinkRegion(regInfo.RegionID); 285 RemoveHyperlinkRegion(regInfo.RegionID);
283 reason = "Region is too far (" + x + ", " + y + ")"; 286 reason = "Region is too far (" + x + ", " + y + ")";
@@ -332,18 +335,50 @@ namespace OpenSim.Services.GridService
332 /// <returns></returns> 335 /// <returns></returns>
333 public bool Check4096(ulong realHandle, out uint x, out uint y) 336 public bool Check4096(ulong realHandle, out uint x, out uint y)
334 { 337 {
335 GridRegion defRegion = DefaultRegion;
336
337 uint ux = 0, uy = 0; 338 uint ux = 0, uy = 0;
338 Utils.LongToUInts(realHandle, out ux, out uy); 339 Utils.LongToUInts(realHandle, out ux, out uy);
339 x = ux / Constants.RegionSize; 340 x = ux / Constants.RegionSize;
340 y = uy / Constants.RegionSize; 341 y = uy / Constants.RegionSize;
341 342
342 if ((Math.Abs((int)defRegion.RegionLocX - ux) >= 4096 * Constants.RegionSize) || 343 const uint limit = (4096 - 1) * Constants.RegionSize;
343 (Math.Abs((int)defRegion.RegionLocY - uy) >= 4096 * Constants.RegionSize)) 344 uint xmin = ux - limit;
345 uint xmax = ux + limit;
346 uint ymin = uy - limit;
347 uint ymax = uy + limit;
348 // World map boundary checks
349 if (xmin < 0 || xmin > ux)
350 xmin = 0;
351 if (xmax > int.MaxValue || xmax < ux)
352 xmax = int.MaxValue;
353 if (ymin < 0 || ymin > uy)
354 ymin = 0;
355 if (ymax > int.MaxValue || ymax < uy)
356 ymax = int.MaxValue;
357
358 // Check for any regions that are within the possible teleport range to the linked region
359 List<GridRegion> regions = m_GridService.GetRegionRange(m_ScopeID, (int)xmin, (int)xmax, (int)ymin, (int)ymax);
360 if (regions.Count == 0)
344 { 361 {
345 return false; 362 return false;
346 } 363 }
364 else
365 {
366 // Check for regions which are not linked regions
367 List<GridRegion> hyperlinks = m_GridService.GetHyperlinks(m_ScopeID);
368 // would like to use .Except, but doesn't seem to exist
369 //IEnumerable<GridRegion> availableRegions = regions.Except(hyperlinks);
370 List<GridRegion> availableRegions = regions.FindAll(delegate(GridRegion region)
371 {
372 // Ewww! n^2
373 if (hyperlinks.Find(delegate(GridRegion r) { return r.RegionID == region.RegionID; }) == null) // not hyperlink. good.
374 return true;
375
376 return false;
377 });
378 if (availableRegions.Count == 0)
379 return false;
380 }
381
347 return true; 382 return true;
348 } 383 }
349 384