Example #1
0
 public static void MapChunkBulk(MinecraftClient client, IPacket _packet)
 {
     var packet = (MapChunkBulkPacket)_packet;
     var metadataStrem = new MemoryStream(packet.ChunkMetadata);
     var minecraftStream = new MinecraftStream(metadataStrem);
     var data = ZlibStream.UncompressBuffer(packet.ChunkData);
     int chunkLength = BlockDataLength + (NibbleDataLength * 2) + (Chunk.Width * Chunk.Depth);
     if (packet.LightIncluded)
         chunkLength += NibbleDataLength;
     for (int i = 0; i < packet.ChunkCount; i++)
     {
         int x = minecraftStream.ReadInt32();
         int z = minecraftStream.ReadInt32();
         ushort primaryBitMap = minecraftStream.ReadUInt16();
         ushort addBitMap = minecraftStream.ReadUInt16(); // TODO
         int offset = i * chunkLength;
         // Read chunk data
         var chunk = new Chunk(World.GetRelativeChunkPosition(new Vector3(x, 0, z)));
         var sectionCount = 0;
         // Get the total sections included in the packet
         for (int y = 0; y < 16; y++)
         {
             if ((primaryBitMap & (1 << y)) > 0)
                 sectionCount++;
         }
         // Run through the sections
         // TODO: Support block IDs >255
         for (int y = 0; y < 16; y++)
         {
             if ((primaryBitMap & (1 << y)) > 0)
             {
                 // Add this section
                 Array.Copy(data, offset + (y * BlockDataLength), chunk.Sections[y].Blocks, 0, BlockDataLength);
                 Array.Copy(data, offset + (y * BlockDataLength + (BlockDataLength * sectionCount)),
                     chunk.Sections[y].Metadata.Data, 0, NibbleDataLength);
                 Array.Copy(data, offset + (y * BlockDataLength + (BlockDataLength * sectionCount + NibbleDataLength)),
                     chunk.Sections[y].BlockLight.Data, 0, NibbleDataLength);
                 if (packet.LightIncluded)
                 {
                     Array.Copy(data, offset + (y * BlockDataLength + (BlockDataLength * sectionCount + (NibbleDataLength * 2))),
                         chunk.Sections[y].SkyLight.Data, 0, NibbleDataLength);
                 }
             }
         }
         Array.Copy(data, offset + chunkLength - chunk.Biomes.Length, chunk.Biomes, 0, chunk.Biomes.Length);
         client.World.SetChunk(new Vector3(x, 0, z), chunk);
         client.OnChunkRecieved(new ChunkRecievedEventArgs(new Vector3(x, 0, z), new ReadOnlyChunk(chunk)));
     }
 }
 public void Connect(IPEndPoint endPoint)
 {
     if (Client != null && Client.Connected)
         throw new InvalidOperationException("Already connected to a server!");
     EndPoint = endPoint;
     Client = new TcpClient();
     Client.Connect(EndPoint);
     NetworkStream = Client.GetStream();
     Stream = new MinecraftStream(new BufferedStream(NetworkStream));
     NetworkWorkerThread = new Thread(NetworkWorker);
     NetworkWorkerThread.Start();
     var handshake = new HandshakePacket(PacketReader.ProtocolVersion, Session.Username,
         EndPoint.Address.ToString(), EndPoint.Port);
     SendPacket(handshake);
 }
 public static MetadataDictionary FromStream(MinecraftStream stream)
 {
     var value = new MetadataDictionary();
     byte key = 0;
     while (key != 127)
     {
         key = stream.ReadUInt8();
         if (key == 127) break;
         byte type = (byte)((key & 0xE0) >> 5);
         byte index = (byte)(key & 0x1F);
         var entryType = EntryTypes[type];
         value[index] = (MetadataEntry)Activator.CreateInstance(entryType, index);
         value[index].FromStream(stream);
     }
     return value;
 }
Example #4
0
 public override void WriteTo(MinecraftStream stream)
 {
     stream.WriteUInt8(GetKey());
     stream.WriteInt16(Value.Id);
     if (Value.Id != -1)
     {
         stream.WriteInt8(Value.Count);
         stream.WriteInt16(Value.Metadata);
         if (Value.Nbt != null)
         {
             var data = Value.Nbt.SaveToBuffer(NbtCompression.GZip);
             stream.WriteInt16((short)data.Length);
             stream.WriteUInt8Array(data);
         }
         else
             stream.WriteInt16(-1);
     }
 }
