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/// Defines where a scoreboard is displayed.
13#[derive(Copy, Clone, PartialEq, Eq, Debug, Component, Default)]
14pub enum ScoreboardPosition {
15    /// Display the scoreboard in the player list (the one you see when you
16    /// press tab), as a yellow number next to players' names.
17    List,
18    /// Display the scoreboard on the sidebar.
19    #[default]
20    Sidebar,
21    /// Display the scoreboard below players' name tags in the world.
22    BelowName,
23    /// Display the scoreboard on the sidebar, visible only to one team.
24    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}