]> git.lizzy.rs Git - mt_net.git/blob - src/to_clt/map.rs
Implement NodeDefs and ItemDefs
[mt_net.git] / src / to_clt / map.rs
1 use super::*;
2
3 #[mt_derive(to = "clt", repr = "u8", enumset)]
4 pub enum MapBlockFlag {
5     IsUnderground = 0,
6     DayNightDiff,
7     LightExpired,
8     NotGenerated,
9 }
10
11 pub const ALWAYS_LIT_FROM: u16 = 0xf000;
12
13 pub const CONTENT_UNKNOWN: u16 = 125;
14 pub const CONTENT_AIR: u16 = 126;
15 pub const CONTENT_IGNORE: u16 = 127;
16
17 #[mt_derive(to = "clt")]
18 pub struct NodeMetaField {
19     #[mt(len = "u32")]
20     value: String,
21     private: bool,
22 }
23
24 #[mt_derive(to = "clt")]
25 pub struct NodeMeta {
26     #[mt(len = "u32")]
27     fields: HashMap<String, NodeMetaField>,
28     inv: Inventory,
29 }
30
31 #[derive(Debug)]
32 pub struct NodeMetasLen;
33
34 #[cfg(any(feature = "client", feature = "server"))]
35 impl MtCfg for NodeMetasLen {
36     type Len = <DefCfg as MtCfg>::Len;
37     type Inner = <DefCfg as MtCfg>::Inner;
38
39     fn write_len(
40         len: usize,
41         writer: &mut impl std::io::Write,
42     ) -> Result<(), mt_ser::SerializeError> {
43         if len == 0 {
44             0u8.mt_serialize::<DefCfg>(writer)
45         } else {
46             2u8.mt_serialize::<DefCfg>(writer)?;
47             DefCfg::write_len(len, writer)
48         }
49     }
50
51     fn read_len(reader: &mut impl std::io::Read) -> Result<Self::Len, mt_ser::DeserializeError> {
52         match u8::mt_deserialize::<DefCfg>(reader)? {
53             0 => Ok(0),
54             2 => DefCfg::read_len(reader),
55             x => Err(mt_ser::DeserializeError::InvalidEnum(
56                 "NodeMetasLen",
57                 Box::new(x),
58             )),
59         }
60     }
61 }
62
63 #[mt_derive(to = "clt")]
64 pub struct MapBlock {
65     pub flags: EnumSet<MapBlockFlag>,
66     pub lit_from: u16,
67     #[mt(const_before = "2u8")] // param0 size
68     #[mt(const_before = "2u8")] // param1 size + param2 size
69     #[serde(with = "serde_arrays")]
70     pub param_0: [u16; 4096],
71     #[serde(with = "serde_arrays")]
72     pub param_1: [u8; 4096],
73     #[serde(with = "serde_arrays")]
74     pub param_2: [u8; 4096],
75     #[mt(len = "NodeMetasLen")]
76     pub metas: HashMap<u16, NodeMeta>,
77 }