nurtex_protocol/types/
light_data.rs1use nurtex_codec::Buffer;
2use nurtex_codec::read_bytes;
3use nurtex_codec::types::variable::VarI32;
4
5use super::BitSet;
6
7#[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#[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}