From eb452abbb5b34d7dd89610f51990527605d3fafc Mon Sep 17 00:00:00 2001 From: Kezi Date: Thu, 25 Mar 2021 16:21:25 +0100 Subject: [PATCH] protocol/item: update to support protocol_version >= 404 (1.13.2+) (#524) --- protocol/src/item.rs | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/protocol/src/item.rs b/protocol/src/item.rs index 6ecf65c..8851dd5 100644 --- a/protocol/src/item.rs +++ b/protocol/src/item.rs @@ -17,7 +17,7 @@ use crate::protocol::{self, Serializable}; use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; use std::io; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Stack { pub id: isize, pub count: isize, @@ -88,16 +88,30 @@ impl Serializable for Option { })) } fn write_to(&self, buf: &mut W) -> Result<(), protocol::Error> { - match *self { - Some(ref val) => { - // TODO: if protocol_version >= 404, send present and id varint, no damage, for 1.13.2 - buf.write_i16::(val.id as i16)?; - buf.write_u8(val.count as u8)?; - buf.write_i16::(val.damage.unwrap_or(0) as i16)?; - // TODO: compress zlib NBT if 1.7 - val.tag.write_to(buf)?; + let protocol_version = protocol::current_protocol_version(); + if protocol_version >= 404 { + match *self { + Some(ref val) => { + buf.write_u8(1)?; //present + crate::protocol::VarInt(val.id as i32).write_to(buf)?; + buf.write_u8(val.count as u8)?; + val.tag.write_to(buf)?; + } + None => { + buf.write_u8(0)?; // not present + } + } + } else { + match *self { + Some(ref val) => { + buf.write_i16::(val.id as i16)?; + buf.write_u8(val.count as u8)?; + buf.write_i16::(val.damage.unwrap_or(0) as i16)?; + // TODO: compress zlib NBT if 1.7 + val.tag.write_to(buf)?; + } + None => buf.write_i16::(-1)?, } - None => buf.write_i16::(-1)?, } Result::Ok(()) }