steel_protocol/packets/game/chunk/
light.rs1use 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}