public virtual void Teleport(IScenePresence sp, ulong regionHandle, Vector3 position, Vector3 lookAt,
            uint teleportFlags)
        {
            int x = 0, y = 0;
            Util.UlongToInts(regionHandle, out x, out y);

            GridRegion reg = sp.Scene.GridService.GetRegionByPosition(sp.ControllingClient.AllScopeIDs, x, y);

            if (reg == null)
            {
                List<GridRegion> regions = sp.Scene.GridService.GetRegionRange(sp.ControllingClient.AllScopeIDs,
                                                                               x -
                                                                               (sp.Scene.GridService.GetRegionViewSize()*
                                                                                sp.Scene.RegionInfo.RegionSizeX),
                                                                               x +
                                                                               (sp.Scene.GridService.GetRegionViewSize()*
                                                                                sp.Scene.RegionInfo.RegionSizeX),
                                                                               y -
                                                                               (sp.Scene.GridService.GetRegionViewSize()*
                                                                                sp.Scene.RegionInfo.RegionSizeY),
                                                                               y +
                                                                               (sp.Scene.GridService.GetRegionViewSize()*
                                                                                sp.Scene.RegionInfo.RegionSizeY));
                foreach (GridRegion r in regions)
                {
                    if (r.RegionLocX <= x && r.RegionLocX + r.RegionSizeX > x &&
                        r.RegionLocY <= y && r.RegionLocY + r.RegionSizeY > y)
                    {
                        reg = r;
                        position.X += x - reg.RegionLocX;
                        position.Y += y - reg.RegionLocY;
                        break;
                    }
                }
                if (reg == null)
                {
                    // TP to a place that doesn't exist (anymore)
                    // Inform the viewer about that
                    sp.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore");

                    // and set the map-tile to '(Offline)'
                    int regX, regY;
                    Util.UlongToInts(regionHandle, out regX, out regY);

                    MapBlockData block = new MapBlockData
                                             {
                                                 X = (ushort) (regX/Constants.RegionSize),
                                                 Y = (ushort) (regY/Constants.RegionSize),
                                                 Access = 254
                                             };
                    // == not there

                    List<MapBlockData> blocks = new List<MapBlockData> {block};
                    sp.ControllingClient.SendMapBlock(blocks, 0);
                    return;
                }
            }
            Teleport(sp, reg, position, lookAt, teleportFlags);
        }
 protected MapBlockData MapBlockFromGridRegion(GridRegion r, int flag)
 {
     MapBlockData block = new MapBlockData();
     if (r == null)
     {
         block.Access = (byte) SimAccess.Down;
         block.MapImageID = UUID.Zero;
         return block;
     }
     block.Access = r.Access;
     if ((flag & 0xffff) == 0)
         block.MapImageID = r.TerrainImage;
     if ((flag & 0xffff) == 1)
         block.MapImageID = r.TerrainMapImage;
     if ((flag & 0xffff) == 2)
         block.MapImageID = r.ParcelMapImage;
     block.Name = r.RegionName;
     block.X = (ushort) (r.RegionLocX/Constants.RegionSize);
     block.Y = (ushort) (r.RegionLocY/Constants.RegionSize);
     block.SizeX = (ushort) (r.RegionSizeX);
     block.SizeY = (ushort) (r.RegionSizeY);
     return block;
 }
 protected MapBlockData TerrainBlockFromGridRegion (GridRegion region)
 {
     MapBlockData block = new MapBlockData ();
     if (region == null) {
         block.Access = (byte)SimAccess.Down;
         block.MapImageID = UUID.Zero;
         return block;
     }
     block.Access = region.Access;
     block.MapImageID = region.TerrainMapImage;
     if ((region.Flags & (int)RegionFlags.RegionOnline) !=
         (int)RegionFlags.RegionOnline)
         block.Name = region.RegionName + " (offline)";
     else
         block.Name = region.RegionName;
     block.X = (ushort)(region.RegionLocX / Constants.RegionSize);
     block.Y = (ushort)(region.RegionLocY / Constants.RegionSize);
     block.SizeX = (ushort)region.RegionSizeX;
     block.SizeY = (ushort)region.RegionSizeY;
     return block;
 }
        void OnMapNameRequest (IClientAPI remoteClient, string mapName, uint flags)
        {
            if (mapName.Length < 1) {
                remoteClient.SendAlertMessage ("Use a search string with at least 1 character");
                return;
            }

            bool TryCoordsSearch = false;
            int XCoord = 0;
            int YCoord = 0;

            string [] splitSearch = mapName.Split (',');
            if (splitSearch.Length != 1) {
                if (splitSearch [1].StartsWith (" ", StringComparison.Ordinal))
                    splitSearch [1] = splitSearch [1].Remove (0, 1);
                if (int.TryParse (splitSearch [0], out XCoord) && int.TryParse (splitSearch [1], out YCoord))
                    TryCoordsSearch = true;
            }

            List<MapBlockData> blocks = new List<MapBlockData> ();

            List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName (remoteClient.AllScopeIDs, mapName, 0, 20);
            if (TryCoordsSearch) {
                GridRegion region = m_scene.GridService.GetRegionByPosition (
                    remoteClient.AllScopeIDs,
                    XCoord * Constants.RegionSize,
                    YCoord * Constants.RegionSize
                );

                if (region != null) {
                    region.RegionName = mapName + " - " + region.RegionName;
                    regionInfos.Add (region);
                }
            }

            List<GridRegion> allRegions = new List<GridRegion> ();
            if (regionInfos != null) {
                foreach (GridRegion region in regionInfos) {
                    //Add the found in search region first
                    if (!allRegions.Contains (region)) {
                        allRegions.Add (region);
                        blocks.Add (SearchMapBlockFromGridRegion (region));
                    }
                    //Then send surrounding regions
                    List<GridRegion> nearRegions = m_scene.GridService.GetRegionRange (
                        remoteClient.AllScopeIDs,
                        (region.RegionLocX - (4 * Constants.RegionSize)),
                        (region.RegionLocX + (4 * Constants.RegionSize)),
                        (region.RegionLocY - (4 * Constants.RegionSize)),
                        (region.RegionLocY + (4 * Constants.RegionSize))
                    );

                    if (nearRegions != null) {
                        foreach (GridRegion nRegion in nearRegions) {
                            if (!allRegions.Contains (nRegion)) {
                                allRegions.Add (nRegion);
                                blocks.Add (SearchMapBlockFromGridRegion (nRegion));
                            }
                        }
                    }
                }
            }

            // final block, closing the search result
            MapBlockData data = new MapBlockData {
                Agents = 0,
                Access = 255,
                MapImageID = UUID.Zero,
                Name = mapName,
                RegionFlags = 0,
                WaterHeight = 0,
                X = 0,
                Y = 0,
                SizeX = 256,
                SizeY = 256
            };
            // not used
            blocks.Add (data);

            remoteClient.SendMapBlock (blocks, flags);
        }
 protected List<MapBlockData> Map2BlockFromGridRegion (GridRegion r)
 {
     List<MapBlockData> blocks = new List<MapBlockData> ();
     MapBlockData block = new MapBlockData ();
     if (r == null) {
         block.Access = (byte)SimAccess.Down;
         block.MapImageID = UUID.Zero;
         blocks.Add (block);
         return blocks;
     }
     if ((r.Flags & (int)RegionFlags.RegionOnline) ==
         (int)RegionFlags.RegionOnline)
         block.Access = r.Access;
     else
         block.Access = (byte)SimAccess.Down;
     block.MapImageID = r.TerrainImage;
     block.Name = r.RegionName;
     block.X = (ushort)(r.RegionLocX / Constants.RegionSize);
     block.Y = (ushort)(r.RegionLocY / Constants.RegionSize);
     block.SizeX = (ushort)r.RegionSizeX;
     block.SizeY = (ushort)r.RegionSizeY;
     blocks.Add (block);
     if (r.RegionSizeX > Constants.RegionSize || r.RegionSizeY > Constants.RegionSize) {
         for (int x = 0; x < r.RegionSizeX / Constants.RegionSize; x++) {
             for (int y = 0; y < r.RegionSizeY / Constants.RegionSize; y++) {
                 if (x == 0 && y == 0)
                     continue;
                 block = new MapBlockData {
                     Access = r.Access,
                     MapImageID = r.TerrainImage,
                     Name = r.RegionName,
                     X = (ushort)((r.RegionLocX / Constants.RegionSize) + x),
                     Y = (ushort)((r.RegionLocY / Constants.RegionSize) + y),
                     SizeX = (ushort)r.RegionSizeX,
                     SizeY = (ushort)r.RegionSizeY
                 };
                 //Child piece, so ignore it
                 blocks.Add (block);
             }
         }
     }
     return blocks;
 }
        protected MapBlockData MapBlockFromGridRegion (GridRegion r, int x, int y)
        {
            MapBlockData block = new MapBlockData ();
            if (r == null) {
                block.Access = (byte)SimAccess.NonExistent;
                block.X = (ushort)x;
                block.Y = (ushort)y;
                block.MapImageID = UUID.Zero;
                return block;
            }
            if ((r.Flags & (int)RegionFlags.RegionOnline) ==
                (int)RegionFlags.RegionOnline)
                block.Access = r.Access;
            else
                block.Access = (byte)SimAccess.Down;
            block.MapImageID = r.TerrainImage;
            block.Name = r.RegionName;
            block.X = (ushort)(r.RegionLocX / Constants.RegionSize);
            block.Y = (ushort)(r.RegionLocY / Constants.RegionSize);
            block.SizeX = (ushort)r.RegionSizeX;
            block.SizeY = (ushort)r.RegionSizeY;

            return block;
        }