diff --git a/protocol/src/item.rs b/protocol/src/item.rs index 19fa87c..7ed18d6 100644 --- a/protocol/src/item.rs +++ b/protocol/src/item.rs @@ -43,11 +43,32 @@ impl Serializable for Option { if id == -1 { return Ok(None); } + let count = buf.read_u8()? as isize; + let damage = buf.read_i16::()? as isize; + + let protocol_version = unsafe { protocol::CURRENT_PROTOCOL_VERSION }; + + let tag: Option = if protocol_version >= 47 { + Serializable::read_from(buf)? + } else { + // 1.7 uses a different slot data format described on https://wiki.vg/index.php?title=Slot_Data&diff=6056&oldid=4753 + let tag_size = buf.read_i16::()?; + if tag_size != -1 { + for _ in 0..tag_size { + let _ = buf.read_u8()?; + } + // TODO: decompress zlib NBT for 1.7 + None + } else { + None + } + }; + Ok(Some(Stack { id: id as isize, - count: buf.read_u8()? as isize, - damage: buf.read_i16::()? as isize, - tag: Serializable::read_from(buf)?, + count, + damage, + tag, })) } fn write_to(&self, buf: &mut W) -> Result<(), protocol::Error> { @@ -56,6 +77,7 @@ impl Serializable for Option { buf.write_i16::(val.id as i16)?; buf.write_u8(val.count as u8)?; buf.write_i16::(val.damage as i16)?; + // TODO: compress zlib NBT if 1.7 val.tag.write_to(buf)?; } None => buf.write_i16::(-1)?,