1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
use std::io::{self, Cursor, Write};
use azalea_buf::AzBuf;
use azalea_chat::FormattedText;
use azalea_protocol_macros::ClientboundGamePacket;
#[derive(AzBuf, ClientboundGamePacket, Clone, Debug, PartialEq)]
pub struct ClientboundMapItemData {
#[var]
pub map_id: u32,
pub scale: u8,
pub locked: bool,
pub decorations: Option<Vec<MapDecoration>>,
pub color_patch: OptionalMapPatch,
}
#[derive(AzBuf, Clone, Debug, PartialEq)]
pub struct MapDecoration {
pub decoration_type: DecorationType,
pub x: i8,
pub y: i8,
/// Minecraft does `& 15` on this value and azalea-protocol doesn't. I don't
/// think it matters.
pub rot: i8,
pub name: Option<FormattedText>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct OptionalMapPatch(pub Option<MapPatch>);
impl AzBuf for OptionalMapPatch {
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
let pos = buf.position();
Ok(Self(if u8::azalea_read(buf)? == 0 {
None
} else {
buf.set_position(pos);
Some(MapPatch::azalea_read(buf)?)
}))
}
fn azalea_write(&self, buf: &mut impl Write) -> io::Result<()> {
match &self.0 {
None => 0u8.azalea_write(buf),
Some(m) => m.azalea_write(buf),
}
}
}
#[derive(AzBuf, Clone, Debug, PartialEq)]
pub struct MapPatch {
pub width: u8,
pub height: u8,
pub start_x: u8,
pub start_y: u8,
pub map_colors: Vec<u8>,
}
#[derive(AzBuf, Clone, Copy, Debug, PartialEq)]
pub enum DecorationType {
Player,
Frame,
RedMarker,
BlueMarker,
TargetX,
TargetPoint,
PlayerOffMap,
PlayerOffLimits,
Mansion,
Monument,
BannerWhite,
BannerOrange,
BannerMagenta,
BannerLightBlue,
BannerYellow,
BannerLime,
BannerPink,
BannerGray,
BannerLightGray,
BannerCyan,
BannerPurple,
BannerBlue,
BannerBrown,
BannerGreen,
BannerRed,
BannerBlack,
RedX,
}
|