Пример #1
0
        public void Write(int x, short y, int z, NbtNode node)
        {
            lock (this)
            {
                NbtWriter    writer = new NbtWriter();
                MemoryStream stream = new MemoryStream();
                writer.WriteFile(stream, node);
                byte[] buffer = Compress(stream.ToArray());
                _sizes.Add(buffer.Length);
                int usedSectors = ((buffer.Length + 5) % _sectorSize) == 0
                                      ? (buffer.Length + 5) / _sectorSize
                                      : (buffer.Length + 5) / _sectorSize + 1;
                MoveToHeaderPosition(x, y, z);
                _filePointer.Write(0);

                int sectorPostion = FindFreeSector(usedSectors);
                int sector        = (sectorPostion << 9) | usedSectors;

                MoveToHeaderPosition(x, y, z);

                _filePointer.Write(sector);

                _filePointer.Seek(_headerSize + sectorPostion * _sectorSize, SeekOrigin.Begin);
                _filePointer.Write(buffer.Length);
                _filePointer.Write((byte)2);  //Zlib Compression
                _filePointer.Write(buffer);
                _filePointer.Flush();
            }
        }
        public void Write(int x, int z, NbtNode node)
        {
            lock (this)
            {
                NbtWriter    writer = new NbtWriter();
                MemoryStream stream = new MemoryStream();
                writer.WriteFile(stream, node);
                byte[] buffer      = Compress(stream.ToArray());
                int    usedSectors = ((buffer.Length + 5) % 4096) == 0
                                      ? (buffer.Length + 5) / 4096
                                      : (buffer.Length + 5) / 4096 + 1;
                MoveToHeaderPosition(x, z);
                _filePointer.Write(0);

                int sectorPostion = FindFreeSector(usedSectors);
                Console.WriteLine("Saving chunk {0},{1} at position {2}.", x, z, sectorPostion);
                int sector = (sectorPostion << 8) | usedSectors;

                MoveToHeaderPosition(x, z);

                _filePointer.Write(sector);

                _filePointer.Seek(sectorPostion * 4096, SeekOrigin.Begin);
                _filePointer.Write(buffer.Length);
                _filePointer.Write((byte)1);  //GZip Compression
                _filePointer.Write(buffer);
                _filePointer.Flush();
            }
        }
Пример #3
0
 public override void Write(BigEndianStream s, bool inclHeader = true)
 {
     if (inclHeader)
     {
         s.WriteByte(StartByte);
         s.WriteByte(TLVChannelByte);
     }
     s.Write(Flags);
     s.Write(MessageFamily);
     s.Write(MessageType);
     s.Write(SequenceNumber);
     BlockSize = 0;
     if (Block != null)
     {
         foreach (TLV t in Block)
         {
             BlockSize += t.GetSize();
         }
     }
     s.Write(BlockSize);
     if (Block != null)
     {
         foreach (TLV t in Block)
         {
             t.Write(s);
         }
     }
 }
Пример #4
0
        internal void Write(BigEndianStream stream)
        {
            stream.Write(Type > 0 ? Type : (short)-1);
            if (Type > 0)
            {
                stream.Write(Count);
                stream.Write(Durability);

                if (Durability > 0 || IsEnchantable())
                {
                    stream.Write((short)-1);
                }
                // TODO: Remove the two lines above and implement items and enchantments write

                /*
                 * if (Item.CanBeDamaged())
                 * {
                 *      if(_enchantments != null)
                 *          WriteEnchantmentsToNBT(stream);
                 *      else
                 *          stream.Write(-1);
                 * }
                 */
            }
        }
Пример #5
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write(Type);
     stream.Write((int)(X * 32));
     stream.Write((int)(Y * 32));
     stream.Write((int)(Z * 32));
 }
Пример #6
0
 internal virtual void Write(BigEndianStream stream)
 {
     stream.Write(Type > 0 ? Type : (short)-1);
     if (Type > 0)
     {
         stream.Write(Count);
         stream.Write(Durability);
     }
 }
