diff --git a/crates/macros/src/de.rs b/crates/macros/src/de.rs index f8d1b67..53c38cf 100644 --- a/crates/macros/src/de.rs +++ b/crates/macros/src/de.rs @@ -3,7 +3,6 @@ use proc_macro2::{Ident, Span, TokenStream}; use quote::quote; use syn::{Attribute, DataEnum, DataStruct, Field, Fields, GenericArgument, PathArguments, Type}; - fn extract_inner_type_from_vec(ty: &Type) -> Option<&Type> { if let Type::Path(type_path) = ty { if let Some(last_segment) = type_path.path.segments.last() { @@ -148,8 +147,8 @@ pub fn build_de_struct(data_struct: &DataStruct) -> TokenStream { pub fn build_de_enum(data_enum: &DataEnum, attrs: &[Attribute]) -> TokenStream { let flags = get_attrs(attrs).expect("Error while getting attrs"); - if let (Some(repr), Some(endian)) = (flags.enum_repr, flags.enum_endianness) { - let enum_type_de = build_de_instance(Some(endian), &repr); + if let (Some(repr), endian) = (flags.enum_repr, flags.enum_endianness) { + let enum_type_de = build_de_instance(endian, &repr); let variants = data_enum.variants.iter().map(|var| { let desc = var diff --git a/crates/proto/src/connection.rs b/crates/proto/src/connection.rs index 815dd02..578ece6 100644 --- a/crates/proto/src/connection.rs +++ b/crates/proto/src/connection.rs @@ -2,8 +2,6 @@ use std::future::Future; use std::io::{Cursor, Write}; use std::sync::Arc; use std::time::Duration; - -use bedrockrs_core::int::LE; use tokio::select; use tokio::sync::{broadcast, watch}; use tokio::time::interval; @@ -58,9 +56,7 @@ impl Connection { Some(compression) => { let mut compressed_stream = vec![]; - LE::new(compression.id_u8()) - .write(&mut compressed_stream) - .map_err(|e| ConnectionError::IOError(Arc::new(e)))?; + compressed_stream.write_u8(compression.id_u8())?; // TODO: Overflow checking if compression.needed() && pk_stream.len() as u16 > compression.threshold() { @@ -392,10 +388,10 @@ impl ConnectionShard { } pub async fn recv(&mut self) -> Result { - match self.pk_receiver.recv().await { - Ok(pk) => pk, - Err(_) => Err(ConnectionError::ConnectionClosed), - } + self.pk_receiver + .recv() + .await + .unwrap_or_else(|_| Err(ConnectionError::ConnectionClosed)) } pub async fn flush(&mut self) -> Result<(), ConnectionError> { diff --git a/crates/proto/src/gamepackets.rs b/crates/proto/src/gamepackets.rs index c255956..59b0500 100644 --- a/crates/proto/src/gamepackets.rs +++ b/crates/proto/src/gamepackets.rs @@ -56,10 +56,10 @@ use crate::packets::start_game::StartGamePacket; use crate::packets::text_message::TextMessagePacket; use crate::packets::toast_request::ToastRequestPacket; use crate::sub_client::SubClientID; -use bedrockrs_core::int::VAR; use bedrockrs_macros::gamepackets; use bedrockrs_proto_core::{error::ProtoCodecError, GamePacket, ProtoCodec}; use std::io::{Cursor, Write}; +use varint_rs::{VarintReader, VarintWriter}; gamepackets! { Login: LoginPacket, @@ -269,12 +269,12 @@ fn read_gamepacket_header( stream: &mut Cursor<&[u8]>, ) -> Result<(u32, u16, SubClientID, SubClientID), ProtoCodecError> { // Read the gamepacket length - let length = VAR::::proto_deserialize(stream)?.into_inner(); + let length = stream.read_u32_varint()?; // Read the gamepacket header and parse it into an u16 // Since the (var)int is only storing 14 bytes we can treat it as an u16 // This is normally treated as u32 varint - let game_packet_header: u16 = VAR::::proto_deserialize(stream)?.into_inner(); + let game_packet_header: u16 = stream.read_u16_varint()?; // Get the first 10 bits as the packet id // Can never be more than a 16-bit integer due to being 10-bits big @@ -326,15 +326,13 @@ fn write_gamepacket_header( let mut game_packet_header_buf = Vec::new(); // Write the gamepacket header into temporary buffer - VAR::::new(game_packet_header).proto_serialize(&mut game_packet_header_buf)?; + game_packet_header_buf.write_u16_varint(game_packet_header)?; // Write the gamepacket length and the header length - VAR::::new(length + game_packet_header_buf.len() as u32).proto_serialize(stream)?; + stream.write_u32_varint(length + game_packet_header_buf.len() as u32)?; // Write the final game packet header - stream - .write_all(game_packet_header_buf.as_slice()) - .map_err(ProtoCodecError::from)?; + stream.write_all(game_packet_header_buf.as_slice())?; Ok(()) } diff --git a/crates/proto/src/packets/add_actor.rs b/crates/proto/src/packets/add_actor.rs index 6eba767..2d6b71b 100644 --- a/crates/proto/src/packets/add_actor.rs +++ b/crates/proto/src/packets/add_actor.rs @@ -16,16 +16,24 @@ pub struct AddActorPacket { pub target_actor_id: ActorUniqueID, pub target_runtime_id: ActorRuntimeID, pub actor_type: String, - pub position: Vec3>, - pub velocity: Vec3>, - pub rotation: Vec2>, - pub y_head_rotation: LE, - pub y_body_rotation: LE, - #[len_repr(VAR::)] + #[endianness(le)] + pub position: Vec3, + #[endianness(le)] + pub velocity: Vec3, + #[endianness(le)] + pub rotation: Vec2, + #[endianness(le)] + pub y_head_rotation: f32, + #[endianness(le)] + pub y_body_rotation: f32, + #[vec_repr(u32)] + #[vec_endianness(var)] pub attributes: Vec, - #[len_repr(VAR::)] + #[vec_repr(u32)] + #[vec_endianness(var)] pub actor_data: Vec, pub synced_properties: PropertySyncData, - #[len_repr(VAR::)] + #[vec_repr(u32)] + #[vec_endianness(var)] pub actor_links: Vec, } diff --git a/crates/proto/src/packets/add_player.rs b/crates/proto/src/packets/add_player.rs index 9d7ce4c..199d377 100644 --- a/crates/proto/src/packets/add_player.rs +++ b/crates/proto/src/packets/add_player.rs @@ -1,8 +1,7 @@ use crate::types::ability_data::AbilityData; use crate::types::actor_link::ActorLink; -use crate::types::network_item_stack_descriptor::NetworkItemStackDescriptor; +use crate::types::item_stack_descriptor::ItemStackDescriptor; use crate::types::property_sync_data::PropertySyncData; -use bedrockrs_core::int::{LE, VAR}; use bedrockrs_core::Vec3; use bedrockrs_macros::{gamepacket, ProtoCodec}; use bedrockrs_shared::actor_runtime_id::ActorRuntimeID; @@ -16,14 +15,18 @@ pub struct AddPlayerPacket { pub name: String, pub runtime_id: ActorRuntimeID, pub platform_chat_id: String, - pub position: Vec3>, - pub velocity: Vec3>, - pub rotation: Vec3>, - pub carried_item: NetworkItemStackDescriptor, + #[endianness(le)] + pub position: Vec3, + #[endianness(le)] + pub velocity: Vec3, + #[endianness(le)] + pub rotation: Vec3, + pub carried_item: ItemStackDescriptor, pub gamemode: Gamemode, // TODO: Impl SyncedActorDataEntityWrapper pub synced_properties: PropertySyncData, pub abilities: AbilityData, - #[len_repr(VAR::)] + #[vec_repr(u32)] + #[vec_endianness(var)] pub links: Vec, } diff --git a/crates/proto/src/packets/chunk_publisher_update.rs b/crates/proto/src/packets/chunk_publisher_update.rs index 6811298..f12a8ad 100644 --- a/crates/proto/src/packets/chunk_publisher_update.rs +++ b/crates/proto/src/packets/chunk_publisher_update.rs @@ -7,7 +7,10 @@ use bedrockrs_macros::{gamepacket, ProtoCodec}; #[derive(ProtoCodec, Debug, Clone)] pub struct ChunkPublisherUpdatePacket { pub position: BlockPos, - pub radius: VAR, - #[len_repr(LE::)] + #[endianness(var)] + pub radius: u32, + #[vec_repr(u32)] + // TODO: Figure out if it is a var or le + #[vec_endianness(var)] pub saved_chunks: Vec, } diff --git a/crates/proto/src/packets/emote_list.rs b/crates/proto/src/packets/emote_list.rs index ef9cceb..bde74ce 100644 --- a/crates/proto/src/packets/emote_list.rs +++ b/crates/proto/src/packets/emote_list.rs @@ -7,6 +7,7 @@ use uuid::Uuid; #[derive(ProtoCodec, Debug, Clone)] pub struct EmoteListPacket { pub runtime_id: ActorRuntimeID, - #[len_repr(VAR::)] + #[vec_repr(u32)] + #[vec_endianness(var)] pub emote_piece_ids: Vec, } diff --git a/crates/proto/src/packets/interact.rs b/crates/proto/src/packets/interact.rs index fa93a98..8974452 100644 --- a/crates/proto/src/packets/interact.rs +++ b/crates/proto/src/packets/interact.rs @@ -27,7 +27,7 @@ impl ProtoCodec for InteractPacket { u8::proto_serialize(&action, stream)?; if let InteractAction::InteractUpdate(pos) = self.action { - pos.to_le().proto_serialize(stream)?; + pos.proto_serialize(stream)?; } Ok(()) diff --git a/crates/proto/src/packets/inventory_content.rs b/crates/proto/src/packets/inventory_content.rs index 04c7d3f..f6986f2 100644 --- a/crates/proto/src/packets/inventory_content.rs +++ b/crates/proto/src/packets/inventory_content.rs @@ -1,12 +1,12 @@ use bedrockrs_core::int::VAR; use bedrockrs_macros::{gamepacket, ProtoCodec}; -use crate::types::network_item_stack_descriptor::NetworkItemStackDescriptor; +use crate::types::item_stack_descriptor::ItemStackDescriptor; #[gamepacket(id = 49)] #[derive(ProtoCodec, Debug, Clone)] pub struct InventoryContentPacket { pub inventory_id: VAR, #[len_repr(VAR::)] - pub slots: Vec, + pub slots: Vec, } diff --git a/crates/proto/src/packets/loading_screen.rs b/crates/proto/src/packets/loading_screen.rs index 3fd5017..527121f 100644 --- a/crates/proto/src/packets/loading_screen.rs +++ b/crates/proto/src/packets/loading_screen.rs @@ -6,5 +6,6 @@ use bedrockrs_macros::{gamepacket, ProtoCodec}; #[derive(ProtoCodec, Debug, Clone)] pub struct LoadingScreenPacket { pub screen_action: LoadingScreenAction, - pub screen_id: Option>, + #[endianness(le)] + pub screen_id: Option, } diff --git a/crates/proto/src/packets/mob_equipment.rs b/crates/proto/src/packets/mob_equipment.rs index 30e538b..3a5e569 100644 --- a/crates/proto/src/packets/mob_equipment.rs +++ b/crates/proto/src/packets/mob_equipment.rs @@ -1,13 +1,13 @@ use bedrockrs_core::int::VAR; use bedrockrs_macros::{gamepacket, ProtoCodec}; -use crate::types::network_item_stack_descriptor::NetworkItemStackDescriptor; +use crate::types::item_stack_descriptor::ItemStackDescriptor; #[gamepacket(id = 31)] #[derive(ProtoCodec, Debug, Clone)] pub struct MobEquipmentPacket { pub runtime_id: VAR, - pub item_stack_descriptor: NetworkItemStackDescriptor, + pub item_stack_descriptor: ItemStackDescriptor, pub slot: u8, pub selected_slot: u8, pub container: u8, diff --git a/crates/proto/src/packets/modal_form_response.rs b/crates/proto/src/packets/modal_form_response.rs index 81ebef3..3c0530a 100644 --- a/crates/proto/src/packets/modal_form_response.rs +++ b/crates/proto/src/packets/modal_form_response.rs @@ -5,7 +5,8 @@ use bedrockrs_macros::{gamepacket, ProtoCodec}; #[gamepacket(id = 101)] #[derive(ProtoCodec, Debug, Clone)] pub struct ModalFormResponsePacket { - pub form_id: VAR, + #[endianness(var)] + pub form_id: u32, pub form_response: Option, pub cancel_reason: Option, } diff --git a/crates/proto/src/packets/player_action.rs b/crates/proto/src/packets/player_action.rs index 4a18eb3..3f48aff 100644 --- a/crates/proto/src/packets/player_action.rs +++ b/crates/proto/src/packets/player_action.rs @@ -10,5 +10,6 @@ pub struct PlayerActionPacket { pub action: PlayerActionType, pub block_pos: BlockPos, pub result_pos: BlockPos, - pub face: VAR, + #[endianness(var)] + pub face: i32, } diff --git a/crates/proto/src/packets/player_auth_input.rs b/crates/proto/src/packets/player_auth_input.rs index a41c21b..5468e35 100644 --- a/crates/proto/src/packets/player_auth_input.rs +++ b/crates/proto/src/packets/player_auth_input.rs @@ -1,3 +1,4 @@ +use crate::types::block_actions::BlockActions; use crate::types::input_data::InputData; use crate::types::input_mode::InputMode; use crate::types::interaction_model::InteractionModel; @@ -6,26 +7,26 @@ use bedrockrs_core::int::{LE, VAR}; use bedrockrs_core::{Vec2, Vec3}; use bedrockrs_macros::gamepacket; use bedrockrs_proto_core::error::ProtoCodecError; -use bedrockrs_proto_core::ProtoCodec; +use bedrockrs_proto_core::{ProtoCodec, ProtoCodecLE, ProtoCodecVAR}; use bedrockrs_shared::actor_unique_id::ActorUniqueID; use std::io::Cursor; #[gamepacket(id = 144)] #[derive(Debug, Clone)] pub struct PlayerAuthInputPacket { - pub rotation: Vec2>, - pub position: Vec3>, - pub move_vec: Vec2>, - pub head_rotation: LE, + pub rotation: Vec2, + pub position: Vec3, + pub move_vec: Vec2, + pub head_rotation: f32, pub input_data: InputData, pub input_mode: InputMode, pub play_mode: PlayMode, pub interaction_model: InteractionModel, - /// Which simulation frame client is on. Used to match corrections - pub client_tick: VAR, + /// Which simulation frame client is on, used to match corrections + pub client_tick: u64, /// Velocity - pub pos_delta: Vec3>, - pub analog_move_vec: Vec2>, + pub pos_delta: Vec3, + pub analog_move_vec: Vec2, } macro_rules! set_bit { @@ -46,14 +47,14 @@ impl ProtoCodec for PlayerAuthInputPacket { } fn proto_deserialize(stream: &mut Cursor<&[u8]>) -> Result { - let rotation = Vec2::>::proto_deserialize(stream)?; - let position = Vec3::>::proto_deserialize(stream)?; - let move_vec = Vec2::>::proto_deserialize(stream)?; - let head_rotation = LE::::proto_deserialize(stream)?; + let rotation = as ProtoCodecLE>::proto_deserialize(stream)?; + let position = as ProtoCodecLE>::proto_deserialize(stream)?; + let move_vec = as ProtoCodecLE>::proto_deserialize(stream)?; + let head_rotation = ::proto_deserialize(stream)?; - let input_data = VAR::::proto_deserialize(stream)?.into_inner(); + let input_data = ::proto_deserialize(stream)?; let input_mode = InputMode::proto_deserialize(stream)?; - let play_mode_int = VAR::::proto_deserialize(stream)?.into_inner(); + let play_mode_int = ::proto_deserialize(stream)?; let interaction_model = InteractionModel::proto_deserialize(stream)?; let play_mode = match play_mode_int { @@ -77,13 +78,13 @@ impl ProtoCodec for PlayerAuthInputPacket { } }; - let client_tick = VAR::::proto_deserialize(stream)?; - let pos_delta = Vec3::>::proto_deserialize(stream)?; + let client_tick = ::proto_deserialize(stream)?; + let pos_delta = as ProtoCodecLE>::proto_deserialize(stream)?; let input_data = InputData { ascend: get_bit!(input_data, 0), descend: get_bit!(input_data, 1), - north_jump_DEPRECATED: get_bit!(input_data, 2), + north_jump_deprecated: get_bit!(input_data, 2), jump_down: get_bit!(input_data, 3), sprint_down: get_bit!(input_data, 4), change_height: get_bit!(input_data, 5), @@ -116,7 +117,11 @@ impl ProtoCodec for PlayerAuthInputPacket { start_gliding: get_bit!(input_data, 32), stop_gliding: get_bit!(input_data, 33), perform_item_interaction: get_bit!(input_data, 34), - perform_block_actions: get_bit!(input_data, 35), + perform_block_actions: if get_bit!(input_data, 35) { + Some(BlockActions::proto_deserialize(stream)?) + } else { + None + }, perform_item_stack_request: get_bit!(input_data, 36), handled_teleport: get_bit!(input_data, 37), emoting: get_bit!(input_data, 38), @@ -128,9 +133,8 @@ impl ProtoCodec for PlayerAuthInputPacket { client_ack_server_data: get_bit!(input_data, 44), is_in_client_predicted_vehicle: { if get_bit!(input_data, 45) { - let vehicle_rotation = Vec2::>::proto_deserialize(stream)?; + let vehicle_rotation = as ProtoCodecLE>::proto_deserialize(stream)?; let client_predicted_vehicle = ActorUniqueID::proto_deserialize(stream)?; - Some((vehicle_rotation, client_predicted_vehicle)) } else { None @@ -142,7 +146,7 @@ impl ProtoCodec for PlayerAuthInputPacket { input_num: get_bit!(input_data, 49), }; - let analog_move_vec = Vec2::>::proto_deserialize(stream)?; + let analog_move_vec = as ProtoCodecLE>::proto_deserialize(stream)?; Ok(Self { rotation, diff --git a/crates/proto/src/packets/player_disconnect.rs b/crates/proto/src/packets/player_disconnect.rs index a493529..c13f318 100644 --- a/crates/proto/src/packets/player_disconnect.rs +++ b/crates/proto/src/packets/player_disconnect.rs @@ -42,9 +42,10 @@ impl ProtoCodec for DisconnectPlayerPacket { // Read if the message should be skipped let skip_message = bool::proto_deserialize(cursor)?; - let message = match skip_message { - true => None, - false => Some(String::proto_deserialize(cursor)?), + let message = if !skip_message { + Some(String::proto_deserialize(cursor)?) + } else { + None }; Ok(Self { reason, message }) diff --git a/crates/proto/src/packets/resource_packs_info.rs b/crates/proto/src/packets/resource_packs_info.rs index 0ec8513..0e024de 100644 --- a/crates/proto/src/packets/resource_packs_info.rs +++ b/crates/proto/src/packets/resource_packs_info.rs @@ -14,10 +14,13 @@ pub struct ResourcePacksInfoPacket { pub has_addon_packs: bool, pub has_scripts: bool, pub force_server_packs_enabled: bool, - #[len_repr(LE::)] + #[vec_repr(u16)] + #[vec_endianness(le)] pub behavior_packs: Vec, - #[len_repr(LE::)] + #[vec_repr(u16)] + #[vec_endianness(le)] pub resource_packs: Vec, - #[len_repr(VAR::)] + #[vec_repr(u32)] + #[vec_endianness(var)] pub cdn_urls: Vec, } diff --git a/crates/proto/src/packets/resource_packs_response.rs b/crates/proto/src/packets/resource_packs_response.rs index 52142c5..09ab831 100644 --- a/crates/proto/src/packets/resource_packs_response.rs +++ b/crates/proto/src/packets/resource_packs_response.rs @@ -10,6 +10,7 @@ pub struct ResourcePacksResponsePacket { pub response: ResourcePacksResponseStatus, /// The addons that are downloaded/getting downloaded /// with their pack name as strings - #[len_repr(LE::)] + #[vec_repr(u16)] + #[vec_endianness(le)] pub downloading_packs: Vec, } diff --git a/crates/proto/src/packets/resource_packs_stack.rs b/crates/proto/src/packets/resource_packs_stack.rs index 419a45b..8c74f62 100644 --- a/crates/proto/src/packets/resource_packs_stack.rs +++ b/crates/proto/src/packets/resource_packs_stack.rs @@ -9,9 +9,11 @@ use crate::types::resource_packs_stack_pack::ResourcePacksStackPack; #[derive(Debug, Clone, ProtoCodec)] pub struct ResourcePacksStackPacket { pub texture_pack_required: bool, - #[len_repr(VAR::)] + #[vec_repr(i32)] + #[vec_endianness(var)] pub addons: Vec, - #[len_repr(VAR::)] + #[vec_repr(i32)] + #[vec_endianness(var)] pub texture_packs: Vec, pub base_game_version: BaseGameVersion, pub experiments: Experiments, diff --git a/crates/proto/src/packets/set_title.rs b/crates/proto/src/packets/set_title.rs index 8b10757..a55ac9a 100644 --- a/crates/proto/src/packets/set_title.rs +++ b/crates/proto/src/packets/set_title.rs @@ -1,4 +1,3 @@ -use bedrockrs_core::int::VAR; use bedrockrs_macros::{gamepacket, ProtoCodec}; use xuid::Xuid; @@ -9,9 +8,12 @@ use crate::types::title_type::TitleType; pub struct SetTitlePacket { pub title_type: TitleType, pub title_text: String, - pub fade_in_time: VAR, - pub stay_time: VAR, - pub fade_out_time: VAR, + #[endianness(var)] + pub fade_in_time: i32, + #[endianness(var)] + pub stay_time: i32, + #[endianness(var)] + pub fade_out_time: i32, pub xuid: Xuid, pub platform_online_id: String, } diff --git a/crates/proto/src/types/actor_link_type.rs b/crates/proto/src/types/actor_link_type.rs index 05ffd46..adac666 100644 --- a/crates/proto/src/types/actor_link_type.rs +++ b/crates/proto/src/types/actor_link_type.rs @@ -2,7 +2,8 @@ use bedrockrs_core::int::VAR; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] -#[enum_repr(VAR::)] +#[enum_repr(i32)] +#[enum_endianness(var)] pub enum ActorLinkType { None = 0, Riding = 1, diff --git a/crates/proto/src/types/block_action.rs b/crates/proto/src/types/block_action.rs deleted file mode 100644 index c05155b..0000000 --- a/crates/proto/src/types/block_action.rs +++ /dev/null @@ -1 +0,0 @@ -pub struct BlockAction {} diff --git a/crates/proto/src/types/block_actions.rs b/crates/proto/src/types/block_actions.rs new file mode 100644 index 0000000..282728a --- /dev/null +++ b/crates/proto/src/types/block_actions.rs @@ -0,0 +1,60 @@ +use crate::types::block_pos::BlockPos; +use bedrockrs_macros::ProtoCodec; + +#[derive(Debug, Clone, ProtoCodec)] +pub struct BlockActions { + #[vec_repr(i32)] + #[vec_endianness(var)] + actions: Vec, +} + +#[derive(Debug, Clone, ProtoCodec)] +#[enum_repr(i32)] +#[enum_endianness(var)] +pub enum BlockActionType { + StartBreak = 0, + AbortBreak = 1, + StopBreak = 2, + GetUpdatedBlock = 3, + DropItem = 4, + StartSleeping = 5, + StopSleeping = 6, + Respawn = 7, + Jump = 8, + StartSprint = 9, + StopSprint = 10, + StartSneak = 11, + StopSneak = 12, + CreativePlayerDestroyBlock = 13, + DimensionChangeDone = 14, + StartGlide = 15, + StopGlide = 16, + BuildDenied = 17, + CrackBreak = 18, + ChangeSkin = 19, + SetEnchantmentSeed = 20, + StartSwimming = 21, + StopSwimming = 22, + StartSpinAttack = 23, + StopSpinAttack = 24, + StartBuildingBlock = 25, + PredictDestroyBlock = 26, + ContinueDestroyBlock = 27, + StartItemUseOn = 28, + StopItemUseOn = 29, + HandledTeleport = 30, + MissedSwing = 31, + StartCrawling = 32, + StopCrawling = 33, + StartFlying = 34, + StopFlying = 35, + ClientAckServerData = 36, +} + +#[derive(Debug, Clone, ProtoCodec)] +pub struct BlockActionData { + action: BlockActionType, + block_pos: BlockPos, + #[endianness(var)] + face: i32, +} diff --git a/crates/proto/src/types/chunk_pos.rs b/crates/proto/src/types/chunk_pos.rs index 7576c4b..67b814f 100644 --- a/crates/proto/src/types/chunk_pos.rs +++ b/crates/proto/src/types/chunk_pos.rs @@ -3,15 +3,8 @@ use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] pub struct ChunkPos { - pub x: VAR, - pub z: VAR, -} - -impl ChunkPos { - pub fn new(x: i32, z: i32) -> Self { - ChunkPos { - x: VAR::::new(x), - z: VAR::::new(z), - } - } + #[endianness(var)] + pub x: i32, + #[endianness(var)] + pub z: i32, } diff --git a/crates/proto/src/types/container_id.rs b/crates/proto/src/types/container_id.rs index 5f6a915..2aafef2 100644 --- a/crates/proto/src/types/container_id.rs +++ b/crates/proto/src/types/container_id.rs @@ -1,9 +1,8 @@ -use bedrockrs_core::int::{BE, VAR}; use bedrockrs_macros::ProtoCodec; /// Defines an enum for container IDs, used to identify different types of containers. #[derive(ProtoCodec, Debug, Copy, Clone, Eq, PartialEq)] -#[enum_repr(BE::)] +#[enum_repr(i8)] pub enum ContainerID { /// Used to indicate that no container is selected. None = -1, diff --git a/crates/proto/src/types/container_type.rs b/crates/proto/src/types/container_type.rs index b128590..8185826 100644 --- a/crates/proto/src/types/container_type.rs +++ b/crates/proto/src/types/container_type.rs @@ -1,46 +1,45 @@ -use bedrockrs_core::int::BE; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Copy, Clone, Eq, PartialEq)] -#[enum_repr(BE::)] +#[enum_repr(i8)] pub enum ContainerType { - NONE = -9, - INVENTORY = -1, - CONTAINER = 0, - WORKBENCH = 1, - FURNACE = 2, - ENCHANTMENT = 3, - BREWING_STAND = 4, - ANVIL = 5, - DISPENSER = 6, - DROPPER = 7, - HOPPER = 8, - CAULDRON = 9, - MINECART_CHEST = 10, - MINECART_HOPPER = 11, - HORSE = 12, - BEACON = 13, - STRUCTURE_EDITOR = 14, - TRADE = 15, - COMMAND_BLOCK = 16, - JUKEBOX = 17, - ARMOR = 18, - HAND = 19, - COMPOUND_CREATOR = 20, - ELEMENT_CONSTRUCTOR = 21, - MATERIAL_REDUCER = 22, - LAB_TABLE = 23, - LOOM = 24, - LECTERN = 25, - GRINDSTONE = 26, - BLAST_FURNACE = 27, - SMOKER = 28, - STONECUTTER = 29, - CARTOGRAPHY = 30, - HUD = 31, - JIGSAW_EDITOR = 32, - SMITHING_TABLE = 33, - CHEST_BOAT = 34, - DECORATED_POT = 35, - CRAFTER = 36, + None = -9, + Inventory = -1, + Container = 0, + Workbench = 1, + Furnace = 2, + EnchantmentE = 3, + BrewingStand = 4, + Anvil = 5, + Dispenser = 6, + Dropper = 7, + Hopper = 8, + Cauldron = 9, + MinecartChest = 10, + MinecartHopper = 11, + Horse = 12, + Beacon = 13, + StructureEditor = 14, + Trade = 15, + CommandBlock = 16, + Jukebox = 17, + Armor = 18, + Hand = 19, + CompoundCreator = 20, + ElementConstructor = 21, + MaterialReducer = 22, + LabTable = 23, + Loom = 24, + Lectern = 25, + Grindstone = 26, + BlastFurnace = 27, + Smoker = 28, + Stonecutter = 29, + Cartography = 30, + Hud = 31, + JigsawEditor = 32, + SmithingTable = 33, + ChestBoat = 34, + DecoratedPot = 35, + Crafter = 36, } diff --git a/crates/proto/src/types/disconnect_reason.rs b/crates/proto/src/types/disconnect_reason.rs index 762cb2b..efa3aa9 100644 --- a/crates/proto/src/types/disconnect_reason.rs +++ b/crates/proto/src/types/disconnect_reason.rs @@ -1,8 +1,8 @@ -use bedrockrs_core::int::VAR; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] -#[enum_repr(VAR::)] +#[enum_repr(i32)] +#[enum_endianness(var)] pub enum DisconnectReason { Unknown = 0, CantConnectNoInternet = 1, @@ -93,7 +93,7 @@ pub enum DisconnectReason { NetherNetNegotiationTimeout = 86, NetherNetInactivityTimeout = 87, StaleConnectionBeingReplaced = 88, - RealmsSessionNotFound_DEPRECATED = 89, + RealmsSessionNotFoundDeprecated = 89, BadPacket = 90, NetherNetFailedToCreateOffer = 91, NetherNetFailedToCreateAnswer = 92, diff --git a/crates/proto/src/types/input_data.rs b/crates/proto/src/types/input_data.rs index cdd8c9a..5fde640 100644 --- a/crates/proto/src/types/input_data.rs +++ b/crates/proto/src/types/input_data.rs @@ -1,14 +1,13 @@ -use crate::types::inventory_transaction::UseItemTransactionData; -use bedrockrs_core::int::{LE, VAR}; +use crate::types::block_actions::BlockActions; use bedrockrs_core::Vec2; -use bedrockrs_macros::ProtoCodec; use bedrockrs_shared::actor_unique_id::ActorUniqueID; #[derive(Debug, Clone)] pub struct InputData { pub ascend: bool, pub descend: bool, - pub north_jump_DEPRECATED: bool, + #[deprecated] + pub north_jump_deprecated: bool, pub jump_down: bool, pub sprint_down: bool, pub change_height: bool, @@ -41,7 +40,7 @@ pub struct InputData { pub start_gliding: bool, pub stop_gliding: bool, pub perform_item_interaction: bool, - pub perform_block_actions: bool, + pub perform_block_actions: Option, pub perform_item_stack_request: bool, pub handled_teleport: bool, pub emoting: bool, @@ -51,7 +50,7 @@ pub struct InputData { pub start_flying: bool, pub stop_flying: bool, pub client_ack_server_data: bool, - pub is_in_client_predicted_vehicle: Option<(Vec2>, ActorUniqueID)>, + pub is_in_client_predicted_vehicle: Option<(Vec2, ActorUniqueID)>, pub paddling_left: bool, pub paddling_right: bool, pub block_breaking_delay_enabled: bool, diff --git a/crates/proto/src/types/input_mode.rs b/crates/proto/src/types/input_mode.rs index 7bc532d..391d602 100644 --- a/crates/proto/src/types/input_mode.rs +++ b/crates/proto/src/types/input_mode.rs @@ -1,8 +1,9 @@ -use bedrockrs_core::int::VAR; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] -#[enum_repr(VAR::)] +// TODO: Make sure that it is an u32 and not an i32 +#[enum_repr(u32)] +#[enum_endianness(var)] pub enum InputMode { Undefined = 0, Mouse = 1, diff --git a/crates/proto/src/types/interaction_model.rs b/crates/proto/src/types/interaction_model.rs index d696ffd..5fbb7e1 100644 --- a/crates/proto/src/types/interaction_model.rs +++ b/crates/proto/src/types/interaction_model.rs @@ -1,8 +1,9 @@ -use bedrockrs_core::int::VAR; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] -#[enum_repr(VAR::)] +// TODO: Make sure that it is an u32 and not an i32 +#[enum_repr(u32)] +#[enum_endianness(var)] pub enum InteractionModel { Touch = 0, Crosshair = 1, diff --git a/crates/proto/src/types/network_item_stack_descriptor.rs b/crates/proto/src/types/item_stack_descriptor.rs similarity index 81% rename from crates/proto/src/types/network_item_stack_descriptor.rs rename to crates/proto/src/types/item_stack_descriptor.rs index 6f5445d..6112e3f 100644 --- a/crates/proto/src/types/network_item_stack_descriptor.rs +++ b/crates/proto/src/types/item_stack_descriptor.rs @@ -1,31 +1,30 @@ use bedrockrs_core::int::{LE, VAR}; use bedrockrs_proto_core::ProtoCodec; +use std::num::NonZero; -use super::item_stack_net_id_variant::ItemStackNetIdVariant; +use super::item_stack_id_variant::ItemStackIdVariant; #[derive(Debug, Clone)] -pub enum NetworkItemStackDescriptor { - Invalid { - id: VAR, - }, +pub enum ItemStackDescriptor { + Invalid, Valid { id: VAR, stack_size: LE, aux_value: LE, include_net_id: bool, - include_net_id_data: Option, + include_net_id_data: Option, block_runtime_id: VAR, user_data_buffer: String, }, } -impl ProtoCodec for NetworkItemStackDescriptor { +impl ProtoCodec for ItemStackDescriptor { fn proto_serialize( &self, stream: &mut Vec, ) -> Result<(), bedrockrs_proto_core::error::ProtoCodecError> { match self { - NetworkItemStackDescriptor::Invalid { id } => id.proto_serialize(stream)?, - NetworkItemStackDescriptor::Valid { + ItemStackDescriptor::Invalid { id } => id.proto_serialize(stream)?, + ItemStackDescriptor::Valid { id, stack_size, aux_value, @@ -59,7 +58,7 @@ impl ProtoCodec for NetworkItemStackDescriptor { let include_net_id = bool::proto_deserialize(stream)?; let include_net_id_data = if include_net_id { - Some(ItemStackNetIdVariant::proto_deserialize(stream)?) + Some(ItemStackIdVariant::proto_deserialize(stream)?) } else { None }; diff --git a/crates/proto/src/types/item_stack_id_variant.rs b/crates/proto/src/types/item_stack_id_variant.rs new file mode 100644 index 0000000..de28c56 --- /dev/null +++ b/crates/proto/src/types/item_stack_id_variant.rs @@ -0,0 +1,4 @@ +use bedrockrs_macros::ProtoCodec; + +#[derive(ProtoCodec, Debug, Clone)] +pub struct ItemStackIdVariant(#[endianness(var)] i32); diff --git a/crates/proto/src/types/item_stack_net_id_variant.rs b/crates/proto/src/types/item_stack_net_id_variant.rs deleted file mode 100644 index 18d5ded..0000000 --- a/crates/proto/src/types/item_stack_net_id_variant.rs +++ /dev/null @@ -1,6 +0,0 @@ -use bedrockrs_core::int::VAR; -use bedrockrs_macros::ProtoCodec; -#[derive(ProtoCodec, Debug, Clone)] -pub struct ItemStackNetIdVariant { - pub raw_id: VAR, -} diff --git a/crates/proto/src/types/loading_screen_action.rs b/crates/proto/src/types/loading_screen_action.rs index 65cce7a..225c64c 100644 --- a/crates/proto/src/types/loading_screen_action.rs +++ b/crates/proto/src/types/loading_screen_action.rs @@ -2,7 +2,8 @@ use bedrockrs_core::int::VAR; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] -#[enum_repr(VAR::)] +#[enum_repr(i32)] +#[enum_endianness(var)] pub enum LoadingScreenAction { Unknown = 0, Start = 1, diff --git a/crates/proto/src/types/mod.rs b/crates/proto/src/types/mod.rs index 3dc606d..aede40a 100644 --- a/crates/proto/src/types/mod.rs +++ b/crates/proto/src/types/mod.rs @@ -5,7 +5,7 @@ pub mod actor_type; pub mod animate_action; pub mod attribute; pub mod base_game_version; -pub mod block_action; +pub mod block_actions; pub mod block_pos; pub mod chat_restriction_level; pub mod chunk_pos; @@ -25,11 +25,11 @@ pub mod input_mode; pub mod interact_action; pub mod interaction_model; pub mod inventory_transaction; -pub mod item_stack_net_id_variant; +pub mod item_stack_descriptor; +pub mod item_stack_id_variant; pub mod level_settings; pub mod loading_screen_action; pub mod modal_form_cancel_reason; -pub mod network_item_stack_descriptor; pub mod network_permissions; pub mod pack_info_behavior; pub mod pack_info_resource; diff --git a/crates/proto/src/types/modal_form_cancel_reason.rs b/crates/proto/src/types/modal_form_cancel_reason.rs index 1ab2a53..0904793 100644 --- a/crates/proto/src/types/modal_form_cancel_reason.rs +++ b/crates/proto/src/types/modal_form_cancel_reason.rs @@ -1,8 +1,7 @@ -use bedrockrs_core::int::LE; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] -#[enum_repr(LE::)] +#[enum_repr(i8)] pub enum ModalFormCancelReason { Closed = 0, Busy = 1, diff --git a/crates/proto/src/types/pack_info_behavior.rs b/crates/proto/src/types/pack_info_behavior.rs index fd34c1e..a5731a6 100644 --- a/crates/proto/src/types/pack_info_behavior.rs +++ b/crates/proto/src/types/pack_info_behavior.rs @@ -1,11 +1,11 @@ -use bedrockrs_core::int::LE; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] pub struct BehaviorPackInfoType { pub id: String, pub version: String, - pub size: LE, + #[endianness(le)] + pub size: u64, pub content_key: String, pub sub_pack_name: String, pub content_identify: String, diff --git a/crates/proto/src/types/pack_info_resource.rs b/crates/proto/src/types/pack_info_resource.rs index f0a42fa..d6f8f2f 100644 --- a/crates/proto/src/types/pack_info_resource.rs +++ b/crates/proto/src/types/pack_info_resource.rs @@ -1,11 +1,11 @@ -use bedrockrs_core::int::LE; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] pub struct ResourcePackInfoType { pub id: String, pub version: String, - pub size: LE, + #[endianness(le)] + pub size: u64, pub content_key: String, pub sub_pack_name: String, pub content_identify: String, diff --git a/crates/proto/src/types/play_status.rs b/crates/proto/src/types/play_status.rs index 90f6c75..80bf74e 100644 --- a/crates/proto/src/types/play_status.rs +++ b/crates/proto/src/types/play_status.rs @@ -1,8 +1,8 @@ -use bedrockrs_core::int::BE; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Copy, Clone, Eq, PartialEq)] -#[enum_repr(BE::)] +#[enum_repr(i32)] +#[enum_endianness(be)] pub enum PlayStatusType { /// Sent after Login has been successfully decoded and the player has logged in LoginSuccess = 0, @@ -20,6 +20,8 @@ pub enum PlayStatusType { FailedEditionMismatchVanillaToEdu = 6, /// Displays "Wow this server is popular! Check back later to see if space opens up. Server Full" FailedServerFull = 7, + // TODO: Find out what this displays FailedEditorMismatchEditorToVanilla = 8, + // TODO: Find out what this displays FailedEditorMismatchVanillaToEditor = 9, } diff --git a/crates/proto/src/types/player_action_type.rs b/crates/proto/src/types/player_action_type.rs index 4260657..0434e71 100644 --- a/crates/proto/src/types/player_action_type.rs +++ b/crates/proto/src/types/player_action_type.rs @@ -1,8 +1,8 @@ -use bedrockrs_core::int::VAR; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Copy, Clone, Eq, PartialEq)] -#[enum_repr(VAR::)] +#[enum_repr(i32)] +#[enum_endianness(var)] pub enum PlayerActionType { Unknown = -1, StartDestroyBlock = 0, diff --git a/crates/proto/src/types/player_movement_mode.rs b/crates/proto/src/types/player_movement_mode.rs index 04c7142..b7cf371 100644 --- a/crates/proto/src/types/player_movement_mode.rs +++ b/crates/proto/src/types/player_movement_mode.rs @@ -1,8 +1,8 @@ -use bedrockrs_core::int::VAR; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] -#[enum_repr(VAR::)] +#[enum_repr(i32)] +#[enum_endianness(var)] pub enum PlayerMovementMode { Client = 0, Server = 1, diff --git a/crates/proto/src/types/player_movement_settings.rs b/crates/proto/src/types/player_movement_settings.rs index d071e49..cddf147 100644 --- a/crates/proto/src/types/player_movement_settings.rs +++ b/crates/proto/src/types/player_movement_settings.rs @@ -6,6 +6,7 @@ use crate::types::player_movement_mode::PlayerMovementMode; #[derive(ProtoCodec, Debug, Clone)] pub struct PlayerMovementSettings { pub authority_mode: PlayerMovementMode, - pub rewind_history_size: VAR, + #[endianness(var)] + pub rewind_history_size: i32, pub server_authoritative_block_breaking: bool, } diff --git a/crates/proto/src/types/property_sync_data.rs b/crates/proto/src/types/property_sync_data.rs index 9544499..eca7d1a 100644 --- a/crates/proto/src/types/property_sync_data.rs +++ b/crates/proto/src/types/property_sync_data.rs @@ -1,4 +1,4 @@ -use bedrockrs_core::int::{LE, VAR}; +use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] pub struct PropertySyncData { @@ -6,27 +6,32 @@ pub struct PropertySyncData { pub float: FloatEntriesList, } -use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] pub struct IntEntriesList { - #[len_repr(VAR::)] + #[vec_repr(u32)] + #[vec_endianness(var)] pub entries: Vec, } #[derive(ProtoCodec, Debug, Clone)] -pub struct FloatEntriesList { - #[len_repr(VAR::)] - pub entries: Vec, +pub struct IntEntry { + #[endianness(var)] + pub property_index: u32, + #[endianness(var)] + pub data: i32, } #[derive(ProtoCodec, Debug, Clone)] -pub struct IntEntry { - pub property_index: VAR, - pub data: VAR, +pub struct FloatEntriesList { + #[vec_repr(u32)] + #[vec_endianness(var)] + pub entries: Vec, } #[derive(ProtoCodec, Debug, Clone)] pub struct FloatEntry { - pub property_index: VAR, - pub data: LE, + #[endianness(var)] + pub property_index: u32, + #[endianness(le)] + pub data: f32, } diff --git a/crates/proto/src/types/resource_packs_response_status.rs b/crates/proto/src/types/resource_packs_response_status.rs index 69c6deb..ad547d1 100644 --- a/crates/proto/src/types/resource_packs_response_status.rs +++ b/crates/proto/src/types/resource_packs_response_status.rs @@ -1,8 +1,7 @@ -use bedrockrs_core::int::LE; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Copy, Clone, Eq, PartialEq)] -#[enum_repr(LE::)] +#[enum_repr(i8)] pub enum ResourcePacksResponseStatus { None = 0, Refused = 1, diff --git a/crates/proto/src/types/spawn_biome_type.rs b/crates/proto/src/types/spawn_biome_type.rs index 556e6d2..121fc3a 100644 --- a/crates/proto/src/types/spawn_biome_type.rs +++ b/crates/proto/src/types/spawn_biome_type.rs @@ -7,7 +7,8 @@ use bedrockrs_proto_core::error::ProtoCodecError; use bedrockrs_proto_core::ProtoCodec; #[derive(ProtoCodec, Debug, Clone)] -#[enum_repr(LE::)] +#[enum_repr(i16)] +#[enum_endianness(le)] pub enum SpawnBiomeType { Default = 0, UserDefined = 1, diff --git a/crates/proto/src/types/title_type.rs b/crates/proto/src/types/title_type.rs index dd142c4..b69c662 100644 --- a/crates/proto/src/types/title_type.rs +++ b/crates/proto/src/types/title_type.rs @@ -1,8 +1,8 @@ -use bedrockrs_core::int::VAR; use bedrockrs_macros::ProtoCodec; #[derive(ProtoCodec, Debug, Copy, Clone, Eq, PartialEq)] -#[enum_repr(VAR::)] +#[enum_repr(i32)] +#[enum_endianness(var)] pub enum TitleType { Clear = 0, Reset = 1, diff --git a/crates/proto_core/src/types/xuid.rs b/crates/proto_core/src/types/xuid.rs index 94a043f..027c9d4 100644 --- a/crates/proto_core/src/types/xuid.rs +++ b/crates/proto_core/src/types/xuid.rs @@ -10,6 +10,6 @@ impl ProtoCodec for Xuid { } fn proto_deserialize(buf: &mut Cursor<&[u8]>) -> Result { - Xuid::try_from(String::proto_deserialize(buf)?).map_err(ProtoCodecError::XuidParseError) + Ok(Xuid::try_from(String::proto_deserialize(buf)?)?) } }