chunkedge_protocol/packets/play/
map_item_data_s2c.rs

1use std::borrow::Cow;
2use std::io::Write;
3
4use chunkedge_binary::{Decode, Encode, TextComponent, VarInt};
5
6use crate::Packet;
7
8#[derive(Clone, PartialEq, Debug, Packet)]
9pub struct MapItemDataS2c<'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, TextComponent>>,
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    DesertVillage,
57    PlainsVillage,
58    SavannaVillage,
59    SnowyVillage,
60    TaigaVillage,
61    JungleTemple,
62    SwampHut,
63    TrialChambers,
64}
65
66#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode)]
67pub struct Data<'a> {
68    pub columns: u8,
69    pub rows: u8,
70    pub position: [i8; 2],
71    pub data: &'a [u8],
72}
73
74impl Encode for MapItemDataS2c<'_> {
75    fn encode(&self, mut w: impl Write) -> anyhow::Result<()> {
76        self.map_id.encode(&mut w)?;
77        self.scale.encode(&mut w)?;
78        self.locked.encode(&mut w)?;
79        self.icons.encode(&mut w)?;
80
81        match self.data {
82            None => 0_u8.encode(&mut w)?,
83            Some(data) => data.encode(&mut w)?,
84        }
85
86        Ok(())
87    }
88}
89
90impl<'a> Decode<'a> for MapItemDataS2c<'a> {
91    fn decode(r: &mut &'a [u8]) -> anyhow::Result<Self> {
92        let map_id = VarInt::decode(r)?;
93        let scale = i8::decode(r)?;
94        let locked = bool::decode(r)?;
95        let icons = <Option<Vec<Icon<'a>>>>::decode(r)?;
96        let columns = u8::decode(r)?;
97
98        let data = if columns > 0 {
99            let rows = u8::decode(r)?;
100            let position = <[i8; 2]>::decode(r)?;
101            let data = <&'a [u8]>::decode(r)?;
102
103            Some(Data {
104                columns,
105                rows,
106                position,
107                data,
108            })
109        } else {
110            None
111        };
112
113        Ok(Self {
114            map_id,
115            scale,
116            locked,
117            icons,
118            data,
119        })
120    }
121}