valence_protocol/packets/play/
map_update_s2c.rs

1use std::borrow::Cow;
2use std::io::Write;
3
4use valence_text::Text;
5
6use crate::{Decode, Encode, Packet, VarInt};
7
8#[derive(Clone, PartialEq, Debug, Packet)]
9pub struct MapUpdateS2c<'a> {
10    pub map_id: VarInt,
11    pub scale: i8,
12    pub locked: bool,
13    pub icons: Option<Vec<Icon<'a>>>,
14    pub data: Option<Data<'a>>,
15}
16
17#[derive(Clone, PartialEq, Debug, Encode, Decode)]
18pub struct Icon<'a> {
19    pub icon_type: IconType,
20    /// In map coordinates; -128 for furthest left, +127 for furthest right
21    pub position: [i8; 2],
22    /// 0 is a vertical icon and increments by 22.5°
23    pub direction: i8,
24    pub display_name: Option<Cow<'a, Text>>,
25}
26
27#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode)]
28pub enum IconType {
29    WhiteArrow,
30    GreenArrow,
31    RedArrow,
32    BlueArrow,
33    WhiteCross,
34    RedPointer,
35    WhiteCircle,
36    SmallWhiteCircle,
37    Mansion,
38    Temple,
39    WhiteBanner,
40    OrangeBanner,
41    MagentaBanner,
42    LightBlueBanner,
43    YellowBanner,
44    LimeBanner,
45    PinkBanner,
46    GrayBanner,
47    LightGrayBanner,
48    CyanBanner,
49    PurpleBanner,
50    BlueBanner,
51    BrownBanner,
52    GreenBanner,
53    RedBanner,
54    BlackBanner,
55    TreasureMarker,
56}
57
58#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode)]
59pub struct Data<'a> {
60    pub columns: u8,
61    pub rows: u8,
62    pub position: [i8; 2],
63    pub data: &'a [u8],
64}
65
66impl Encode for MapUpdateS2c<'_> {
67    fn encode(&self, mut w: impl Write) -> anyhow::Result<()> {
68        self.map_id.encode(&mut w)?;
69        self.scale.encode(&mut w)?;
70        self.locked.encode(&mut w)?;
71        self.icons.encode(&mut w)?;
72
73        match self.data {
74            None => 0_u8.encode(&mut w)?,
75            Some(data) => data.encode(&mut w)?,
76        }
77
78        Ok(())
79    }
80}
81
82impl<'a> Decode<'a> for MapUpdateS2c<'a> {
83    fn decode(r: &mut &'a [u8]) -> anyhow::Result<Self> {
84        let map_id = VarInt::decode(r)?;
85        let scale = i8::decode(r)?;
86        let locked = bool::decode(r)?;
87        let icons = <Option<Vec<Icon<'a>>>>::decode(r)?;
88        let columns = u8::decode(r)?;
89
90        let data = if columns > 0 {
91            let rows = u8::decode(r)?;
92            let position = <[i8; 2]>::decode(r)?;
93            let data = <&'a [u8]>::decode(r)?;
94
95            Some(Data {
96                columns,
97                rows,
98                position,
99                data,
100            })
101        } else {
102            None
103        };
104
105        Ok(Self {
106            map_id,
107            scale,
108            locked,
109            icons,
110            data,
111        })
112    }
113}