valence_protocol/
game_mode.rs
1use std::io::Write;
2
3use anyhow::bail;
4use bevy_ecs::prelude::*;
5use derive_more::{From, Into};
6
7use crate::{Decode, Encode};
8
9#[derive(Copy, Clone, PartialEq, Eq, Debug, Default, Encode, Decode, Component)]
10pub enum GameMode {
11 #[default]
12 Survival,
13 Creative,
14 Adventure,
15 Spectator,
16}
17
18#[derive(Copy, Clone, PartialEq, Eq, Default, Debug, From, Into)]
21pub struct OptGameMode(pub Option<GameMode>);
22
23impl Encode for OptGameMode {
24 fn encode(&self, w: impl Write) -> anyhow::Result<()> {
25 match self.0 {
26 Some(gm) => (gm as i8).encode(w),
27 None => (-1_i8).encode(w),
28 }
29 }
30}
31
32impl Decode<'_> for OptGameMode {
33 fn decode(r: &mut &'_ [u8]) -> anyhow::Result<Self> {
34 Ok(Self(match i8::decode(r)? {
35 -1 => None,
36 0 => Some(GameMode::Survival),
37 1 => Some(GameMode::Creative),
38 2 => Some(GameMode::Adventure),
39 3 => Some(GameMode::Spectator),
40 other => bail!("invalid game mode byte of {other}"),
41 }))
42 }
43}