Example #5
0
 public static ServerPing DoPing(IPEndPoint endPoint)
 {
     var client = new TcpClient();
     client.Connect(endPoint);
     var stream = new MinecraftStream(client.GetStream());
     var ping = new ServerListPingPacket(1);
     ping.WritePacket(stream);
     var response = PacketReader.ReadPacket(stream);
     client.Close();
     // TODO: Handle old pings
     var pong = (DisconnectPacket)response;
     var parts = pong.Reason.Substring(3).Split('\0');
     var result = new ServerPing();
     result.ProtocolVersion = int.Parse(parts[0]);
     result.ServerVersion = parts[1];
     result.MotD = parts[2];
     result.CurrentPlayers = int.Parse(parts[3]);
     result.MaxPlayers = int.Parse(parts[4]);
     return result;
 }
Example #6
0
        public override void Decode(MinecraftStream stream)
        {
            var chunkSectionPos = stream.ReadLong();

            ChunkX = (int)(chunkSectionPos >> 42);
            var sectionY = (int)(chunkSectionPos << 44 >> 44);

            ChunkZ = (int)(chunkSectionPos << 22 >> 42);

            var inverse = stream.ReadBool();
            //ChunkX = stream.ReadInt();
            //	ChunkZ = stream.ReadInt();

            int recordCount = stream.ReadVarInt();

            Records = new BlockUpdate[recordCount];
            for (int i = 0; i < Records.Length; i++)
            {
                var encoded = stream.ReadVarLong();

                // long encoded = rawId << 12 | (blockLocalX << 8 | blockLocalZ << 4 | blockLocalY)
                var rawId = encoded >> 12;
                var x     = (int)((encoded >> 8) & 0xF);
                var y     = (int)(encoded & 0xF);
                var z     = (int)((encoded >> 4) & 0xF);

                //byte horizontalPos = (byte)stream.ReadByte();

                BlockUpdate update = new BlockUpdate();
                update.X       = (ChunkX << 4) + x;
                update.Z       = (ChunkZ << 4) + z;
                update.Y       = (sectionY << 4) + y;
                update.BlockId = (uint)rawId;

                Records[i] = update;
            }
        }
Example #7
0
        private void ReadAddPlayerEntries(int count, MinecraftStream stream)
        {
            AddPlayerEntries = new AddPlayerEntry[count];
            for (int i = 0; i < count; i++)
            {
                var newEntry = new AddPlayerEntry();
                newEntry.UUID = stream.ReadUuid();
                newEntry.Name = stream.ReadString();
                int propertyLength = stream.ReadVarInt();
                newEntry.Properties = new PlayerListProperty[propertyLength];
                for (int ii = 0; ii < propertyLength; ii++)
                {
                    newEntry.Properties[ii] = new PlayerListProperty()
                    {
                        Name     = stream.ReadString(),
                        Value    = stream.ReadString(),
                        IsSigned = stream.ReadBool()
                    };

                    if (newEntry.Properties[ii].IsSigned)
                    {
                        newEntry.Properties[ii].Signature = stream.ReadString();
                    }
                }

                newEntry.Gamemode       = stream.ReadVarInt();
                newEntry.Ping           = stream.ReadVarInt();
                newEntry.HasDisplayName = stream.ReadBool();
                if (newEntry.HasDisplayName)
                {
                    newEntry.DisplayName = stream.ReadString();
                }

                AddPlayerEntries[i] = newEntry;
            }
        }
        public override async Task WriteAsync(MinecraftStream stream)
        {
            await stream.WriteUuidAsync(this.Uuid);

            await stream.WriteStringAsync(this.Name, 16);

            await stream.WriteVarIntAsync(this.Properties.Count);

            foreach (SkinProperties props in this.Properties)
            {
                await stream.WriteAsync(await props.ToArrayAsync());
            }

            await stream.WriteVarIntAsync(this.Gamemode);

            await stream.WriteVarIntAsync(this.Ping);

            await stream.WriteBooleanAsync(this.HasDisplayName);

            if (this.HasDisplayName)
            {
                await stream.WriteChatAsync(this.DisplayName);
            }
        }
Example #9
0
        public static async Task <Packet> ReadFromStreamAsync(MinecraftStream stream)
        {
            int length = await stream.ReadVarIntAsync();

            byte[] receivedData = new byte[length];

            await stream.ReadAsync(receivedData, 0, length);

            int packetId = 0;

            byte[] packetData = new byte[0];

            using (var packetStream = new MinecraftStream(receivedData))
            {
                try
                {
                    packetId = await packetStream.ReadVarIntAsync();

                    int arlen = 0;

                    if (length - packetId.GetVarintLength() > -1)
                    {
                        arlen = length - packetId.GetVarintLength();
                    }

                    packetData = new byte[arlen];
                    await packetStream.ReadAsync(packetData, 0, packetData.Length);
                }
                catch
                {
                    throw;
                }
            }

            return(new EmptyPacket(packetId, packetData));
        }
