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 pub position: [i8; 2],
22 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}