azalea_protocol/packets/game/
c_stop_sound.rs

1use std::io::{Cursor, Write};
2
3use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError};
4use azalea_core::{bitset::FixedBitSet, resource_location::ResourceLocation};
5use azalea_protocol_macros::ClientboundGamePacket;
6
7use super::c_sound::SoundSource;
8
9#[derive(Clone, Debug, ClientboundGamePacket)]
10pub struct ClientboundStopSound {
11    pub source: Option<SoundSource>,
12    pub name: Option<ResourceLocation>,
13}
14
15impl AzaleaRead for ClientboundStopSound {
16    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
17        let set = FixedBitSet::<{ 2_usize.div_ceil(8) }>::azalea_read(buf)?;
18        let source = if set.index(0) {
19            Some(SoundSource::azalea_read(buf)?)
20        } else {
21            None
22        };
23        let name = if set.index(1) {
24            Some(ResourceLocation::azalea_read(buf)?)
25        } else {
26            None
27        };
28
29        Ok(Self { source, name })
30    }
31}
32
33impl AzaleaWrite for ClientboundStopSound {
34    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
35        let mut set = FixedBitSet::<{ 2_usize.div_ceil(8) }>::new();
36        if self.source.is_some() {
37            set.set(0);
38        }
39        if self.name.is_some() {
40            set.set(1);
41        }
42        set.azalea_write(buf)?;
43        if let Some(source) = &self.source {
44            source.azalea_write(buf)?;
45        }
46        if let Some(name) = &self.name {
47            name.azalea_write(buf)?;
48        }
49        Ok(())
50    }
51}