Example #1
0
        private void CreateMiniMapTexture()
        {
            if (_gumpTexture == null || _gumpTexture.IsDisposed)
            {
                return;
            }
            ushort lastX = World.Player.Position.X;
            ushort lastY = World.Player.Position.Y;

            if (_x != lastX || _y != lastY)
            {
                _x = lastX;
                _y = lastY;
            }
            else if (!_forceUpdate)
            {
                return;
            }

            if (_mapTexture != null && !_mapTexture.IsDisposed)
            {
                _mapTexture.Dispose();
            }
            int blockOffsetX = Width / 4;
            int blockOffsetY = Height / 4;
            int gumpCenterX  = Width / 2;
            int gumpCenterY  = Height / 2;

            //0xFF080808 - pixel32
            //0x8421 - pixel16
            int minBlockX = (lastX - blockOffsetX) / 8 - 1;
            int minBlockY = (lastY - blockOffsetY) / 8 - 1;
            int maxBlockX = (lastX + blockOffsetX) / 8 + 1;
            int maxBlockY = (lastY + blockOffsetY) / 8 + 1;

            if (minBlockX < 0)
            {
                minBlockX = 0;
            }

            if (minBlockY < 0)
            {
                minBlockY = 0;
            }
            int maxBlockIndex  = World.Map.MapBlockIndex;
            int mapBlockHeight = IO.Resources.Map.MapBlocksSize[World.MapIndex][1];

            ushort[] data = IO.Resources.Gumps.GetGumpPixels(_useLargeMap ? 5011 : 5010, out _, out _);

            Point[] table = new Point[2]
            {
                new Point(0, 0),
                new Point(0, 1)
            };

            for (int i = minBlockX; i <= maxBlockX; i++)
            {
                int blockIndexOffset = i * mapBlockHeight;

                for (int j = minBlockY; j <= maxBlockY; j++)
                {
                    int blockIndex = blockIndexOffset + j;

                    if (blockIndex >= maxBlockIndex)
                    {
                        break;
                    }
                    RadarMapBlock?mbbv = IO.Resources.Map.GetRadarMapBlock(World.MapIndex, i, j);

                    if (!mbbv.HasValue)
                    {
                        break;
                    }
                    RadarMapBlock mb         = mbbv.Value;
                    MapChunk      mapBlock   = World.Map.Chunks[blockIndex];
                    int           realBlockX = i * 8;
                    int           realBlockY = j * 8;

                    for (int x = 0; x < 8; x++)
                    {
                        int px = realBlockX + x - lastX + gumpCenterX;

                        for (int y = 0; y < 8; y++)
                        {
                            int  py     = realBlockY + y - lastY;
                            int  gx     = px - py;
                            int  gy     = px + py;
                            uint color  = mb.Cells[x, y].Graphic;
                            bool island = mb.Cells[x, y].IsLand;

                            //if (mapBlock != null)
                            //{
                            //    ushort multicolor = mapBlock.get
                            //}

                            if (!island)
                            {
                                color += 0x4000;
                            }
                            int tableSize = 2;
                            color = (uint)(0x8000 | Hues.GetRadarColorData((int)color));
                            CreatePixels(data, (int)color, gx, gy, Width, Height, table, tableSize);
                        }
                    }
                }
            }

            _mapTexture = new SpriteTexture(Width, Height, false);
            _mapTexture.SetData(data);
        }