use std::io::{self, Cursor, Write}; use azalea_buf::{AzBuf, BufReadError}; use azalea_core::{bitset::FixedBitSet, position::BlockPos}; use azalea_protocol_macros::ServerboundGamePacket; #[derive(Clone, Debug, PartialEq, ServerboundGamePacket)] pub struct ServerboundSetCommandBlock { pub pos: BlockPos, pub command: String, pub mode: Mode, pub track_output: bool, pub conditional: bool, pub automatic: bool, } #[derive(AzBuf, Clone, Copy, Debug, PartialEq)] pub enum Mode { Sequence = 0, Auto = 1, Redstone = 2, } impl AzBuf for ServerboundSetCommandBlock { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { let pos = BlockPos::azalea_read(buf)?; let command = String::azalea_read(buf)?; let mode = Mode::azalea_read(buf)?; let set = FixedBitSet::<3>::azalea_read(buf)?; Ok(Self { pos, command, mode, track_output: set.index(0), conditional: set.index(1), automatic: set.index(2), }) } fn azalea_write(&self, buf: &mut impl Write) -> io::Result<()> { self.pos.azalea_write(buf)?; self.command.azalea_write(buf)?; self.mode.azalea_write(buf)?; let mut set = FixedBitSet::<3>::new(); if self.track_output { set.set(0); } if self.conditional { set.set(1); } if self.automatic { set.set(2); } set.azalea_write(buf) } }