use basalt_derive::{Decode, Encode, EncodedSize, packet};
use basalt_types::Decode as _;
use basalt_types::{NbtCompound, Uuid};
use crate::error::{Error, Result};
#[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,
}
#[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,
}
#[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;
#[derive(Debug, Clone, Default, PartialEq, Encode, Decode, EncodedSize)]
pub struct ClientboundConfigurationTagsTagsTags {
pub tag_name: String,
#[field(length = "varint", element = "varint")]
pub entries: Vec<i32>,
}
#[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>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ServerboundConfigurationPacket {
CustomPayload(ServerboundConfigurationCustomPayload),
FinishConfiguration(ServerboundConfigurationFinishConfiguration),
KeepAlive(ServerboundConfigurationKeepAlive),
Pong(ServerboundConfigurationPong),
ResourcePackReceive(ServerboundConfigurationResourcePackReceive),
}
impl ServerboundConfigurationPacket {
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",
}),
}
}
}
#[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 {
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",
}),
}
}
}