From 3475eaee065d5522ee68c2e32755b7e6d46fed3f Mon Sep 17 00:00:00 2001 From: C191239 Date: Fri, 15 Mar 2024 22:41:55 +0800 Subject: [PATCH] `ItemStack` decode --- crates/core/item/src/edcode.rs | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/crates/core/item/src/edcode.rs b/crates/core/item/src/edcode.rs index 4ffe8545..5860f3c0 100644 --- a/crates/core/item/src/edcode.rs +++ b/crates/core/item/src/edcode.rs @@ -1,7 +1,8 @@ -use rimecraft_edcode::Encode; -use rimecraft_global_cx::nbt_edcode::WriteNbt; +use rimecraft_edcode::{Decode, Encode}; +use rimecraft_global_cx::nbt_edcode::{ReadNbt, WriteNbt}; +use rimecraft_registry::{ProvideRegistry, Reg}; -use crate::{stack::ItemStackCx, ItemStack}; +use crate::{stack::ItemStackCx, ItemStack, RawItem}; impl Encode for ItemStack<'_, Cx> where @@ -22,7 +23,7 @@ where if let Some(x) = self.nbt() { Cx::write_nbt(x, buf.writer())? } else { - // Write empty nbt tag. + // @TODO: Write empty nbt tag. todo!() } } @@ -30,3 +31,23 @@ where Ok(()) } } + +impl<'r, Cx> Decode for ItemStack<'r, Cx> +where + Cx: ItemStackCx + for<'a> ReadNbt<&'a Cx::Compound> + ProvideRegistry<'r, Cx::Id, RawItem>, +{ + fn decode(mut buf: B) -> Result + where + B: rimecraft_edcode::bytes::Buf, + { + if bool::decode(&mut buf)? { + let item = Reg::<'r, Cx::Id, RawItem>::decode(&mut buf)?; + let count = u8::decode(&mut buf)?; + // @TODO: Handle null tags. + let nbt = todo!(); + // Ok(ItemStack::with_nbt(item, count, nbt)) + } else { + Ok(ItemStack::empty()) + } + } +}