diff --git a/OpenSim/Data/IRegionData.cs b/OpenSim/Data/IRegionData.cs index 218356a42d..fd13bab16c 100644 --- a/OpenSim/Data/IRegionData.cs +++ b/OpenSim/Data/IRegionData.cs @@ -84,29 +84,39 @@ namespace OpenSim.Data List GetDefaultRegions(UUID scopeID); List GetDefaultHypergridRegions(UUID scopeID); - List GetFallbackRegions(UUID scopeID, int x, int y); + List GetFallbackRegions(UUID scopeID); List GetHyperlinks(UUID scopeID); } public class RegionDataDistanceCompare : IComparer { - 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); } } } diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index 9115e93cf6..fcd8109101 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -392,12 +392,9 @@ namespace OpenSim.Data.MySQL return Get((int)RegionFlags.DefaultHGRegion, scopeID); } - public List GetFallbackRegions(UUID scopeID, int x, int y) + public List GetFallbackRegions(UUID scopeID) { - List 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 GetHyperlinks(UUID scopeID) diff --git a/OpenSim/Data/MySQL/Resources/RegionStore.migrations b/OpenSim/Data/MySQL/Resources/RegionStore.migrations index bcca09d3f3..d1f62dcdb4 100644 --- a/OpenSim/Data/MySQL/Resources/RegionStore.migrations +++ b/OpenSim/Data/MySQL/Resources/RegionStore.migrations @@ -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, diff --git a/OpenSim/Data/Null/NullRegionData.cs b/OpenSim/Data/Null/NullRegionData.cs index fd6048028b..e924bc762b 100644 --- a/OpenSim/Data/Null/NullRegionData.cs +++ b/OpenSim/Data/Null/NullRegionData.cs @@ -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 GetFallbackRegions(UUID scopeID, int x, int y) + public List GetFallbackRegions(UUID scopeID) { - List 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 GetHyperlinks(UUID scopeID) diff --git a/OpenSim/Data/PGSQL/PGSQLRegionData.cs b/OpenSim/Data/PGSQL/PGSQLRegionData.cs index a58fc8a97f..5888ae8bf8 100644 --- a/OpenSim/Data/PGSQL/PGSQLRegionData.cs +++ b/OpenSim/Data/PGSQL/PGSQLRegionData.cs @@ -421,13 +421,9 @@ namespace OpenSim.Data.PGSQL return Get((int)RegionFlags.DefaultHGRegion, scopeID); } - public List GetFallbackRegions(UUID scopeID, int x, int y) + public List GetFallbackRegions(UUID scopeID) { - List 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 GetHyperlinks(UUID scopeID) diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 9120d63d39..a08b117037 100755 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -789,7 +789,13 @@ namespace OpenSim.Services.GridService { List ret = new List(); - List regions = m_Database.GetFallbackRegions(scopeID, x, y); + List regions = m_Database.GetFallbackRegions(scopeID); + + if(regions.Count > 1) + { + RegionDataDistanceCompare distanceComparer = new RegionDataDistanceCompare(x, y); + regions.Sort(distanceComparer); + } foreach (RegionData r in regions) {