Exemple #1
0
        public GeoRegion(int regionX, int regionY, GeoReader reader, bool l2j, string file)
        {
            _file          = file;
            _regionX       = regionX;
            _regionY       = regionY;
            _minGeoX       = GeoEngine.getGeoXY(regionX, 0);
            _maxGeoX       = GeoEngine.getGeoXY(regionX, GeoEngine.GEO_REGION_SIZE - 1);
            _minGeoY       = GeoEngine.getGeoXY(regionY, 0);
            _maxGeoY       = GeoEngine.getGeoXY(regionY, GeoEngine.GEO_REGION_SIZE - 1);
            _geoBlocks     = new GeoBlock[GeoEngine.GEO_REGION_SIZE, GeoEngine.GEO_REGION_SIZE];
            _geoBlocksData = new GeoByteBuffer[GeoEngine.GEO_REGION_SIZE, GeoEngine.GEO_REGION_SIZE];
            //
            GeoBlock      block;
            GeoByteBuffer writer;

            for (int blockX = 0, blockY; blockX < GeoEngine.GEO_REGION_SIZE; blockX++)
            {
                for (blockY = 0; blockY < GeoEngine.GEO_REGION_SIZE; blockY++)
                {
                    block = readBlock(blockX, blockY, reader, l2j);
                    _geoBlocks[blockX, blockY] = block;
                    writer = GeoByteBuffer.allocate(block.getRequiredCapacity(true));
                    block.writeTo(writer, true);
                    _geoBlocksData[blockX, blockY] = writer;
                }
            }
        }
 public void reloadGeo(int regionX, int regionY, bool l2j, string file)
 {
     if (file == null || !File.Exists(file))
     {
         throw new GeoFileNotFoundException(file, l2j);
     }
     if (_activeRegion != null)
     {
         throw new Exception("Geo must be unloaded first");
     }
     //
     try {
         using (FileStream stream = File.Open(file, FileMode.Open, FileAccess.Read)) {
             GeoReader reader = GeoStreamReader.wrap(stream);
             //
             if (!l2j)
             {
                 for (int i = 18; i-- > 0;)
                 {
                     reader.get();
                 }
             }
             _activeRegion = new GeoRegion(regionX, regionY, reader, l2j, file);
         }
     }
     catch (Exception e) {
         Console.WriteLine(e);
         throw new GeoFileLoadException(file, l2j, e);
     }
 }
 public override bool dataEquals(GeoReader reader)
 {
     if (getType() != GeoRegion.getType(reader, true))
     {
         return(false);
     }
     //
     GeoCell[] cells1D;
     for (int cellX = 0, cellY, layer; cellX < GeoEngine.GEO_BLOCK_SHIFT; cellX++)
     {
         for (cellY = 0; cellY < GeoEngine.GEO_BLOCK_SHIFT; cellY++)
         {
             cells1D = _cells3D[cellX, cellY];
             //
             if (cells1D.Length != reader.get())
             {
                 return(false);
             }
             //
             for (layer = cells1D.Length; layer-- > 0;)
             {
                 if (cells1D[layer].getHeightAndNSWE() != reader.getShort())
                 {
                     return(false);
                 }
             }
         }
     }
     return(true);
 }
        //=============================

        public GeoBlockMultiLayer(GeoReader reader, int geoX, int geoY, bool l2j) : base(geoX, geoY)
        {
            _cells3D = new GeoCell[GeoEngine.GEO_BLOCK_SHIFT, GeoEngine.GEO_BLOCK_SHIFT][];
            //
            int layers, count = 0;

            for (int x = 0; x < GeoEngine.GEO_BLOCK_SHIFT; x++)
            {
                for (int y = 0; y < GeoEngine.GEO_BLOCK_SHIFT; y++)
                {
                    layers = l2j ? reader.get() : reader.getShort();
                    if (!GeoEngine.layersValid(layers))
                    {
                        throw new Exception("Invalid layer count " + layers);
                    }
                    //
                    count         += layers;
                    _cells3D[x, y] = new GeoCell[layers];
                    for (int i = layers; i-- > 0;)
                    {
                        _cells3D[x, y][i] = new GeoCellCM(this, reader.getShort(), x, y);
                    }
                    //Util.quickSort(_cells3D[x,y], HeightComparator.Compare);
                }
            }
            //
            copyCells(count);
            calcMaxMinHeight();
        }
Exemple #5
0
 public GeoBlockFlat(GeoReader reader, int geoX, int geoY, bool l2j) : base(geoX, geoY)
 {
     _cells = new GeoCell[] { new GeoCellFlat(this, reader.getShort()) };
     //
     if (!l2j)
     {
         reader.getShort();
     }
 }
Exemple #6
0
 public override bool dataEquals(GeoReader reader)
 {
     if (getType() != GeoRegion.getType(reader, true))
     {
         return(false);
     }
     if (_cells[0].getHeight() != reader.getShort())
     {
         return(false);
     }
     return(true);
 }
Exemple #7
0
        //=============================

        public GeoBlockComplex(GeoReader reader, int geoX, int geoY, bool l2j) : base(geoX, geoY)
        {
            _cells = new GeoCell[GeoEngine.GEO_BLOCK_SHIFT * GeoEngine.GEO_BLOCK_SHIFT];
            for (int x = 0, y; x < GeoEngine.GEO_BLOCK_SHIFT; x++)
            {
                for (y = 0; y < GeoEngine.GEO_BLOCK_SHIFT; y++)
                {
                    _cells[indexOf(x, y)] = new GeoCellCM(this, reader.getShort(), x, y);
                }
            }
            calcMaxMinHeight();
        }
Exemple #8
0
        public static byte getType(GeoReader reader, bool l2j)
        {
            if (l2j)
            {
                return(reader.get());
            }
            switch (reader.getShort())
            {
            case 0x0000: return(GeoEngine.GEO_BLOCK_TYPE_FLAT);

            case 0x0040: return(GeoEngine.GEO_BLOCK_TYPE_COMPLEX);

            default: return(GeoEngine.GEO_BLOCK_TYPE_MULTILAYER);
            }
        }
Exemple #9
0
 public override bool dataEquals(GeoReader reader)
 {
     if (getType() != GeoRegion.getType(reader, true))
     {
         return(false);
     }
     //
     for (int x = 0, y; x < GeoEngine.GEO_BLOCK_SHIFT; x++)
     {
         for (y = 0; y < GeoEngine.GEO_BLOCK_SHIFT; y++)
         {
             if (_cells[indexOf(x, y)].getHeightAndNSWE() != reader.getShort())
             {
                 return(false);
             }
         }
     }
     return(true);
 }
Exemple #10
0
        private GeoBlock readBlock(int blockX, int blockY, GeoReader reader, bool l2j)
        {
            int geoX = GeoEngine.getGeoXY(_regionX, blockX);
            int geoY = GeoEngine.getGeoXY(_regionY, blockY);
            int type = getType(reader, l2j);

            switch (type)
            {
            case GeoEngine.GEO_BLOCK_TYPE_FLAT:
                return(new GeoBlockFlat(reader, geoX, geoY, l2j).setRegion(this));

            case GeoEngine.GEO_BLOCK_TYPE_COMPLEX:
                return(new GeoBlockComplex(reader, geoX, geoY, l2j).setRegion(this));

            case GeoEngine.GEO_BLOCK_TYPE_MULTILAYER:
                return(new GeoBlockMultiLayer(reader, geoX, geoY, l2j).setRegion(this));

            default:
                throw new ArgumentException("Unknown type: " + type);
            }
        }
Exemple #11
0
 public abstract bool dataEquals(GeoReader reader);