chunkedge_protocol/packets/play/
map_item_data_s2c.rs1use 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 pub position: [i8; 2],
22 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}