azalea_protocol/packets/game/
c_stop_sound.rs1use 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}