Example #10
0
        private async Task <(int id, byte[] data)> GetNextPacketAsync()
        {
            int length = await this.minecraftStream.ReadVarIntAsync();

            byte[] receivedData = new byte[length];

            await this.minecraftStream.ReadAsync(receivedData, 0, length);

            int packetId = 0;

            byte[] packetData = Array.Empty <byte>();

            using (var packetStream = new MinecraftStream(receivedData))
            {
                try
                {
                    packetId = await packetStream.ReadVarIntAsync();

                    int arlen = 0;

                    if (length - packetId.GetVarIntLength() > -1)
                    {
                        arlen = length - packetId.GetVarIntLength();
                    }

                    packetData = new byte[arlen];
                    await packetStream.ReadAsync(packetData, 0, packetData.Length);
                }
                catch
                {
                    throw;
                }
            }

            return(packetId, packetData);
        }
Example #11
0
        public override void Decode(MinecraftStream stream)
        {
            Event = (CombatEvent)stream.ReadVarInt();
            switch (Event)
            {
            case CombatEvent.EnterCombat:

                break;

            case CombatEvent.EndCombat:
                Duration = stream.ReadVarInt();
                EntityId = stream.ReadInt();
                break;

            case CombatEvent.EntityDead:
                PlayerId = stream.ReadVarInt();
                EntityId = stream.ReadInt();
                Message  = stream.ReadString();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Example #12
0
        public async ValueTask <PluginMessageStore> HandleAsync()
        {
            using var stream = new MinecraftStream(this.PluginData);
            var result = this.Channel switch
            {
                "minecraft:brand" => new PluginMessageStore
                {
                    Type  = PluginMessageType.Brand,
                    Value = await stream.ReadStringAsync()
                },
                "minecraft:register" => new PluginMessageStore//Payload should be a list of strings
                {
                    Type  = PluginMessageType.Register,
                    Value = this.PluginData
                },
                "minecraft:unregister" => new PluginMessageStore
                {
                    Type = PluginMessageType.UnRegister
                },
                _ => throw new System.NotImplementedException()
            };

            return(result);
        }
Example #13
0
        public static ServerPing DoPing(IPEndPoint endPoint)
        {
            var client = new TcpClient();

            client.Connect(endPoint);
            var stream = new MinecraftStream(client.GetStream());
            var ping   = new ServerListPingPacket(1);

            ping.WritePacket(stream);
            var response = PacketReader.ReadPacket(stream);

            client.Close();
            // TODO: Handle old pings
            var pong   = (DisconnectPacket)response;
            var parts  = pong.Reason.Substring(3).Split('\0');
            var result = new ServerPing();

            result.ProtocolVersion = int.Parse(parts[0]);
            result.ServerVersion   = parts[1];
            result.MotD            = parts[2];
            result.CurrentPlayers  = int.Parse(parts[3]);
            result.MaxPlayers      = int.Parse(parts[4]);
            return(result);
        }
Example #14
0
 public override void Encode(MinecraftStream stream)
 {
 }
Example #15
0
 public override void FromStream(MinecraftStream stream)
 {
     Value = Slot.FromStream(stream);
 }
Example #16
0
 public override void WriteTo(MinecraftStream stream, byte index)
 {
     stream.WriteUInt8(GetKey(index));
     stream.WriteUInt8(Value);
 }
Example #17
0
 public override void WriteTo(MinecraftStream stream, byte index)
 {
     stream.WriteUInt8(GetKey(index));
     stream.WriteUInt8(Value);
 }
Example #18
0
 public override void Decode(MinecraftStream stream)
 {
     Flags              = (byte)stream.ReadByte();
     FlyingSpeed        = stream.ReadFloat();
     FiedOfViewModifier = stream.ReadFloat();
 }
Example #19
0
 public override void WriteTo(MinecraftStream stream)
 {
     stream.WriteUInt8(GetKey());
     stream.WriteUInt8(Value);
 }
Example #20
0
 public abstract Task HandleAsync(MinecraftStream stream);
Example #21
0
 public override void FromStream(MinecraftStream stream)
 {
     Value = ItemStack.FromStream(stream);
 }
Example #22
0
 /// <summary>
 /// Retrieves the requested chunk from the region, or
 /// generates it if a world generator is provided.
 /// </summary>
 /// <param name="position">The position of the requested local chunk coordinates.</param>
 public Chunk GetChunk(Vector3 position)
 {
     // TODO: This could use some refactoring
     lock (Chunks)
     {
         if (!Chunks.ContainsKey(position))
         {
             if (regionFile != null)
             {
                 // Search the stream for that region
                 lock (regionFile)
                 {
                     var chunkData = GetChunkFromTable(position);
                     if (chunkData == null)
                     {
                         if (WorldGenerator == null)
                             throw new ArgumentException("The requested chunk is not loaded.", "position");
                         GenerateChunk(position);
                         return Chunks[position];
                     }
                     regionFile.Seek(chunkData.Item1, SeekOrigin.Begin);
                     int length = new MinecraftStream(regionFile).ReadInt32(); // TODO: Avoid making new objects here, and in the WriteInt32
                     int compressionMode = regionFile.ReadByte();
                     switch (compressionMode)
                     {
                         case 1: // gzip
                             break;
                         case 2: // zlib
                             var nbt = new NbtFile();
                             nbt.LoadFromStream(regionFile, NbtCompression.ZLib, null);
                             var chunk = Chunk.FromNbt(position, nbt);
                             chunk.ParentRegion = this;
                             Chunks.Add(position, chunk);
                             break;
                         default:
                             throw new InvalidDataException("Invalid compression scheme provided by region file.");
                     }
                 }
             }
             else if (WorldGenerator == null)
                 throw new ArgumentException("The requested chunk is not loaded.", "position");
             else
                 Chunks.Add(position, WorldGenerator.GenerateChunk(position, this));
         }
         return Chunks[position];
     }
 }
 public void WriteTo(MinecraftStream stream)
 {
     foreach (var entry in entries)
         entry.Value.WriteTo(stream);
     stream.WriteUInt8(0x7F);
 }
Example #24
0
 static LogProvider()
 {
     logProviders = new List<ILogProvider>();
     MemoryStream = new MemoryStream();
     MinecraftStream = new MinecraftStream(MemoryStream);
 }
Example #25
0
 public override void FromStream(MinecraftStream stream)
 {
     Value = stream.ReadSingle();
 }
Example #26
0
 public override void Decode(MinecraftStream stream)
 {
     Message = stream.ReadString();
 }
Example #27
0
 public override void Encode(MinecraftStream stream)
 {
     stream.WriteString(Message);
 }
Example #28
0
 public override void Decode(MinecraftStream stream)
 {
     KeepAliveid = stream.ReadLong();
 }
Example #29
0
 public override async Task HandleAsync(MinecraftStream stream) => await stream.ReadStringAsync();
Example #30
0
 /// <inheritdoc />
 public override void Decode(MinecraftStream stream)
 {
     ExperienceBar   = stream.ReadFloat();
     Level           = stream.ReadVarInt();
     TotalExperience = stream.ReadVarInt();
 }
Example #31
0
 /// <inheritdoc />
 public override void Decode(MinecraftStream stream)
 {
     ChunkX = stream.ReadVarInt();
     ChunkZ = stream.ReadVarInt();
 }
Example #32
0
 public abstract void FromStream(MinecraftStream stream);
Example #33
0
 public override void FromStream(MinecraftStream stream)
 {
     Value = stream.ReadUInt8();
 }
Example #34
0
 public Task WriteAsync(MinecraftStream stream) => Task.CompletedTask;
Example #35
0
 public override void FromStream(MinecraftStream stream)
 {
     Value = stream.ReadUInt8();
 }
Example #36
0
 public abstract void WriteTo(MinecraftStream stream);
Example #37
0
 public Task ReadAsync(MinecraftStream stream) => Task.CompletedTask;
Example #38
0
 public override void WriteTo(MinecraftStream stream)
 {
     stream.WriteUInt8(GetKey());
     stream.WriteUInt8Array(Encoding.ASCII.GetBytes(Value));
 }
Example #39
0
 public override void Encode(MinecraftStream stream)
 {
     stream.WriteLong(KeepAliveid);
 }
Example #40
0
 public async Task ReadAsync(MinecraftStream stream)
 {
     this.Hand = (Hand)await stream.ReadVarIntAsync();
 }
Example #41
0
 /// <inheritdoc />
 public override void Encode(MinecraftStream stream)
 {
     throw new System.NotImplementedException();
 }
Example #42
0
        public async Task ReadAsync(MinecraftStream stream)
        {
            this.ClickedSlot = await stream.ReadShortAsync();

            this.ClickedItem = await stream.ReadSlotAsync();
        }
Example #43
0
        public override async Task WriteAsync(MinecraftStream stream)
        {
            await base.WriteAsync(stream);

            await stream.WriteEntityMetdata(18, EntityMetadataType.Boolean, this.HasChest);
        }
        public override async Task WriteAsync(MinecraftStream stream)
        {
            await base.WriteAsync(stream);

            await stream.WriteStringAsync(this.DisplayName);
        }
Example #45
0
 public abstract void WriteTo(MinecraftStream stream, byte index);
Example #46
0
 public override void Decode(MinecraftStream stream)
 {
     EntityId = stream.ReadVarInt();
     HeadYaw  = (sbyte)stream.ReadByte();
 }
Example #47
0
 public async Task ReadAsync(MinecraftStream stream)
 {
     this.KeepAliveId = await stream.ReadLongAsync();
 }
Example #48
0
 public override void Encode(MinecraftStream stream)
 {
     stream.WriteVarInt(EntityId);
     stream.WriteByte((byte)HeadYaw);
 }