mirror of
https://github.com/opensim/opensim.git
synced 2026-08-05 08:55:56 +08:00
change the GetFallbackRegions sort code
This commit is contained in:
@@ -84,29 +84,39 @@ namespace OpenSim.Data
|
||||
|
||||
List<RegionData> GetDefaultRegions(UUID scopeID);
|
||||
List<RegionData> GetDefaultHypergridRegions(UUID scopeID);
|
||||
List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y);
|
||||
List<RegionData> GetFallbackRegions(UUID scopeID);
|
||||
List<RegionData> GetHyperlinks(UUID scopeID);
|
||||
}
|
||||
|
||||
public class RegionDataDistanceCompare : IComparer<RegionData>
|
||||
{
|
||||
private Vector2 m_origin;
|
||||
private float m_originX;
|
||||
private float m_originY;
|
||||
|
||||
public RegionDataDistanceCompare(int x, int y)
|
||||
{
|
||||
m_origin = new Vector2(x, y);
|
||||
m_originX = x;
|
||||
m_originY = y;
|
||||
}
|
||||
|
||||
public int Compare(RegionData regionA, RegionData regionB)
|
||||
{
|
||||
Vector2 vectorA = new Vector2(regionA.posX, regionA.posY);
|
||||
Vector2 vectorB = new Vector2(regionB.posX, regionB.posY);
|
||||
return Math.Sign(VectorDistance(m_origin, vectorA) - VectorDistance(m_origin, vectorB));
|
||||
}
|
||||
float dx = regionA.posX - m_originX;
|
||||
if (dx < 0)
|
||||
dx += regionA.sizeX - 1;
|
||||
float dy = regionA.posY - m_originY;
|
||||
if (dy < 0)
|
||||
dy += regionA.sizeY - 1;
|
||||
float da = dx * dx - dy * dy;
|
||||
|
||||
private float VectorDistance(Vector2 x, Vector2 y)
|
||||
{
|
||||
return (x - y).Length();
|
||||
dx = regionB.posX - m_originX;
|
||||
if (dx < 0)
|
||||
dx += regionB.sizeX - 1;
|
||||
dy = regionB.posY - m_originY;
|
||||
if (dy < 0)
|
||||
dy += regionB.sizeY - 1;
|
||||
float db = dx * dx - dy * dy;
|
||||
return da.CompareTo(db);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -392,12 +392,9 @@ namespace OpenSim.Data.MySQL
|
||||
return Get((int)RegionFlags.DefaultHGRegion, scopeID);
|
||||
}
|
||||
|
||||
public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
|
||||
public List<RegionData> GetFallbackRegions(UUID scopeID)
|
||||
{
|
||||
List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
|
||||
RegionDataDistanceCompare distanceComparer = new RegionDataDistanceCompare(x, y);
|
||||
regions.Sort(distanceComparer);
|
||||
return regions;
|
||||
return Get((int)RegionFlags.FallbackRegion, scopeID);
|
||||
}
|
||||
|
||||
public List<RegionData> GetHyperlinks(UUID scopeID)
|
||||
|
||||
@@ -5,11 +5,11 @@ BEGIN;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `prims` (
|
||||
`CreationDate` int(11) DEFAULT NULL,
|
||||
`Name` varchar(255) DEFAULT NULL,
|
||||
`Text` varchar(255) DEFAULT NULL,
|
||||
`Description` varchar(255) DEFAULT NULL,
|
||||
`SitName` varchar(255) DEFAULT NULL,
|
||||
`TouchName` varchar(255) DEFAULT NULL,
|
||||
`Name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`Text` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`Description` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`SitName` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`TouchName` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`ObjectFlags` int(11) DEFAULT NULL,
|
||||
`OwnerMask` int(11) DEFAULT NULL,
|
||||
`NextOwnerMask` int(11) DEFAULT NULL,
|
||||
|
||||
@@ -73,17 +73,12 @@ namespace OpenSim.Data.Null
|
||||
if (m_useStaticInstance && Instance != this)
|
||||
return Instance.GetSpecific(regionName, scopeID);
|
||||
|
||||
string cleanName = regionName.ToLower();
|
||||
Matcher queryMatch;
|
||||
queryMatch = delegate (string s) { return s.Equals(cleanName); };
|
||||
|
||||
lock (m_regionData)
|
||||
lock (m_regionData)
|
||||
{
|
||||
foreach (RegionData r in m_regionData.Values)
|
||||
{
|
||||
// m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanName, r.RegionName.ToLower());
|
||||
if (queryMatch(r.RegionName.ToLower()))
|
||||
return(r);
|
||||
if(r.RegionName.Equals(regionName, StringComparison.InvariantCultureIgnoreCase))
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,12 +263,9 @@ namespace OpenSim.Data.Null
|
||||
return Get((int)RegionFlags.DefaultHGRegion, scopeID);
|
||||
}
|
||||
|
||||
public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
|
||||
public List<RegionData> GetFallbackRegions(UUID scopeID)
|
||||
{
|
||||
List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
|
||||
RegionDataDistanceCompare distanceComparer = new RegionDataDistanceCompare(x, y);
|
||||
regions.Sort(distanceComparer);
|
||||
return regions;
|
||||
return Get((int)RegionFlags.FallbackRegion, scopeID);
|
||||
}
|
||||
|
||||
public List<RegionData> GetHyperlinks(UUID scopeID)
|
||||
|
||||
@@ -421,13 +421,9 @@ namespace OpenSim.Data.PGSQL
|
||||
return Get((int)RegionFlags.DefaultHGRegion, scopeID);
|
||||
}
|
||||
|
||||
public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
|
||||
public List<RegionData> GetFallbackRegions(UUID scopeID)
|
||||
{
|
||||
List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
|
||||
RegionDataDistanceCompare distanceComparer = new RegionDataDistanceCompare(x, y);
|
||||
regions.Sort(distanceComparer);
|
||||
|
||||
return regions;
|
||||
return Get((int)RegionFlags.FallbackRegion, scopeID);
|
||||
}
|
||||
|
||||
public List<RegionData> GetHyperlinks(UUID scopeID)
|
||||
|
||||
@@ -789,7 +789,13 @@ namespace OpenSim.Services.GridService
|
||||
{
|
||||
List<GridRegion> ret = new List<GridRegion>();
|
||||
|
||||
List<RegionData> regions = m_Database.GetFallbackRegions(scopeID, x, y);
|
||||
List<RegionData> regions = m_Database.GetFallbackRegions(scopeID);
|
||||
|
||||
if(regions.Count > 1)
|
||||
{
|
||||
RegionDataDistanceCompare distanceComparer = new RegionDataDistanceCompare(x, y);
|
||||
regions.Sort(distanceComparer);
|
||||
}
|
||||
|
||||
foreach (RegionData r in regions)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user