diff options
| author | mat <github@matdoes.dev> | 2021-12-15 23:10:55 -0600 |
|---|---|---|
| committer | mat <github@matdoes.dev> | 2021-12-15 23:10:55 -0600 |
| commit | 9642558f8f8d983a7087f15d68be8cf07a85f0c2 (patch) | |
| tree | 5f0a967f005cd5db510a13ab290c8ad6669b25aa /azalea-protocol/src/read.rs | |
| parent | 72aefe871ca4983431b1a0b707b472e73ffea836 (diff) | |
| download | azalea-drasl-9642558f8f8d983a7087f15d68be8cf07a85f0c2.tar.xz | |
azalea
Diffstat (limited to 'azalea-protocol/src/read.rs')
| -rw-r--r-- | azalea-protocol/src/read.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/azalea-protocol/src/read.rs b/azalea-protocol/src/read.rs new file mode 100644 index 00000000..6f242e8b --- /dev/null +++ b/azalea-protocol/src/read.rs @@ -0,0 +1,28 @@ +use tokio::{io::BufReader, net::TcpStream}; + +use crate::{connect::PacketFlow, mc_buf::Readable, packets::ProtocolPacket}; + +pub async fn read_packet<P: ProtocolPacket>( + flow: &PacketFlow, + stream: &mut TcpStream, +) -> Result<P, String> { + // what this does: + // 1. reads the first 5 bytes, probably only some of this will be used to get the packet length + // 2. how much we should read = packet length - 5 + // 3. read the rest of the packet and add it to the cursor + // 4. figure out what packet this is and parse it + + // the first thing minecraft sends us is the length as a varint, which can be up to 5 bytes long + let mut buf = BufReader::with_capacity(4 * 1024 * 1024, stream); + + let (_packet_size, _packet_size_varint_size) = buf.read_varint().await?; + + // then, minecraft tells us the packet id as a varint + let (packet_id, _packet_id_size) = buf.read_varint().await?; + + // if we recognize the packet id, parse it + + let packet = P::read(packet_id.try_into().unwrap(), flow, &mut buf).await?; + + Ok(packet) +} |
