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