minecraft_net/fields/
block_predicate.rs1use crate::fields::types::*;
2use crate::fields::types::{PrefixedOptional, NBT};
3use crate::fields::{encode_bool, encode_string};
4use crate::fields::general::IDSet;
5use crate::{Field, PacketReader, Result};
6use minecraft_net_proc::Field_old;
7
8#[derive(Debug, Clone, Field_old)]
9pub struct BlockPredicate {
10 pub blocks: PrefixedOptional<IDSet>,
11 pub properties: PrefixedOptional<PrefixedArray<Property>>,
12 pub nbt: PrefixedOptional<NBT>,
13}
14#[derive(Debug, Clone)]
15pub struct Property {
16 name: String,
17 is_exact_match: bool,
18 exact_value: Option<String>,
19 min_value: Option<String>,
20 max_value: Option<String>,
21}
22impl Field for Property {
23 fn to_bytes(&self) -> Vec<u8> {
24 let mut res = encode_string(self.name.clone());
25 res.append(&mut encode_bool(self.is_exact_match));
26 if self.is_exact_match {
27 res.append(&mut encode_string(self.exact_value.clone().expect("Property value not provided")));
28 } else {
29 res.append(&mut encode_string(self.min_value.clone().expect("Property min value not provided")));
30 res.append(&mut encode_string(self.max_value.clone().expect("Property max value not provided")));
31 }
32 res
33 }
34 fn from_reader(reader: &mut PacketReader) -> Result<Self> {
35 let name = reader.read_string()?;
36 let is_exact_match = reader.read_bool()?;
37 if is_exact_match {
38 Ok(Self {
39 name, is_exact_match,
40 exact_value: Some(reader.read_string()?),
41 min_value: None,
42 max_value: None,
43 })
44 } else {
45 Ok(Self {
46 name, is_exact_match,
47 exact_value: None,
48 min_value: Some(reader.read_string()?),
49 max_value: Some(reader.read_string()?),
50 })
51 }
52 }
53}