Пример #7
0
 private void CreateRegionFile(Stream stream, short sectorSize = 128)
 {
     BigEndianStream endianStream = new BigEndianStream(stream);
     {
         endianStream.Write(sectorSize);
         endianStream.Write(new byte[32 * 32 * 16 * 4], 0, 32 * 32 * 16 * 4); // Write Empty Header
         endianStream.Flush();
         stream.Seek(0, SeekOrigin.Begin);
     }
 }
Пример #8
0
 public void Write(BigEndianStream s)
 {
     s.Write(TLVType);
     if (Is32)
     {
         s.Write(Length);
     }
     else
     {
         s.Write((ushort)Length);
     }
     s.Write(Value, 0, Value.Length);
 }
Пример #9
0
        public override void Write(BigEndianStream stream)
        {
            stream.Write(X);
            stream.Write(Y);
            stream.Write(Z);
            stream.Write(SizeX);
            stream.Write(SizeY);
            stream.Write(SizeZ);

            int o = 16 * 16 * 128;
            byte[] data = new byte[o * 5 / 2];

            int i = 0;
            for (int x = 0; x < 16; x++)
            {
                for (int z = 0; z < 16; z++)
                {
                    for (int y = 0; y < 128; y++)
                    {
                        int s = ((i + 1) & 1) * 4;
                        int ofst = i;
                        data[ofst] = Chunk[x, y, z];
                        ofst = i / 2 + o * 2 / 2;
                        data[ofst] = unchecked((byte)(data[ofst] | (Chunk.GetData(x, y, z) << s)));
                        ofst = i / 2 + o * 3 / 2;
                        data[ofst] = unchecked((byte)(data[ofst] | (Chunk.GetBlockLight(x, y, z) << s)));
                        ofst = i / 2 + o * 4 / 2;
                        data[ofst] = unchecked((byte)(data[ofst] | (Chunk.GetSkyLight(x, y, z) << s)));
                        i++;
                    }
                }
            }

            byte[] comp = new byte[o * 5];
            int len;

            Deflater deflater = new Deflater(0);
            try
            {
                deflater.setInput(data);
                deflater.finish();
                len = deflater.deflate(comp);
            }
            finally
            {
                deflater.end();
            }

            stream.Write(len);
            stream.Write(comp, 0, len);
        }
Пример #10
0
        private void WriteRaw(BigEndianStream zipped, byte tagId, object tag)
        {
            switch (tagId)
            {
            case 1:
                zipped.Write((byte)tag);
                break;

            case 2:
                zipped.Write((short)tag);
                break;

            case 3:
                zipped.Write((int)tag);
                break;

            case 4:
                zipped.Write((long)tag);
                break;

            case 5:
                zipped.Write((float)tag);
                break;

            case 6:
                zipped.Write((double)tag);
                break;

            case 10:
                NbtCompound subNodes;

                if (tag is NbtCompound)
                {
                    subNodes = (NbtCompound)tag;
                }
                else
                {
                    subNodes = new NbtCompound {
                        Childs = (List <NbtNode>)tag
                    }
                };
                foreach (var nbtNode in subNodes.Childs)
                {
                    WriteNode(zipped, nbtNode);
                }
                WriteNode(zipped, new NbtStop());
                break;
            }
        }
Пример #11
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(World);
     stream.Write(Unknown);
     stream.Write(CreativeMode);
     stream.Write(WorldHeight);
     stream.Write(MapSeed);
 }
Пример #12
0
        private void WriteNode(BigEndianStream zipped, NbtNode node)
        {
            zipped.Write(node.Type);
            if (node.Type == 0)
            {
                return;
            }
            zipped.Write8(node.Name);
            switch (node.Type)
            {
            case 1:
                zipped.Write(((NbtByte)node).Value);
                break;

            case 2:
                zipped.Write(((NbtShort)node).Value);
                break;

            case 3:
                zipped.Write(((NbtInt)node).Value);
                break;

            case 4:
                zipped.Write(((NbtLong)node).Value);
                break;

            case 5:
                zipped.Write(((NbtFloat)node).Value);
                break;

            case 6:
                zipped.Write(((NbtDouble)node).Value);
                break;

            case 7:
                zipped.Write(((NbtBytes)node).Value.Length);
                zipped.Write(((NbtBytes)node).Value);
                break;

            case 8:
                zipped.Write8(((NbtString)node).Value);
                break;

            case 9:
                var list = (NbtList)node;
                zipped.Write(list.TagId);
                zipped.Write(list.Childs.Count);
                foreach (var child in list.Childs)
                {
                    WriteRaw(zipped, list.TagId, child);
                }
                break;

            case 10:
                var compount = (NbtCompound)node;
                foreach (var item in compount.Childs)
                {
                    WriteNode(zipped, item);
                }
                WriteNode(zipped, new NbtStop());
                break;

            case 11:
                zipped.Write(((NbtInts)node).Value.Length);
                zipped.Write(IntToByteArray(((NbtInts)node).Value));
                break;
            }
        }
