Skip to main content

azalea_protocol/packets/game/
c_set_objective.rs

1use std::io::{self, Cursor, Write};
2
3use azalea_buf::AzBuf;
4use azalea_chat::{FormattedText, numbers::NumberFormat};
5use azalea_core::objectives::ObjectiveCriteria;
6use azalea_protocol_macros::ClientboundGamePacket;
7
8#[derive(AzBuf, ClientboundGamePacket, Clone, Debug, PartialEq)]
9pub struct ClientboundSetObjective {
10    pub objective_name: String,
11    pub method: Method,
12}
13
14#[derive(AzBuf, Clone, Copy, Debug, PartialEq)]
15pub enum MethodKind {
16    Add,
17    Remove,
18    Change,
19}
20
21#[derive(Clone, Debug, PartialEq)]
22pub enum Method {
23    Add {
24        display_name: FormattedText,
25        render_type: ObjectiveCriteria,
26        number_format: NumberFormat,
27    },
28    Remove,
29    Change {
30        display_name: FormattedText,
31        render_type: ObjectiveCriteria,
32        number_format: NumberFormat,
33    },
34}
35
36impl AzBuf for Method {
37    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
38        let kind = MethodKind::azalea_read(buf)?;
39        match kind {
40            MethodKind::Add => Ok(Method::Add {
41                display_name: FormattedText::azalea_read(buf)?,
42                render_type: ObjectiveCriteria::azalea_read(buf)?,
43                number_format: NumberFormat::azalea_read(buf)?,
44            }),
45            MethodKind::Remove => Ok(Method::Remove),
46            MethodKind::Change => Ok(Method::Change {
47                display_name: FormattedText::azalea_read(buf)?,
48                render_type: ObjectiveCriteria::azalea_read(buf)?,
49                number_format: NumberFormat::azalea_read(buf)?,
50            }),
51        }
52    }
53    fn azalea_write(&self, buf: &mut impl Write) -> io::Result<()> {
54        match self {
55            Method::Add {
56                display_name,
57                render_type,
58                number_format,
59            } => {
60                MethodKind::Add.azalea_write(buf)?;
61                display_name.azalea_write(buf)?;
62                render_type.azalea_write(buf)?;
63                number_format.azalea_write(buf)?;
64            }
65            Method::Remove => MethodKind::Remove.azalea_write(buf)?,
66            Method::Change {
67                display_name,
68                render_type,
69                number_format,
70            } => {
71                MethodKind::Change.azalea_write(buf)?;
72                display_name.azalea_write(buf)?;
73                render_type.azalea_write(buf)?;
74                number_format.azalea_write(buf)?;
75            }
76        }
77        Ok(())
78    }
79}