valence_protocol/packets/play/
scoreboard_display_s2c.rs
1use bevy_ecs::prelude::Component;
2
3use super::team_s2c::TeamColor;
4use crate::{Decode, Encode, Packet};
5
6#[derive(Copy, Clone, Debug, Encode, Decode, Packet)]
7pub struct ScoreboardDisplayS2c<'a> {
8 pub position: ScoreboardPosition,
9 pub score_name: &'a str,
10}
11
12#[derive(Copy, Clone, PartialEq, Eq, Debug, Component, Default)]
14pub enum ScoreboardPosition {
15 List,
18 #[default]
20 Sidebar,
21 BelowName,
23 SidebarTeam(TeamColor),
25}
26
27impl Encode for ScoreboardPosition {
28 fn encode(&self, w: impl std::io::Write) -> anyhow::Result<()> {
29 match self {
30 ScoreboardPosition::List => 0_u8.encode(w),
31 ScoreboardPosition::Sidebar => 1_u8.encode(w),
32 ScoreboardPosition::BelowName => 2_u8.encode(w),
33 ScoreboardPosition::SidebarTeam(TeamColor::Black) => 3_u8.encode(w),
34 ScoreboardPosition::SidebarTeam(TeamColor::DarkBlue) => 4_u8.encode(w),
35 ScoreboardPosition::SidebarTeam(TeamColor::DarkGreen) => 5_u8.encode(w),
36 ScoreboardPosition::SidebarTeam(TeamColor::DarkCyan) => 6_u8.encode(w),
37 ScoreboardPosition::SidebarTeam(TeamColor::DarkRed) => 7_u8.encode(w),
38 ScoreboardPosition::SidebarTeam(TeamColor::Purple) => 8_u8.encode(w),
39 ScoreboardPosition::SidebarTeam(TeamColor::Gold) => 9_u8.encode(w),
40 ScoreboardPosition::SidebarTeam(TeamColor::Gray) => 10_u8.encode(w),
41 ScoreboardPosition::SidebarTeam(TeamColor::DarkGray) => 11_u8.encode(w),
42 ScoreboardPosition::SidebarTeam(TeamColor::Blue) => 12_u8.encode(w),
43 ScoreboardPosition::SidebarTeam(TeamColor::BrightGreen) => 13_u8.encode(w),
44 ScoreboardPosition::SidebarTeam(TeamColor::Cyan) => 14_u8.encode(w),
45 ScoreboardPosition::SidebarTeam(TeamColor::Red) => 15_u8.encode(w),
46 ScoreboardPosition::SidebarTeam(TeamColor::Pink) => 16_u8.encode(w),
47 ScoreboardPosition::SidebarTeam(TeamColor::Yellow) => 17_u8.encode(w),
48 ScoreboardPosition::SidebarTeam(TeamColor::White) => 18_u8.encode(w),
49 ScoreboardPosition::SidebarTeam(_) => {
50 Err(anyhow::anyhow!("Invalid scoreboard display position"))
51 }
52 }
53 }
54}
55
56impl<'a> Decode<'a> for ScoreboardPosition {
57 fn decode(r: &mut &'a [u8]) -> anyhow::Result<Self> {
58 let value = u8::decode(r)?;
59 match value {
60 0 => Ok(ScoreboardPosition::List),
61 1 => Ok(ScoreboardPosition::Sidebar),
62 2 => Ok(ScoreboardPosition::BelowName),
63 3 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Black)),
64 4 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkBlue)),
65 5 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkGreen)),
66 6 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkCyan)),
67 7 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkRed)),
68 8 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Purple)),
69 9 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Gold)),
70 10 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Gray)),
71 11 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkGray)),
72 12 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Blue)),
73 13 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::BrightGreen)),
74 14 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Cyan)),
75 15 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Red)),
76 16 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Pink)),
77 17 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Yellow)),
78 18 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::White)),
79 _ => Err(anyhow::anyhow!("Invalid scoreboard display position")),
80 }
81 }
82}