Skip to main content

steel_protocol/packets/game/chunk/
light.rs

1use steel_macros::{ClientPacket, WriteTo};
2use steel_registry::packets::play::C_LIGHT_UPDATE;
3
4use super::LightUpdatePacketData;
5
6#[derive(ClientPacket, Debug, Clone, WriteTo)]
7#[packet_id(Play = C_LIGHT_UPDATE)]
8pub struct CLightUpdate {
9    #[write(as = VarInt)]
10    pub x: i32,
11    #[write(as = VarInt)]
12    pub z: i32,
13    pub light_data: LightUpdatePacketData,
14}
15
16#[cfg(test)]
17mod tests {
18    use std::io::Cursor;
19
20    use steel_utils::{
21        codec::{BitSet, VarInt},
22        serial::{ReadFrom, WriteTo},
23    };
24
25    use super::CLightUpdate;
26    use crate::packets::game::LightUpdatePacketData;
27
28    #[test]
29    fn writes_chunk_coordinates_as_varints_and_trims_empty_masks() {
30        fn empty_mask() -> BitSet {
31            BitSet(vec![0].into_boxed_slice())
32        }
33
34        let packet = CLightUpdate {
35            x: 2,
36            z: -3,
37            light_data: LightUpdatePacketData {
38                sky_y_mask: empty_mask(),
39                block_y_mask: empty_mask(),
40                empty_sky_y_mask: empty_mask(),
41                empty_block_y_mask: empty_mask(),
42                sky_updates: Vec::new(),
43                block_updates: Vec::new(),
44            },
45        };
46
47        let mut data = Vec::new();
48        let Ok(()) = packet.write(&mut data) else {
49            panic!("light update packet should encode");
50        };
51
52        let mut cursor = Cursor::new(data.as_slice());
53        let Ok(x) = VarInt::read(&mut cursor) else {
54            panic!("x varint missing");
55        };
56        let Ok(z) = VarInt::read(&mut cursor) else {
57            panic!("z varint missing");
58        };
59        assert_eq!(x.0, 2);
60        assert_eq!(z.0, -3);
61        for _ in 0..4 {
62            let Ok(mask_len) = VarInt::read(&mut cursor) else {
63                panic!("light mask length missing");
64            };
65            assert_eq!(mask_len.0, 0);
66        }
67    }
68}