Added immediate TP failure message for TPs to regions that aren't there,
instead of the 130s timeout somewhere. Additionally, mark the map-tile as offline. This partly fixes the TP problems of Mantis 2332; the rest is a viewer problem (just relogin).0.6.0-stable
parent
979a354ba0
commit
63d7a92fb4
|
@ -248,9 +248,43 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
public virtual void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
public virtual void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
||||||
{
|
{
|
||||||
List<MapBlockData> mapBlocks;
|
List<MapBlockData> mapBlocks;
|
||||||
mapBlocks = m_scene.SceneGridService.RequestNeighbourMapBlocks(minX - 4, minY - 4, minX + 4, minY + 4);
|
if ((flag & 0x10000) != 0) // user clicked on the map a tile that isn't visible
|
||||||
|
{
|
||||||
|
List<MapBlockData> response = new List<MapBlockData>();
|
||||||
|
|
||||||
|
// this should return one mapblock at most. But make sure: Look whether the one we requested is in there
|
||||||
|
mapBlocks = m_scene.SceneGridService.RequestNeighbourMapBlocks(minX, minY, maxX, maxY);
|
||||||
|
if (mapBlocks != null)
|
||||||
|
{
|
||||||
|
foreach (MapBlockData block in mapBlocks)
|
||||||
|
{
|
||||||
|
if (block.X == minX && block.Y == minY)
|
||||||
|
{
|
||||||
|
// found it => add it to response
|
||||||
|
response.Add(block);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.Count == 0)
|
||||||
|
{
|
||||||
|
// response still empty => couldn't find the map-tile the user clicked on => tell the client
|
||||||
|
MapBlockData block = new MapBlockData();
|
||||||
|
block.X = (ushort)minX;
|
||||||
|
block.Y = (ushort)minY;
|
||||||
|
block.Access = 254; // == not there
|
||||||
|
response.Add(block);
|
||||||
|
}
|
||||||
|
remoteClient.SendMapBlock(response, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// normal mapblock request. Use the provided values
|
||||||
|
mapBlocks = m_scene.SceneGridService.RequestNeighbourMapBlocks(minX - 4, minY - 4, maxX + 4, maxY + 4);
|
||||||
remoteClient.SendMapBlock(mapBlocks, flag);
|
remoteClient.SendMapBlock(mapBlocks, flag);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Hashtable OnHTTPGetMapImage(Hashtable keysvals)
|
public Hashtable OnHTTPGetMapImage(Hashtable keysvals)
|
||||||
{
|
{
|
||||||
|
|
|
@ -736,6 +736,25 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down");
|
avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TP to a place that doesn't exist (anymore)
|
||||||
|
// Inform the viewer about that
|
||||||
|
avatar.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore");
|
||||||
|
|
||||||
|
// and set the map-tile to '(Offline)'
|
||||||
|
uint regX, regY;
|
||||||
|
Helpers.LongToUInts(regionHandle, out regX, out regY);
|
||||||
|
|
||||||
|
MapBlockData block = new MapBlockData();
|
||||||
|
block.X = (ushort)(regX / Constants.RegionSize);
|
||||||
|
block.Y = (ushort)(regY / Constants.RegionSize);
|
||||||
|
block.Access = 254; // == not there
|
||||||
|
|
||||||
|
List<MapBlockData> blocks = new List<MapBlockData>();
|
||||||
|
blocks.Add(block);
|
||||||
|
avatar.ControllingClient.SendMapBlock(blocks, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue