From 308422ae1ab5aa8e7b7009c0fd3aaa81ccb90703 Mon Sep 17 00:00:00 2001 From: Hongas Date: Mon, 20 Jan 2025 11:52:34 +0700 Subject: [PATCH 1/8] Fixed the named version --- pumpkin-nbt/src/deserializer.rs | 3 ++- pumpkin-nbt/src/lib.rs | 33 +++++++++++++++++++++++++++ pumpkin-world/src/chunk/mod.rs | 19 ++++++++++++--- pumpkin-world/src/world_info/anvil.rs | 10 ++++++-- 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/pumpkin-nbt/src/deserializer.rs b/pumpkin-nbt/src/deserializer.rs index 80e3b96f4..cc2f5f14b 100644 --- a/pumpkin-nbt/src/deserializer.rs +++ b/pumpkin-nbt/src/deserializer.rs @@ -126,7 +126,8 @@ impl<'de, T: Buf> de::Deserializer<'de> for &mut Deserializer<'de, T> { if self.is_named { // Consume struct name - NbtTag::deserialize(self.input)?; + let len = self.input.get_u16() as usize; + self.input.advance(len); } } diff --git a/pumpkin-nbt/src/lib.rs b/pumpkin-nbt/src/lib.rs index 5ed48da9b..4654a22b6 100644 --- a/pumpkin-nbt/src/lib.rs +++ b/pumpkin-nbt/src/lib.rs @@ -205,6 +205,8 @@ impl_array!(BytesArray, "byte"); mod test { use serde::{Deserialize, Serialize}; + use crate::deserializer::from_bytes; + use crate::serializer::to_bytes; use crate::BytesArray; use crate::IntArray; use crate::LongArray; @@ -236,6 +238,23 @@ mod test { assert_eq!(test, recreated_struct); } + #[test] + fn test_simple_ser_de_named() { + let name = String::from("Test"); + let test = Test { + byte: 123, + short: 1342, + int: 4313, + long: 34, + float: 1.00, + string: "Hello test".to_string(), + }; + let mut bytes = to_bytes(&test, name).unwrap(); + let recreated_struct: Test = from_bytes(&mut bytes).unwrap(); + + assert_eq!(test, recreated_struct); + } + #[derive(Serialize, Deserialize, PartialEq, Debug)] struct TestArray { #[serde(with = "BytesArray")] @@ -258,4 +277,18 @@ mod test { assert_eq!(test, recreated_struct); } + + #[test] + fn test_simple_ser_de_array_named() { + let name = String::from("Test"); + let test = TestArray { + byte_array: vec![0, 3, 2], + int_array: vec![13, 1321, 2], + long_array: vec![1, 0, 200301, 1], + }; + let mut bytes = to_bytes(&test, name).unwrap(); + let recreated_struct: TestArray = from_bytes(&mut bytes).unwrap(); + + assert_eq!(test, recreated_struct); + } } diff --git a/pumpkin-world/src/chunk/mod.rs b/pumpkin-world/src/chunk/mod.rs index 8473e0301..7320f88f7 100644 --- a/pumpkin-world/src/chunk/mod.rs +++ b/pumpkin-world/src/chunk/mod.rs @@ -1,9 +1,10 @@ use fastnbt::LongArray; use pumpkin_core::math::vector2::Vector2; +use pumpkin_nbt::deserializer::from_bytes_unnamed; use serde::{Deserialize, Serialize}; -use std::cmp::max; use std::collections::HashMap; use std::ops::Index; +use std::{cmp::max, io::Cursor}; use thiserror::Error; use crate::{ @@ -233,14 +234,26 @@ impl Index for ChunkBlocks { impl ChunkData { pub fn from_bytes(chunk_data: &[u8], at: Vector2) -> Result { - if fastnbt::from_bytes::(chunk_data) + // if fastnbt::from_bytes::(chunk_data) + // .map_err(|_| ChunkParsingError::FailedReadStatus)? + // != ChunkStatus::Full + // { + // return Err(ChunkParsingError::ChunkNotGenerated); + // } + + // let chunk_data = fastnbt::from_bytes::(chunk_data) + // .map_err(|e| ChunkParsingError::ErrorDeserializingChunk(e.to_string()))?; + + let mut a = Cursor::new(chunk_data); + + if from_bytes_unnamed::(&mut a) .map_err(|_| ChunkParsingError::FailedReadStatus)? != ChunkStatus::Full { return Err(ChunkParsingError::ChunkNotGenerated); } - let chunk_data = fastnbt::from_bytes::(chunk_data) + let chunk_data = from_bytes_unnamed::(&mut a) .map_err(|e| ChunkParsingError::ErrorDeserializingChunk(e.to_string()))?; // this needs to be boxed, otherwise it will cause a stack-overflow diff --git a/pumpkin-world/src/world_info/anvil.rs b/pumpkin-world/src/world_info/anvil.rs index 080d61e19..bb87a90f2 100644 --- a/pumpkin-world/src/world_info/anvil.rs +++ b/pumpkin-world/src/world_info/anvil.rs @@ -1,10 +1,11 @@ use std::{ fs::OpenOptions, - io::{Read, Write}, + io::{Cursor, Read, Write}, time::{SystemTime, UNIX_EPOCH}, }; use flate2::{read::GzDecoder, write::GzEncoder, Compression}; +use pumpkin_nbt::deserializer::from_bytes_unnamed; use serde::{Deserialize, Serialize}; use crate::level::LevelFolder; @@ -29,7 +30,12 @@ impl WorldInfoReader for AnvilLevelInfo { let mut decompressed_data = Vec::new(); decoder.read_to_end(&mut decompressed_data)?; - let info = fastnbt::from_bytes::(&decompressed_data) + // let info = fastnbt::from_bytes::(&decompressed_data) + // .map_err(|e| WorldInfoError::DeserializationError(e.to_string()))?; + + let mut a = Cursor::new(decompressed_data); + + let info = from_bytes_unnamed::(&mut a) .map_err(|e| WorldInfoError::DeserializationError(e.to_string()))?; // todo check version From d2572cfa5e502f52328579c78acac7abd1a57a18 Mon Sep 17 00:00:00 2001 From: Hongas Date: Mon, 20 Jan 2025 14:01:52 +0700 Subject: [PATCH 2/8] sigma --- pumpkin-world/src/chunk/mod.rs | 2 +- pumpkin-world/src/world_info/anvil.rs | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/pumpkin-world/src/chunk/mod.rs b/pumpkin-world/src/chunk/mod.rs index 328974500..08398da84 100644 --- a/pumpkin-world/src/chunk/mod.rs +++ b/pumpkin-world/src/chunk/mod.rs @@ -344,7 +344,7 @@ impl ChunkData { return Err(ChunkParsingError::ChunkNotGenerated); } - let chunk_data = from_bytes_unnamed::(&mut a) + let chunk_data = fastnbt::from_bytes::(chunk_data) .map_err(|e| ChunkParsingError::ErrorDeserializingChunk(e.to_string()))?; if chunk_data.x_pos != position.x || chunk_data.z_pos != position.z { diff --git a/pumpkin-world/src/world_info/anvil.rs b/pumpkin-world/src/world_info/anvil.rs index 5801fcb3f..0b867d53a 100644 --- a/pumpkin-world/src/world_info/anvil.rs +++ b/pumpkin-world/src/world_info/anvil.rs @@ -30,12 +30,7 @@ impl WorldInfoReader for AnvilLevelInfo { let mut decompressed_data = Vec::new(); decoder.read_to_end(&mut decompressed_data)?; - // let info = fastnbt::from_bytes::(&decompressed_data) - // .map_err(|e| WorldInfoError::DeserializationError(e.to_string()))?; - - let mut a = Cursor::new(decompressed_data); - - let info = from_bytes_unnamed::(&mut a) + let info = fastnbt::from_bytes::(&decompressed_data) .map_err(|e| WorldInfoError::DeserializationError(e.to_string()))?; // todo check version From b1c4bdb05c74128dfc7a7822c31752eb16db717d Mon Sep 17 00:00:00 2001 From: Hongas Date: Mon, 20 Jan 2025 14:03:14 +0700 Subject: [PATCH 3/8] a --- pumpkin-world/src/world_info/anvil.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pumpkin-world/src/world_info/anvil.rs b/pumpkin-world/src/world_info/anvil.rs index 0b867d53a..37734af5b 100644 --- a/pumpkin-world/src/world_info/anvil.rs +++ b/pumpkin-world/src/world_info/anvil.rs @@ -1,11 +1,10 @@ use std::{ fs::OpenOptions, - io::{Cursor, Read, Write}, + io::{Read, Write}, time::{SystemTime, UNIX_EPOCH}, }; use flate2::{read::GzDecoder, write::GzEncoder, Compression}; -use pumpkin_nbt::deserializer::from_bytes_unnamed; use serde::{Deserialize, Serialize}; use crate::level::LevelFolder; From 3aee1b2c0385d56fc7d489d72fa56c10ee27bb21 Mon Sep 17 00:00:00 2001 From: Hongas Date: Mon, 20 Jan 2025 14:04:20 +0700 Subject: [PATCH 4/8] a --- pumpkin-world/src/chunk/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/pumpkin-world/src/chunk/mod.rs b/pumpkin-world/src/chunk/mod.rs index 08398da84..53bce75e0 100644 --- a/pumpkin-world/src/chunk/mod.rs +++ b/pumpkin-world/src/chunk/mod.rs @@ -1,6 +1,5 @@ use fastnbt::LongArray; use pumpkin_data::chunk::ChunkStatus; -use pumpkin_nbt::deserializer::from_bytes_unnamed; use pumpkin_util::math::{ceil_log2, vector2::Vector2}; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, iter::repeat_with}; From fc435289c9d0f339a946b846fcef0d5cde94055b Mon Sep 17 00:00:00 2001 From: Hongas Date: Sat, 1 Feb 2025 22:47:34 +0700 Subject: [PATCH 5/8] Fixed serialization of lists --- .vscode/launch.json | 235 ++++++++++++++++++++++++++ pumpkin-nbt/src/deserializer.rs | 7 +- pumpkin-nbt/src/lib.rs | 72 +++++++- pumpkin-nbt/src/serializer.rs | 37 +++- pumpkin-world/src/chunk/anvil.rs | 5 +- pumpkin-world/src/chunk/mod.rs | 12 +- pumpkin-world/src/world_info/anvil.rs | 7 +- 7 files changed, 357 insertions(+), 18 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..965d4ce1d --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,235 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'pumpkin_config'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=pumpkin-config" + ], + "filter": { + "name": "pumpkin_config", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'pumpkin_util'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=pumpkin-util" + ], + "filter": { + "name": "pumpkin_util", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'pumpkin_nbt'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=pumpkin-nbt" + ], + "filter": { + "name": "pumpkin_nbt", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'pumpkin_inventory'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=pumpkin-inventory" + ], + "filter": { + "name": "pumpkin_inventory", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'pumpkin_data'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=pumpkin-data" + ], + "filter": { + "name": "pumpkin_data", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'pumpkin_protocol'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=pumpkin-protocol" + ], + "filter": { + "name": "pumpkin_protocol", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'pumpkin_world'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=pumpkin-world" + ], + "filter": { + "name": "pumpkin_world", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug benchmark 'chunk_noise'", + "cargo": { + "args": [ + "test", + "--no-run", + "--bench=chunk_noise", + "--package=pumpkin-world" + ], + "filter": { + "name": "chunk_noise", + "kind": "bench" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug benchmark 'chunk_noise_populate'", + "cargo": { + "args": [ + "test", + "--no-run", + "--bench=chunk_noise_populate", + "--package=pumpkin-world" + ], + "filter": { + "name": "chunk_noise_populate", + "kind": "bench" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'pumpkin_registry'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=pumpkin-registry" + ], + "filter": { + "name": "pumpkin_registry", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug executable 'pumpkin'", + "cargo": { + "args": [ + "build", + "--bin=pumpkin", + "--package=pumpkin" + ], + "filter": { + "name": "pumpkin", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in executable 'pumpkin'", + "cargo": { + "args": [ + "test", + "--no-run", + "--bin=pumpkin", + "--package=pumpkin" + ], + "filter": { + "name": "pumpkin", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/pumpkin-nbt/src/deserializer.rs b/pumpkin-nbt/src/deserializer.rs index cc2f5f14b..947b805c1 100644 --- a/pumpkin-nbt/src/deserializer.rs +++ b/pumpkin-nbt/src/deserializer.rs @@ -77,7 +77,7 @@ impl<'de, T: Buf> de::Deserializer<'de> for &mut Deserializer<'de, T> { }; if let Some(list_type) = list_type { - let remaining_values = self.input.get_u32(); + let remaining_values = self.input.get_i32(); return visitor.visit_seq(ListAccess { de: self, list_type, @@ -191,7 +191,7 @@ impl<'de, T: Buf> MapAccess<'de> for CompoundAccess<'_, 'de, T> { struct ListAccess<'a, 'de: 'a, T: Buf> { de: &'a mut Deserializer<'de, T>, - remaining_values: u32, + remaining_values: i32, list_type: u8, } @@ -202,7 +202,8 @@ impl<'de, T: Buf> SeqAccess<'de> for ListAccess<'_, 'de, T> { where E: DeserializeSeed<'de>, { - if self.remaining_values == 0 { + // Negative list length is allowed, so we have to check for it. + if self.remaining_values <= 0 { return Ok(None); } diff --git a/pumpkin-nbt/src/lib.rs b/pumpkin-nbt/src/lib.rs index 4654a22b6..357bb5fbd 100644 --- a/pumpkin-nbt/src/lib.rs +++ b/pumpkin-nbt/src/lib.rs @@ -204,6 +204,7 @@ impl_array!(BytesArray, "byte"); #[cfg(test)] mod test { use serde::{Deserialize, Serialize}; + use std::vec; use crate::deserializer::from_bytes; use crate::serializer::to_bytes; @@ -212,7 +213,7 @@ mod test { use crate::LongArray; use crate::{deserializer::from_bytes_unnamed, serializer::to_bytes_unnamed}; - #[derive(Serialize, Deserialize, PartialEq, Debug)] + #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] struct Test { byte: i8, short: i16, @@ -291,4 +292,73 @@ mod test { assert_eq!(test, recreated_struct); } + + #[derive(Serialize, Deserialize, PartialEq, Debug)] + struct TestList { + compounds: Vec, + list_string: Vec, + empty: Vec, + } + + #[test] + fn test_list() { + let test1 = Test { + byte: 123, + short: 1342, + int: 4313, + long: 34, + float: 1.00, + string: "Hello test".to_string(), + }; + + let test2 = Test { + byte: 13, + short: 342, + int: -4313, + long: -132334, + float: -69.420, + string: "Hello compounds".to_string(), + }; + + let list_compound = TestList { + compounds: vec![test1, test2], + list_string: vec!["".to_string(), "abcbcbcbbc".to_string()], + empty: vec![], + }; + + let mut bytes = to_bytes_unnamed(&list_compound).unwrap(); + let recreated_struct: TestList = from_bytes_unnamed(&mut bytes).unwrap(); + assert_eq!(list_compound, recreated_struct); + } + + #[test] + fn test_list_named() { + let test1 = Test { + byte: 123, + short: 1342, + int: 4313, + long: 34, + float: 1.00, + string: "Hello test".to_string(), + }; + + let test2 = Test { + byte: 13, + short: 342, + int: -4313, + long: -132334, + float: -69.420, + string: "Hello compounds".to_string(), + }; + + let list_compound = TestList { + compounds: vec![test1, test2], + list_string: vec!["".to_string(), "abcbcbcbbc".to_string()], + empty: vec![], + }; + + let mut bytes = to_bytes(&list_compound, "a".to_string()).unwrap(); + let recreated_struct: TestList = from_bytes(&mut bytes).unwrap(); + assert_eq!(list_compound, recreated_struct); + } } diff --git a/pumpkin-nbt/src/serializer.rs b/pumpkin-nbt/src/serializer.rs index 77e9a1d2d..50642981f 100644 --- a/pumpkin-nbt/src/serializer.rs +++ b/pumpkin-nbt/src/serializer.rs @@ -14,6 +14,7 @@ pub type Result = std::result::Result; pub struct Serializer { output: BytesMut, state: State, + in_struct: bool, } // NBT has a different order of things, then most other formats @@ -64,6 +65,7 @@ where let mut serializer = Serializer { output: BytesMut::new(), state: State::Root(None), + in_struct: false, }; value.serialize(&mut serializer)?; Ok(serializer.output) @@ -86,6 +88,7 @@ where let mut serializer = Serializer { output: BytesMut::new(), state: State::Root(Some(name)), + in_struct: false, }; value.serialize(&mut serializer)?; Ok(serializer.output) @@ -112,6 +115,7 @@ impl ser::Serializer for &mut Serializer { type SerializeStruct = Self; type SerializeStructVariant = Impossible<(), Error>; + // NBT doesn't have bool type, but it's most commonly represented as a byte fn serialize_bool(self, v: bool) -> Result<()> { self.serialize_i8(v as i8)?; Ok(()) @@ -182,10 +186,20 @@ impl ser::Serializer for &mut Serializer { } fn serialize_str(self, v: &str) -> Result<()> { - self.parse_state(STRING_ID)?; - if self.state == State::MapKey { - self.state = State::Named(v.to_string()); - return Ok(()); + match self.state { + State::FirstListElement { .. } => { + self.parse_state(STRING_ID)?; + } + State::MapKey => { + self.parse_state(STRING_ID)?; + self.state = State::Named(v.to_string()); + return Ok(()); + } + _ => (), + } + + if self.in_struct { + self.parse_state(STRING_ID)?; } self.output @@ -297,6 +311,11 @@ impl ser::Serializer for &mut Serializer { self.state = State::FirstListElement { len: len.unwrap() as i32, }; + + if len == Some(0) { + self.output.put_u8(END_ID); + self.output.put_i32(0); + } } } @@ -337,24 +356,29 @@ impl ser::Serializer for &mut Serializer { } fn serialize_struct(self, _name: &'static str, _len: usize) -> Result { - self.output.put_u8(COMPOUND_ID); - match &mut self.state { State::Root(root_name) => { + self.output.put_u8(COMPOUND_ID); if let Some(root_name) = root_name { self.output .put(NbtTag::String(root_name.clone()).serialize_data()); } } State::Named(string) => { + self.output.put_u8(COMPOUND_ID); self.output .put(NbtTag::String(string.clone()).serialize_data()); } + State::FirstListElement { .. } => self.parse_state(COMPOUND_ID)?, + State::ListElement => (), + _ => { unimplemented!() } } + self.in_struct = true; + Ok(self) } @@ -405,6 +429,7 @@ impl ser::SerializeStruct for &mut Serializer { fn end(self) -> Result<()> { self.output.put_u8(END_ID); + self.in_struct = false; Ok(()) } } diff --git a/pumpkin-world/src/chunk/anvil.rs b/pumpkin-world/src/chunk/anvil.rs index 66898f090..0d13d0478 100644 --- a/pumpkin-world/src/chunk/anvil.rs +++ b/pumpkin-world/src/chunk/anvil.rs @@ -455,7 +455,10 @@ impl AnvilChunkFormat { sections, }; - fastnbt::to_bytes(&nbt).map_err(ChunkSerializingError::ErrorSerializingChunk) + match pumpkin_nbt::serializer::to_bytes(&nbt, "ChunkNbt".to_string()) { + Ok(bytes) => Ok(bytes.into_iter().collect()), + Err(e) => Err(ChunkSerializingError::ErrorSerializingChunk(e)), + } } /// Returns the next free writable sector diff --git a/pumpkin-world/src/chunk/mod.rs b/pumpkin-world/src/chunk/mod.rs index 53bce75e0..2fe0e8f1a 100644 --- a/pumpkin-world/src/chunk/mod.rs +++ b/pumpkin-world/src/chunk/mod.rs @@ -1,8 +1,9 @@ use fastnbt::LongArray; use pumpkin_data::chunk::ChunkStatus; +use pumpkin_nbt::deserializer::from_bytes_unnamed; use pumpkin_util::math::{ceil_log2, vector2::Vector2}; use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, iter::repeat_with}; +use std::{collections::HashMap, io::Cursor, iter::repeat_with}; use thiserror::Error; use crate::{ @@ -332,10 +333,11 @@ pub struct ChunkStatusWrapper { impl ChunkData { pub fn from_bytes( - chunk_data: &[u8], + mut chunk_data: &[u8], position: Vector2, ) -> Result { - if fastnbt::from_bytes::(chunk_data) + let mut cursor = Cursor::new(chunk_data); + if from_bytes_unnamed::(&mut chunk_data) .map_err(|_| ChunkParsingError::FailedReadStatus)? .status != ChunkStatus::Full @@ -343,7 +345,7 @@ impl ChunkData { return Err(ChunkParsingError::ChunkNotGenerated); } - let chunk_data = fastnbt::from_bytes::(chunk_data) + let chunk_data = from_bytes_unnamed::(&mut cursor) .map_err(|e| ChunkParsingError::ErrorDeserializingChunk(e.to_string()))?; if chunk_data.x_pos != position.x || chunk_data.z_pos != position.z { @@ -450,5 +452,5 @@ fn convert_index(index: ChunkRelativeBlockCoordinates) -> usize { #[derive(Error, Debug)] pub enum ChunkSerializingError { #[error("Error serializing chunk: {0}")] - ErrorSerializingChunk(fastnbt::error::Error), + ErrorSerializingChunk(pumpkin_nbt::Error), } diff --git a/pumpkin-world/src/world_info/anvil.rs b/pumpkin-world/src/world_info/anvil.rs index 37734af5b..1183308c9 100644 --- a/pumpkin-world/src/world_info/anvil.rs +++ b/pumpkin-world/src/world_info/anvil.rs @@ -1,10 +1,11 @@ use std::{ fs::OpenOptions, - io::{Read, Write}, + io::{Cursor, Read, Write}, time::{SystemTime, UNIX_EPOCH}, }; use flate2::{read::GzDecoder, write::GzEncoder, Compression}; +use pumpkin_nbt::deserializer::from_bytes; use serde::{Deserialize, Serialize}; use crate::level::LevelFolder; @@ -29,7 +30,9 @@ impl WorldInfoReader for AnvilLevelInfo { let mut decompressed_data = Vec::new(); decoder.read_to_end(&mut decompressed_data)?; - let info = fastnbt::from_bytes::(&decompressed_data) + let mut cursor = Cursor::new(decompressed_data); + + let info = from_bytes::(&mut cursor) .map_err(|e| WorldInfoError::DeserializationError(e.to_string()))?; // todo check version From 874b2b02ee203c74ae085f02305d9e01496420a4 Mon Sep 17 00:00:00 2001 From: Hongas Date: Sat, 1 Feb 2025 22:55:40 +0700 Subject: [PATCH 6/8] removed launch.json --- .gitignore | 2 +- .vscode/launch.json | 235 -------------------------------------------- 2 files changed, 1 insertion(+), 236 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.gitignore b/.gitignore index 9feb853cd..fa6061dea 100644 --- a/.gitignore +++ b/.gitignore @@ -115,7 +115,7 @@ features.toml *.local.nbt -.vscode/settings.json +.vscode/ # Documentation docs/.vitepress/dist diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 965d4ce1d..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,235 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'pumpkin_config'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=pumpkin-config" - ], - "filter": { - "name": "pumpkin_config", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'pumpkin_util'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=pumpkin-util" - ], - "filter": { - "name": "pumpkin_util", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'pumpkin_nbt'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=pumpkin-nbt" - ], - "filter": { - "name": "pumpkin_nbt", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'pumpkin_inventory'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=pumpkin-inventory" - ], - "filter": { - "name": "pumpkin_inventory", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'pumpkin_data'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=pumpkin-data" - ], - "filter": { - "name": "pumpkin_data", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'pumpkin_protocol'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=pumpkin-protocol" - ], - "filter": { - "name": "pumpkin_protocol", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'pumpkin_world'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=pumpkin-world" - ], - "filter": { - "name": "pumpkin_world", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug benchmark 'chunk_noise'", - "cargo": { - "args": [ - "test", - "--no-run", - "--bench=chunk_noise", - "--package=pumpkin-world" - ], - "filter": { - "name": "chunk_noise", - "kind": "bench" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug benchmark 'chunk_noise_populate'", - "cargo": { - "args": [ - "test", - "--no-run", - "--bench=chunk_noise_populate", - "--package=pumpkin-world" - ], - "filter": { - "name": "chunk_noise_populate", - "kind": "bench" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'pumpkin_registry'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=pumpkin-registry" - ], - "filter": { - "name": "pumpkin_registry", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug executable 'pumpkin'", - "cargo": { - "args": [ - "build", - "--bin=pumpkin", - "--package=pumpkin" - ], - "filter": { - "name": "pumpkin", - "kind": "bin" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in executable 'pumpkin'", - "cargo": { - "args": [ - "test", - "--no-run", - "--bin=pumpkin", - "--package=pumpkin" - ], - "filter": { - "name": "pumpkin", - "kind": "bin" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - } - ] -} \ No newline at end of file From b28df33652873ac0c648e3fcd60b532ed6b70eab Mon Sep 17 00:00:00 2001 From: Hongas Date: Sat, 1 Feb 2025 23:25:43 +0700 Subject: [PATCH 7/8] removed derive clone --- pumpkin-nbt/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pumpkin-nbt/src/lib.rs b/pumpkin-nbt/src/lib.rs index 357bb5fbd..25a5eef6e 100644 --- a/pumpkin-nbt/src/lib.rs +++ b/pumpkin-nbt/src/lib.rs @@ -213,7 +213,7 @@ mod test { use crate::LongArray; use crate::{deserializer::from_bytes_unnamed, serializer::to_bytes_unnamed}; - #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] + #[derive(Serialize, Deserialize, PartialEq, Debug)] struct Test { byte: i8, short: i16, From bc411ea90fcb3c5d9a1437d0f62435f98fe48840 Mon Sep 17 00:00:00 2001 From: Hongas Date: Sat, 1 Feb 2025 23:28:19 +0700 Subject: [PATCH 8/8] fixes in_struct field disappearing --- pumpkin-nbt/src/serializer.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/pumpkin-nbt/src/serializer.rs b/pumpkin-nbt/src/serializer.rs index dd8d5a653..a5ee4c917 100644 --- a/pumpkin-nbt/src/serializer.rs +++ b/pumpkin-nbt/src/serializer.rs @@ -71,6 +71,7 @@ where let mut serializer = Serializer { output: BytesMut::new(), state: State::Root(None), + in_struct: false, }; value.serialize_child(&mut serializer)?; Ok(serializer.output)