Пример #13
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write(Title);
     stream.Write(X);
     stream.Write(Y);
     stream.Write(Z);
     stream.Write(GraphicId);
 }
Пример #14
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write(Yaw);
     stream.Write(Pitch);
 }
Пример #15
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write((byte)Effect);
     stream.Write(Amplifier);
     stream.Write(Duration);
 }
Пример #16
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(Reason);
 }
Пример #17
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(WindowId);
 }
Пример #18
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(Sink1);
     stream.Write(Sink2);
     stream.Write(Sink3);
     stream.Write(Sink4);
     stream.Write(Sink5);
     stream.Write(Sink6);
 }
Пример #19
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(WindowId);
     stream.Write(Transaction);
     stream.Write(Accepted);
 }
Пример #20
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(Time);
 }
Пример #21
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write(Unknown);
     stream.Write(X);
     stream.Write(Y);
     stream.Write(Z);
 }
Пример #22
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write(ItemId);
     stream.Write(Count);
     stream.Write(Durability);
     stream.Write((int)(X * 32));
     stream.Write((int)(Y * 32));
     stream.Write((int)(Z * 32));
     stream.Write(Yaw);
     stream.Write(Pitch);
     stream.Write(Roll);
 }
Пример #23
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write((int)EffectID);
     stream.Write(X);
     stream.Write(Y);
     stream.Write(Z);
     stream.Write((int)SoundData);
 }
Пример #24
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(WindowId);
     stream.Write(Slot);
     (Item ?? ItemStack.Void).Write(stream);
 }
Пример #25
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(X);
     stream.Write(Y);
     stream.Write(Z);
     stream.Write(Type);
     stream.Write(Data);
 }
Пример #26
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(Message);
 }
Пример #27
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(Health);
     stream.Write(Food);
     stream.Write(FoodSaturation);
 }
Пример #28
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(Slot);
     stream.Write(ItemID);
     stream.Write(Quantity);
     stream.Write(Damage);
 }
Пример #29
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(X);
     stream.Write(Y);
     stream.Write(Z);
     for (int i = 0; i < Lines.Length; i++)
         stream.Write(Lines[i]);
 }
Пример #30
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(PlayerId);
     stream.Write((sbyte)Action);
 }
Пример #31
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(PlayerId);
     stream.Write(InBed);
     stream.Write(X);
     stream.Write(Y);
     stream.Write(Z);
 }
Пример #32
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write(Slot);
     stream.Write(ItemId);
     stream.Write(Durability);
 }
Пример #33
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(User);
     stream.Write(Target);
     stream.Write(LeftClick);
 }
Пример #34
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write(Data);
 }
Пример #35
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(WindowId);
     stream.Write(Slot);
     stream.Write(RightClick);
     stream.Write(Transaction);
     stream.Write(Shift);
     (Item ?? ItemStack.Void).Write(stream);
 }
Пример #36
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write(DeltaX);
     stream.Write(DeltaY);
     stream.Write(DeltaZ);
 }
Пример #37
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(WindowId);
     stream.Write((short)Items.Length);
     for (int i = 0; i < Items.Length; i++)
         (Items[i] ?? ItemStack.Void).Write(stream);
 }
Пример #38
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(WindowId);
     stream.Write(ProgressBar);
     stream.Write(Value);
 }
Пример #39
0
 public override void Write(BigEndianStream stream)
 {
     stream.Write(EntityId);
     stream.Write((byte)Effect);
 }