chunkedge_protocol/packets/play/
section_blocks_update_s2c.rs

1use std::borrow::Cow;
2use std::io::Write;
3
4use bitfield_struct::bitfield;
5use chunkedge_binary::{Decode, Encode, VarLong};
6
7use crate::chunk_section_pos::ChunkSectionPos;
8use crate::Packet;
9
10#[derive(Clone, Debug, Encode, Decode, Packet)]
11pub struct SectionBlocksUpdateS2c<'a> {
12    pub chunk_sect_pos: ChunkSectionPos,
13    pub blocks: Cow<'a, [ChunkDeltaUpdateEntry]>,
14}
15
16#[bitfield(u64)]
17#[derive(PartialEq, Eq)]
18pub struct ChunkDeltaUpdateEntry {
19    #[bits(4)]
20    pub off_y: u8,
21    #[bits(4)]
22    pub off_z: u8,
23    #[bits(4)]
24    pub off_x: u8,
25    pub block_state: u32,
26    #[bits(20)]
27    _pad: u32,
28}
29
30impl Encode for ChunkDeltaUpdateEntry {
31    fn encode(&self, w: impl Write) -> anyhow::Result<()> {
32        VarLong(self.0 as i64).encode(w)
33    }
34}
35
36impl Decode<'_> for ChunkDeltaUpdateEntry {
37    fn decode(r: &mut &[u8]) -> anyhow::Result<Self> {
38        Ok(ChunkDeltaUpdateEntry(VarLong::decode(r)?.0 as u64))
39    }
40}