From 6c1870c9405a80cb9f08e7fbb2db0b504522e1b2 Mon Sep 17 00:00:00 2001 From: Lizzy Fleckenstein Date: Tue, 14 Feb 2023 16:17:20 +0100 Subject: [PATCH] Implement NodeMeta and add Inventory stub --- Cargo.toml | 8 ++-- src/to_clt.rs | 50 +++++++++++++++++++--- src/to_clt/chat.rs | 16 ------- src/to_clt/inv.rs | 37 ++++++++++++++++ src/to_clt/{status.rs => kick.rs} | 17 -------- src/to_clt/map.rs | 71 +++++++++++++++++++++++++++++++ src/to_clt/media.rs | 3 -- src/to_clt/{env.rs => obj.rs} | 32 +------------- 8 files changed, 156 insertions(+), 78 deletions(-) delete mode 100644 src/to_clt/chat.rs create mode 100644 src/to_clt/inv.rs rename src/to_clt/{status.rs => kick.rs} (87%) create mode 100644 src/to_clt/map.rs rename src/to_clt/{env.rs => obj.rs} (81%) diff --git a/Cargo.toml b/Cargo.toml index 10a512e..eb9d99c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,17 +5,17 @@ edition = "2021" [features] all = ["client", "server", "random", "serde"] -test = ["client", "server", "random"] client = [] random = ["dep:generate-random", "dep:rand"] serde = ["dep:serde", "dep:serde_arrays", "enumset/serde"] server = [] +test = ["client", "server", "random"] [dependencies] -mt_ser = { git = "https://github.com/minetest-rust/mt_ser" } -#mt_ser = { path = "../mt_ser" } enumset = { git = "https://github.com/Lymia/enumset" } generate-random = { git = "https://github.com/minetest-rust/generate-random", features = ["enumset"], optional = true } +mt_ser = { git = "https://github.com/minetest-rust/mt_ser" } +#mt_ser = { path = "../mt_ser" } rand = { version = "0.8.5", optional = true } serde = { version = "1.0.152", features = ["derive"], optional = true } serde_arrays = { version = "0.1.0", optional = true } @@ -24,6 +24,6 @@ serde_arrays = { version = "0.1.0", optional = true } libtest-mimic = "0.6.0" [[test]] +harness = false name = "random" path = "tests/random.rs" -harness = false diff --git a/src/to_clt.rs b/src/to_clt.rs index 9aa9196..9848dae 100644 --- a/src/to_clt.rs +++ b/src/to_clt.rs @@ -18,19 +18,53 @@ pub enum ModChanSig { SetState, } -mod chat; -mod env; +#[mt_derive(to = "clt", repr = "u32", enumset)] +pub enum AuthMethod { + LegacyPasswd, + Srp, + FirstSrp, +} + +#[mt_derive(to = "clt", repr = "u64", enumset)] +pub enum CsmRestrictionFlag { + NoCsms, + NoChatMsgs, + NoItemDefs, + NoNodeDefs, + LimitMapRange, + NoPlayerList, +} + +#[mt_derive(to = "clt", repr = "u8")] +pub enum ChatMsgType { + Raw = 0, + Normal, + Announce, + System, +} + +#[mt_derive(to = "clt", repr = "u8")] +pub enum PlayerListUpdateType { + Init = 0, + Add, + Remove, +} + mod hud; +mod inv; +mod kick; +mod map; mod media; +mod obj; mod sky; -mod status; -pub use chat::*; -pub use env::*; pub use hud::*; +pub use inv::*; +pub use kick::*; +pub use map::*; pub use media::*; +pub use obj::*; pub use sky::*; -pub use status::*; #[mt_derive(to = "clt", repr = "u16", tag = "type", content = "data")] pub enum ToCltPkt { @@ -69,6 +103,7 @@ pub enum ToCltPkt { pos: [i16; 3], } = 34, Inv { + #[mt(len = "()")] inv: String, } = 39, TimeOfDay { @@ -297,7 +332,8 @@ pub enum ToCltPkt { channel: String, } = 88, NodeMetasChanged { - #[mt(size = "u32")] + #[mt(size = "u32", zlib)] + #[mt(len = "NodeMetasLen")] changed: HashMap<[i16; 3], NodeMeta>, } = 89, SunParams(SunParams) = 90, diff --git a/src/to_clt/chat.rs b/src/to_clt/chat.rs deleted file mode 100644 index 4d99853..0000000 --- a/src/to_clt/chat.rs +++ /dev/null @@ -1,16 +0,0 @@ -use super::*; - -#[mt_derive(to = "clt", repr = "u8")] -pub enum ChatMsgType { - Raw = 0, - Normal, - Announce, - System, -} - -#[mt_derive(to = "clt", repr = "u8")] -pub enum PlayerListUpdateType { - Init = 0, - Add, - Remove, -} diff --git a/src/to_clt/inv.rs b/src/to_clt/inv.rs new file mode 100644 index 0000000..2ada0a1 --- /dev/null +++ b/src/to_clt/inv.rs @@ -0,0 +1,37 @@ +use super::*; +use mt_ser::{DeserializeError, SerializeError}; +use std::io::{Read, Write}; + +#[mt_derive(to = "clt", custom)] +pub struct Inventory; // TODO + +#[cfg(feature = "server")] +impl MtSerialize for Inventory { + fn mt_serialize(&self, writer: &mut impl Write) -> Result<(), SerializeError> { + "EndInventory\n".mt_serialize::<()>(writer) + } +} + +fn read_line(reader: &mut impl Read) -> Result { + let utf8 = mt_ser::mt_deserialize_seq::<(), u8>(reader)? + .map_while(|x| match x { + Ok(0x0A) => None, + x => Some(x), + }) + .try_collect::>()?; + + String::from_utf8(utf8) + .map_err(|e| DeserializeError::Other(format!("Invalid UTF-8: {e}").into())) +} + +#[cfg(feature = "client")] +impl MtDeserialize for Inventory { + fn mt_deserialize(reader: &mut impl Read) -> Result { + loop { + match read_line(reader)?.as_str() { + "EndInventory" => return Ok(Self), + _ => {} + } + } + } +} diff --git a/src/to_clt/status.rs b/src/to_clt/kick.rs similarity index 87% rename from src/to_clt/status.rs rename to src/to_clt/kick.rs index 54adb45..6389df6 100644 --- a/src/to_clt/status.rs +++ b/src/to_clt/kick.rs @@ -61,20 +61,3 @@ impl fmt::Display for KickReason { } } } - -#[mt_derive(to = "clt", repr = "u32", enumset)] -pub enum AuthMethod { - LegacyPasswd, - Srp, - FirstSrp, -} - -#[mt_derive(to = "clt", repr = "u64", enumset)] -pub enum CsmRestrictionFlag { - NoCsms, - NoChatMsgs, - NoItemDefs, - NoNodeDefs, - LimitMapRange, - NoPlayerList, -} diff --git a/src/to_clt/map.rs b/src/to_clt/map.rs new file mode 100644 index 0000000..296a23f --- /dev/null +++ b/src/to_clt/map.rs @@ -0,0 +1,71 @@ +use super::*; +use mt_ser::{DeserializeError, SerializeError}; + +#[mt_derive(to = "clt", repr = "u8", enumset)] +pub enum MapBlockFlag { + IsUnderground = 0, + DayNightDiff, + LightExpired, + NotGenerated, +} + +pub const ALWAYS_LIT_FROM: u16 = 0xf000; + +pub const CONTENT_UNKNOWN: u16 = 125; +pub const CONTENT_AIR: u16 = 126; +pub const CONTENT_IGNORE: u16 = 127; + +#[mt_derive(to = "clt")] +pub struct NodeMetaField { + #[mt(len = "u32")] + value: String, + private: bool, +} + +#[mt_derive(to = "clt")] +pub struct NodeMeta { + #[mt(len = "u32")] + fields: HashMap, + inv: Inventory, +} + +#[derive(Debug)] +pub struct NodeMetasLen; + +impl MtCfg for NodeMetasLen { + type Len = ::Len; + type Inner = ::Inner; + + fn write_len(len: usize, writer: &mut impl std::io::Write) -> Result<(), SerializeError> { + if len == 0 { + 0u8.mt_serialize::(writer) + } else { + 2u8.mt_serialize::(writer)?; + DefCfg::write_len(len, writer) + } + } + + fn read_len(reader: &mut impl std::io::Read) -> Result { + match u8::mt_deserialize::(reader)? { + 0 => Ok(0), + 2 => DefCfg::read_len(reader), + x => Err(DeserializeError::InvalidEnum("NodeMetasLen", Box::new(x))), + } + } +} + +#[mt_derive(to = "clt")] +pub struct MapBlock { + pub flags: EnumSet, + pub lit_from: u16, + #[mt(const_before = "2u8")] // param0 size + #[mt(const_before = "2u8")] // param1 size + param2 size + #[serde(with = "serde_arrays")] + pub param_0: [u16; 4096], + #[serde(with = "serde_arrays")] + pub param_1: [u8; 4096], + #[serde(with = "serde_arrays")] + pub param_2: [u8; 4096], + #[mt(len = "NodeMetasLen")] + pub metas: HashMap, +} diff --git a/src/to_clt/media.rs b/src/to_clt/media.rs index 50c709f..2cd516b 100644 --- a/src/to_clt/media.rs +++ b/src/to_clt/media.rs @@ -9,9 +9,6 @@ pub struct ItemDef; // TODO #[mt_derive(to = "clt")] pub struct NodeDef; // TODO -#[mt_derive(to = "clt")] -pub struct NodeMeta; // TODO - #[mt_derive(to = "clt", repr = "u8")] pub enum SoundSrcType { Nowhere = 0, diff --git a/src/to_clt/env.rs b/src/to_clt/obj.rs similarity index 81% rename from src/to_clt/env.rs rename to src/to_clt/obj.rs index ecd3db3..9e88fff 100644 --- a/src/to_clt/env.rs +++ b/src/to_clt/obj.rs @@ -107,7 +107,7 @@ pub const GENERIC_CAO: u8 = 101; #[mt_derive(to = "clt", repr = "u8", tag = "type", content = "data")] pub enum ObjMsg { - Props(ObjProps) = 0, + Props(Box) = 0, Pos(ObjPos), TextureMod { #[serde(rename = "mod")] @@ -166,33 +166,3 @@ pub struct ObjAdd { #[mt(size = "u32")] pub init_data: ObjInitData, } - -#[mt_derive(to = "clt", repr = "u8", enumset)] -pub enum MapBlockFlag { - IsUnderground = 0, - DayNightDiff, - LightExpired, - NotGenerated, -} - -pub const ALWAYS_LIT_FROM: u16 = 0xf000; - -pub const CONTENT_UNKNOWN: u16 = 125; -pub const CONTENT_AIR: u16 = 126; -pub const CONTENT_IGNORE: u16 = 127; - -#[mt_derive(to = "clt")] -pub struct MapBlock { - pub flags: EnumSet, - pub lit_from: u16, - #[mt(const_before = "2u8")] // param0 size - #[mt(const_before = "2u8")] // param1 size + param2 size - #[serde(with = "serde_arrays")] - pub param_0: [u16; 4096], - #[serde(with = "serde_arrays")] - pub param_1: [u8; 4096], - #[serde(with = "serde_arrays")] - pub param_2: [u8; 4096], - #[mt(const_after = "2u8")] // version - pub node_metas: HashMap, -} -- 2.44.0