azalea_protocol/packets/game/
c_set_objective.rs

1use std::io::{Cursor, Write};
2
3use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite};
4use azalea_chat::{numbers::NumberFormat, FormattedText};
5use azalea_core::objectives::ObjectiveCriteria;
6use azalea_protocol_macros::ClientboundGamePacket;
7
8#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
9pub struct ClientboundSetObjective {
10    pub objective_name: String,
11    pub method: Method,
12}
13
14#[derive(Clone, Copy, Debug, AzBuf)]
15pub enum MethodKind {
16    Add,
17    Remove,
18    Change,
19}
20
21#[derive(Clone, Debug)]
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 AzaleaRead 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}
54
55impl AzaleaWrite for Method {
56    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
57        match self {
58            Method::Add {
59                display_name,
60                render_type,
61                number_format,
62            } => {
63                MethodKind::Add.azalea_write(buf)?;
64                display_name.azalea_write(buf)?;
65                render_type.azalea_write(buf)?;
66                number_format.azalea_write(buf)?;
67            }
68            Method::Remove => MethodKind::Remove.azalea_write(buf)?,
69            Method::Change {
70                display_name,
71                render_type,
72                number_format,
73            } => {
74                MethodKind::Change.azalea_write(buf)?;
75                display_name.azalea_write(buf)?;
76                render_type.azalea_write(buf)?;
77                number_format.azalea_write(buf)?;
78            }
79        }
80        Ok(())
81    }
82}