minecraft_net/fields/
block_predicate.rs

1use 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}