change the GetFallbackRegions sort code

This commit is contained in:
UbitUmarov
2021-09-02 17:22:59 +01:00
parent 58df13587f
commit 9b840f1f9e
6 changed files with 41 additions and 40 deletions

View File

@@ -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);
}
}
}

View File

@@ -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)

View File

@@ -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,

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)
{