Skip to main content

nurtex_protocol/types/
light_data.rs

1use nurtex_codec::Buffer;
2use nurtex_codec::read_bytes;
3use nurtex_codec::types::variable::VarI32;
4
5use super::BitSet;
6
7/// Массив данных света
8#[derive(Clone, Debug, PartialEq)]
9pub struct LightArray {
10  pub bytes: Vec<u8>,
11}
12
13impl Buffer for LightArray {
14  fn read_buf(buffer: &mut std::io::Cursor<&[u8]>) -> Option<Self> {
15    let len = i32::read_var(buffer)? as usize;
16    let data = read_bytes(buffer, len)?.to_vec();
17    Some(Self { bytes: data })
18  }
19
20  fn write_buf(&self, buffer: &mut impl std::io::Write) -> std::io::Result<()> {
21    (self.bytes.len() as i32).write_var(buffer)?;
22    buffer.write_all(&self.bytes)
23  }
24}
25
26/// Данные света
27#[derive(Clone, Debug, PartialEq)]
28pub struct LightData {
29  pub sky_y_mask: BitSet,
30  pub block_y_mask: BitSet,
31  pub empty_sky_y_mask: BitSet,
32  pub empty_block_y_mask: BitSet,
33  pub sky_updates: Vec<LightArray>,
34  pub block_updates: Vec<LightArray>,
35}
36
37impl Buffer for LightData {
38  fn read_buf(buffer: &mut std::io::Cursor<&[u8]>) -> Option<Self> {
39    let sky_y_mask = BitSet::read_buf(buffer)?;
40    let block_y_mask = BitSet::read_buf(buffer)?;
41    let empty_sky_y_mask = BitSet::read_buf(buffer)?;
42    let empty_block_y_mask = BitSet::read_buf(buffer)?;
43
44    let sky_count = i32::read_var(buffer)? as usize;
45    let mut sky_updates = Vec::with_capacity(sky_count);
46
47    for _ in 0..sky_count {
48      sky_updates.push(LightArray::read_buf(buffer)?);
49    }
50
51    let block_count = i32::read_var(buffer)? as usize;
52    let mut block_updates = Vec::with_capacity(block_count);
53
54    for _ in 0..block_count {
55      block_updates.push(LightArray::read_buf(buffer)?);
56    }
57
58    Some(Self {
59      sky_y_mask,
60      block_y_mask,
61      empty_sky_y_mask,
62      empty_block_y_mask,
63      sky_updates,
64      block_updates,
65    })
66  }
67
68  fn write_buf(&self, buffer: &mut impl std::io::Write) -> std::io::Result<()> {
69    self.sky_y_mask.write_buf(buffer)?;
70    self.block_y_mask.write_buf(buffer)?;
71    self.empty_sky_y_mask.write_buf(buffer)?;
72    self.empty_block_y_mask.write_buf(buffer)?;
73
74    (self.sky_updates.len() as i32).write_var(buffer)?;
75
76    for arr in &self.sky_updates {
77      arr.write_buf(buffer)?;
78    }
79
80    (self.block_updates.len() as i32).write_var(buffer)?;
81
82    for arr in &self.block_updates {
83      arr.write_buf(buffer)?;
84    }
85
86    Ok(())
87  }
88}