basalt-mc-protocol 0.2.1

Minecraft packet definitions and version-aware packet registry
Documentation
//! Configuration state packet definitions.
//!
//! Auto-generated by `cargo xt codegen` from minecraft-data.
//! Do not edit manually — changes will be overwritten.

use basalt_derive::{Decode, Encode, EncodedSize, packet};
use basalt_types::Decode as _;
use basalt_types::{NbtCompound, Uuid};

use crate::error::{Error, Result};

// -- Serverbound packets --

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x02)]
pub struct ServerboundConfigurationCustomPayload {
    pub channel: String,
    #[field(rest)]
    pub data: Vec<u8>,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x03)]
pub struct ServerboundConfigurationFinishConfiguration;

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x04)]
pub struct ServerboundConfigurationKeepAlive {
    pub keep_alive_id: i64,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x05)]
pub struct ServerboundConfigurationPong {
    pub id: i32,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x06)]
pub struct ServerboundConfigurationResourcePackReceive {
    pub uuid: Uuid,
    #[field(varint)]
    pub result: i32,
}

// -- Clientbound packets --

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x01)]
pub struct ClientboundConfigurationCustomPayload {
    pub channel: String,
    #[field(rest)]
    pub data: Vec<u8>,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x02)]
pub struct ClientboundConfigurationDisconnect {
    pub reason: NbtCompound,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x0c)]
pub struct ClientboundConfigurationFeatureFlags {
    #[field(length = "varint")]
    pub features: Vec<String>,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x03)]
pub struct ClientboundConfigurationFinishConfiguration;

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x04)]
pub struct ClientboundConfigurationKeepAlive {
    pub keep_alive_id: i64,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x05)]
pub struct ClientboundConfigurationPing {
    pub id: i32,
}

/// Inline data structure used by [`ClientboundConfigurationRegistryData`].
#[derive(Debug, Clone, Default, PartialEq, Encode, Decode, EncodedSize)]
pub struct ClientboundConfigurationRegistryDataEntries {
    pub key: String,
    #[field(optional)]
    pub value: Option<NbtCompound>,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x07)]
pub struct ClientboundConfigurationRegistryData {
    pub id: String,
    #[field(length = "varint")]
    pub entries: Vec<ClientboundConfigurationRegistryDataEntries>,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x06)]
pub struct ClientboundConfigurationResetChat;

/// Inline data structure used by [`ClientboundConfigurationTags`].
#[derive(Debug, Clone, Default, PartialEq, Encode, Decode, EncodedSize)]
pub struct ClientboundConfigurationTagsTagsTags {
    pub tag_name: String,
    #[field(length = "varint", element = "varint")]
    pub entries: Vec<i32>,
}

/// Inline data structure used by [`ClientboundConfigurationTags`].
#[derive(Debug, Clone, Default, PartialEq, Encode, Decode, EncodedSize)]
pub struct ClientboundConfigurationTagsTags {
    pub tag_type: String,
    #[field(length = "varint")]
    pub tags: Vec<ClientboundConfigurationTagsTagsTags>,
}

#[derive(Debug, Clone, Default, PartialEq)]
#[packet(id = 0x0d)]
pub struct ClientboundConfigurationTags {
    #[field(length = "varint")]
    pub tags: Vec<ClientboundConfigurationTagsTags>,
}

/// serverbound packets in the Configuration state.
#[derive(Debug, Clone, PartialEq)]
pub enum ServerboundConfigurationPacket {
    CustomPayload(ServerboundConfigurationCustomPayload),
    FinishConfiguration(ServerboundConfigurationFinishConfiguration),
    KeepAlive(ServerboundConfigurationKeepAlive),
    Pong(ServerboundConfigurationPong),
    ResourcePackReceive(ServerboundConfigurationResourcePackReceive),
}

impl ServerboundConfigurationPacket {
    /// Decodes a packet from its ID and payload.
    pub fn decode_by_id(id: i32, buf: &mut &[u8]) -> Result<Self> {
        match id {
            ServerboundConfigurationCustomPayload::PACKET_ID => Ok(Self::CustomPayload(
                ServerboundConfigurationCustomPayload::decode(buf)?,
            )),
            ServerboundConfigurationFinishConfiguration::PACKET_ID => {
                Ok(Self::FinishConfiguration(
                    ServerboundConfigurationFinishConfiguration::decode(buf)?,
                ))
            }
            ServerboundConfigurationKeepAlive::PACKET_ID => Ok(Self::KeepAlive(
                ServerboundConfigurationKeepAlive::decode(buf)?,
            )),
            ServerboundConfigurationPong::PACKET_ID => {
                Ok(Self::Pong(ServerboundConfigurationPong::decode(buf)?))
            }
            ServerboundConfigurationResourcePackReceive::PACKET_ID => {
                Ok(Self::ResourcePackReceive(
                    ServerboundConfigurationResourcePackReceive::decode(buf)?,
                ))
            }
            _ => Err(Error::UnknownPacket {
                id,
                state: "configuration",
            }),
        }
    }
}

/// clientbound packets in the Configuration state.
#[derive(Debug, Clone, PartialEq)]
pub enum ClientboundConfigurationPacket {
    CustomPayload(ClientboundConfigurationCustomPayload),
    Disconnect(ClientboundConfigurationDisconnect),
    FeatureFlags(ClientboundConfigurationFeatureFlags),
    FinishConfiguration(ClientboundConfigurationFinishConfiguration),
    KeepAlive(ClientboundConfigurationKeepAlive),
    Ping(ClientboundConfigurationPing),
    RegistryData(ClientboundConfigurationRegistryData),
    ResetChat(ClientboundConfigurationResetChat),
    Tags(ClientboundConfigurationTags),
}

impl ClientboundConfigurationPacket {
    /// Decodes a packet from its ID and payload.
    pub fn decode_by_id(id: i32, buf: &mut &[u8]) -> Result<Self> {
        match id {
            ClientboundConfigurationCustomPayload::PACKET_ID => Ok(Self::CustomPayload(
                ClientboundConfigurationCustomPayload::decode(buf)?,
            )),
            ClientboundConfigurationDisconnect::PACKET_ID => Ok(Self::Disconnect(
                ClientboundConfigurationDisconnect::decode(buf)?,
            )),
            ClientboundConfigurationFeatureFlags::PACKET_ID => Ok(Self::FeatureFlags(
                ClientboundConfigurationFeatureFlags::decode(buf)?,
            )),
            ClientboundConfigurationFinishConfiguration::PACKET_ID => {
                Ok(Self::FinishConfiguration(
                    ClientboundConfigurationFinishConfiguration::decode(buf)?,
                ))
            }
            ClientboundConfigurationKeepAlive::PACKET_ID => Ok(Self::KeepAlive(
                ClientboundConfigurationKeepAlive::decode(buf)?,
            )),
            ClientboundConfigurationPing::PACKET_ID => {
                Ok(Self::Ping(ClientboundConfigurationPing::decode(buf)?))
            }
            ClientboundConfigurationRegistryData::PACKET_ID => Ok(Self::RegistryData(
                ClientboundConfigurationRegistryData::decode(buf)?,
            )),
            ClientboundConfigurationResetChat::PACKET_ID => Ok(Self::ResetChat(
                ClientboundConfigurationResetChat::decode(buf)?,
            )),
            ClientboundConfigurationTags::PACKET_ID => {
                Ok(Self::Tags(ClientboundConfigurationTags::decode(buf)?))
            }
            _ => Err(Error::UnknownPacket {
                id,
                state: "configuration",
            }),
        }
    }
}