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