コード例 #1
0
ファイル: Chunks.cs プロジェクト: dzamkov/MineViewer
        private static void Call()
        {
            int bx = SMPInterface.SwapByteOrder(SMPInterface.Reader.ReadInt32());
            int bz = SMPInterface.SwapByteOrder(SMPInterface.Reader.ReadInt32());

            MinecraftLevel.Chunk c;
            MinecraftLevel.Chunk ct;
            Cubia.Point<int> p = new Cubia.Point<int>(bx,bz);
            if (!SMPInterface.Chunks.TryGetValue(p, out c))
            {
                c = MinecraftLevel.Chunk.EmptyChunk();
                SMPInterface.Chunks.Add(p, c);
            }
            if (!SMPInterface.TransChunks.TryGetValue(p, out ct))
            {
                ct = MinecraftLevel.Chunk.EmptyChunk();
                ct.Trans = true;
                SMPInterface.TransChunks.Add(p, ct);
            }

            short arraysize = SMPInterface.SwapByteOrder(SMPInterface.Reader.ReadInt16());

            LinkedList<Cubia.Vector<int>> vec = new LinkedList<Cubia.Vector<int>>();
            byte[] blocks = new byte[arraysize];

            for (int i = 0; i < arraysize; i++)
            {
                MapChunkReader r = new MapChunkReader(SMPInterface.Reader.ReadBytes(2)); // 2 for coords, 1 for type
                byte x = (byte)r.Read(4);
                byte z = (byte)r.Read(4);
                byte y = (byte)r.Read(8);
                vec.AddLast(new Cubia.Vector<int>(x, y, z));
            }

            for (int i = 0; i < arraysize; i++)
                blocks[i] = SMPInterface.Reader.ReadByte();

            SMPInterface.Reader.ReadBytes(arraysize); // discard metadata

            for (int t = 0; t < arraysize; t++)
            {
                MinecraftBlock block = new MinecraftBlock()
                {
                    BlockLight = 0,
                    SkyLight = 0,
                    Type = blocks[t]
                };
                if (GCScheme.IsTrans(blocks[t]))
                    ct.UpdateBlock(vec.ElementAt<Cubia.Vector<int>>(t), block);
                else
                    c.UpdateBlock(vec.ElementAt<Cubia.Vector<int>>(t), block);
            }
        }
コード例 #2
0
ファイル: Chunks.cs プロジェクト: dzamkov/MineViewer
        private static void ProccesChunk(byte[] data, int x, short y, int z, byte sizex, byte sizey, byte sizez)
        {
            MapChunkReader r = new MapChunkReader(data);

            int ChunkPosX = x / MinecraftLevel.ChunkXSize;
            int ChunkPosY = y / MinecraftLevel.ChunkYSize;
            int ChunkPosZ = z / MinecraftLevel.ChunkZSize;

            int cx = (ChunkPosX * MinecraftLevel.ChunkXSize);
            int cy = (ChunkPosY * MinecraftLevel.ChunkYSize);
            int cz = (ChunkPosZ * MinecraftLevel.ChunkZSize);

            MinecraftLevel.Chunk c;
            Cubia.Point<int> p = new Cubia.Point<int>(ChunkPosX, ChunkPosZ);
            if (!SMPInterface.Chunks.TryGetValue(p, out c))
            {
                c = MinecraftLevel.Chunk.EmptyChunk();
                SMPInterface.Chunks.Add(p, c);
            }
            MinecraftLevel.Chunk ct;
            if (!SMPInterface.TransChunks.TryGetValue(p, out ct))
            {
                ct = MinecraftLevel.Chunk.EmptyChunk();
                ct.Trans = true;
                SMPInterface.TransChunks.Add(p, ct);
            }

            for (int ix = x; ix < x + sizex + 1; ix++)
                for (int iz = z; iz < z + sizez + 1; iz++)
                    for (int iy = y; iy < y + sizey + 1; iy++)
                    {
                        int rx = mod((ix - cx), MinecraftLevel.ChunkXSize); // fixes the negatives
                        int ry = mod((iy - cy), MinecraftLevel.ChunkYSize);
                        int rz = mod((iz - cz), MinecraftLevel.ChunkZSize);

                        Cubia.Vector<int> vec = new Cubia.Vector<int>(rx, ry, rz);
                        byte bType = (byte)r.Read(8); // 8 bits in byte
                        MinecraftBlock block = new MinecraftBlock()
                        {
                            BlockLight = 0,
                            SkyLight = 0,
                            Type = bType
                        };
                        if (GCScheme.IsTrans(bType))
                            ct.UpdateBlock(vec, block);
                        else
                            c.UpdateBlock(vec, block);
                    }
        }