New method for resetting the map on HG: do it only once upon changing grids, and reset only exactly the map blocks that had regions in them. WARNING: this fetches all the regions from the Grid service, so there is a chance that this is a really bad idea in large grids. Pushing it for testing.
parent
8d3a8a0a81
commit
98d1e7768a
|
@ -147,8 +147,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
{
|
{
|
||||||
base.AgentHasMovedAway(sp, logout);
|
base.AgentHasMovedAway(sp, logout);
|
||||||
if (logout)
|
if (logout)
|
||||||
|
{
|
||||||
|
// Reset the map
|
||||||
|
ResetMap(sp);
|
||||||
|
|
||||||
// Log them out of this grid
|
// Log them out of this grid
|
||||||
m_aScene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
|
m_aScene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout)
|
protected override bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout)
|
||||||
|
@ -280,6 +285,27 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void ResetMap(ScenePresence sp)
|
||||||
|
{
|
||||||
|
List<GridRegion> regions = m_Scenes[0].GridService.GetRegionRange(m_Scenes[0].RegionInfo.ScopeID, 0, 17000 * (int)Constants.RegionSize, 0, 17000 * (int)Constants.RegionSize);
|
||||||
|
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Resetting {0} tiles on the map", regions.Count);
|
||||||
|
if (regions != null)
|
||||||
|
{
|
||||||
|
List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
||||||
|
foreach (GridRegion r in regions)
|
||||||
|
{
|
||||||
|
MapBlockData mblock = new MapBlockData();
|
||||||
|
mblock.X = (ushort)(r.RegionLocX / Constants.RegionSize);
|
||||||
|
mblock.Y = (ushort)(r.RegionLocY / Constants.RegionSize);
|
||||||
|
mblock.Name = "";
|
||||||
|
mblock.Access = 254; // means 'simulator is offline'. We need this because the viewer ignores 255's
|
||||||
|
mblock.MapImageId = UUID.Zero;
|
||||||
|
mapBlocks.Add(mblock);
|
||||||
|
}
|
||||||
|
sp.ControllingClient.SendMapBlock(mapBlocks, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
@ -59,44 +59,44 @@ namespace OpenSim.Region.CoreModules.Hypergrid
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
protected override void GetAndSendBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
//protected override void GetAndSendBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
||||||
{
|
//{
|
||||||
List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
// List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
||||||
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
// List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
||||||
minX * (int)Constants.RegionSize, maxX * (int)Constants.RegionSize,
|
// minX * (int)Constants.RegionSize, maxX * (int)Constants.RegionSize,
|
||||||
minY * (int)Constants.RegionSize, maxY * (int)Constants.RegionSize);
|
// minY * (int)Constants.RegionSize, maxY * (int)Constants.RegionSize);
|
||||||
|
|
||||||
foreach (GridRegion r in regions)
|
// foreach (GridRegion r in regions)
|
||||||
{
|
// {
|
||||||
uint x = 0, y = 0;
|
// uint x = 0, y = 0;
|
||||||
long handle = 0;
|
// long handle = 0;
|
||||||
if (r.RegionSecret != null && r.RegionSecret != string.Empty)
|
// if (r.RegionSecret != null && r.RegionSecret != string.Empty)
|
||||||
{
|
// {
|
||||||
if (long.TryParse(r.RegionSecret, out handle))
|
// if (long.TryParse(r.RegionSecret, out handle))
|
||||||
{
|
// {
|
||||||
Utils.LongToUInts((ulong)handle, out x, out y);
|
// Utils.LongToUInts((ulong)handle, out x, out y);
|
||||||
x = x / Constants.RegionSize;
|
// x = x / Constants.RegionSize;
|
||||||
y = y / Constants.RegionSize;
|
// y = y / Constants.RegionSize;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (handle == 0 ||
|
// if (handle == 0 ||
|
||||||
// Check the distance from the current region
|
// // Check the distance from the current region
|
||||||
(handle != 0 && Math.Abs((int)(x - m_scene.RegionInfo.RegionLocX)) < 4096 && Math.Abs((int)(y - m_scene.RegionInfo.RegionLocY)) < 4096))
|
// (handle != 0 && Math.Abs((int)(x - m_scene.RegionInfo.RegionLocX)) < 4096 && Math.Abs((int)(y - m_scene.RegionInfo.RegionLocY)) < 4096))
|
||||||
{
|
// {
|
||||||
MapBlockData block = new MapBlockData();
|
// MapBlockData block = new MapBlockData();
|
||||||
MapBlockFromGridRegion(block, r);
|
// MapBlockFromGridRegion(block, r);
|
||||||
mapBlocks.Add(block);
|
// mapBlocks.Add(block);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Different from super
|
// // Different from super
|
||||||
FillInMap(mapBlocks, minX, minY, maxX, maxY);
|
// //FillInMap(mapBlocks, minX, minY, maxX, maxY);
|
||||||
//
|
// //
|
||||||
|
|
||||||
remoteClient.SendMapBlock(mapBlocks, 0);
|
// remoteClient.SendMapBlock(mapBlocks, 0);
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
private void FillInMap(List<MapBlockData> mapBlocks, int minX, int minY, int maxX, int maxY)
|
private void FillInMap(List<MapBlockData> mapBlocks, int minX, int minY, int maxX, int maxY)
|
||||||
|
|
Loading…
Reference in New Issue