From e268c4929177e540baa9d2bb29bc171f49cc7a25 Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 19 Dec 2024 02:31:08 +0000 Subject: [PATCH] fix incorrect packets --- azalea-client/src/inventory.rs | 12 +- azalea-client/src/local_player.rs | 1 - azalea-client/src/movement.rs | 10 +- azalea-client/src/packet_handling/game.rs | 84 ++-- azalea-protocol/src/common/mod.rs | 2 + azalea-protocol/src/common/movements.rs | 71 ++++ azalea-protocol/src/common/recipe.rs | 101 +++++ azalea-protocol/src/packets/config/mod.rs | 50 +-- .../src/packets/game/c_add_experience_orb.rs | 5 +- .../src/packets/game/c_container_close.rs | 3 +- .../packets/game/c_container_set_content.rs | 3 +- .../src/packets/game/c_container_set_data.rs | 3 +- .../src/packets/game/c_container_set_slot.rs | 3 +- .../packets/game/c_entity_position_sync.rs | 2 +- azalea-protocol/src/packets/game/c_explode.rs | 167 +------- .../src/packets/game/c_horse_screen_open.rs | 5 +- .../src/packets/game/c_level_particles.rs | 5 +- .../src/packets/game/c_merchant_offers.rs | 2 +- .../src/packets/game/c_move_vehicle.rs | 9 +- .../src/packets/game/c_open_screen.rs | 2 +- .../src/packets/game/c_place_ghost_recipe.rs | 8 +- .../src/packets/game/c_player_look_at.rs | 5 +- .../src/packets/game/c_player_position.rs | 76 +--- .../src/packets/game/c_player_rotation.rs | 4 +- .../src/packets/game/c_recipe_book_add.rs | 55 +-- .../src/packets/game/c_set_cursor_item.rs | 2 +- .../src/packets/game/c_set_held_slot.rs | 3 +- .../packets/game/c_set_player_inventory.rs | 4 +- .../src/packets/game/c_teleport_entity.rs | 9 +- .../src/packets/game/c_update_recipes.rs | 50 +-- azalea-protocol/src/packets/game/mod.rs | 386 +++++++++--------- .../packets/game/s_container_button_click.rs | 6 +- .../src/packets/game/s_container_click.rs | 3 +- .../src/packets/game/s_container_close.rs | 3 +- .../game/s_container_slot_state_changed.rs | 2 +- .../src/packets/game/s_move_player_pos.rs | 5 +- .../src/packets/game/s_move_player_pos_rot.rs | 4 +- .../src/packets/game/s_move_player_rot.rs | 4 +- .../src/packets/game/s_move_vehicle.rs | 9 +- .../src/packets/game/s_place_recipe.rs | 3 +- azalea-protocol/src/packets/handshake/mod.rs | 2 +- azalea-protocol/src/packets/login/mod.rs | 22 +- azalea-protocol/src/packets/status/mod.rs | 8 +- azalea/src/container.rs | 8 +- codegen/lib/code/packet.py | 11 +- codegen/lib/utils.py | 2 +- 46 files changed, 543 insertions(+), 691 deletions(-) create mode 100644 azalea-protocol/src/common/movements.rs create mode 100644 azalea-protocol/src/common/recipe.rs diff --git a/azalea-client/src/inventory.rs b/azalea-client/src/inventory.rs index eb0b0675c..2dd178534 100644 --- a/azalea-client/src/inventory.rs +++ b/azalea-client/src/inventory.rs @@ -85,7 +85,7 @@ pub struct Inventory { /// guaranteed to be anything specific, and may change every time you open a /// container (unless it's 0, in which case it means that no container is /// open). - pub id: u8, + pub id: i32, /// The current container menu that the player has open. If no container is /// open, this will be `None`. pub container_menu: Option, @@ -584,7 +584,7 @@ impl Default for Inventory { #[derive(Event, Debug)] pub struct MenuOpenedEvent { pub entity: Entity, - pub window_id: u32, + pub window_id: i32, pub menu_type: MenuKind, pub title: FormattedText, } @@ -594,7 +594,7 @@ fn handle_menu_opened_event( ) { for event in events.read() { let mut inventory = query.get_mut(event.entity).unwrap(); - inventory.id = event.window_id as u8; + inventory.id = event.window_id; inventory.container_menu = Some(Menu::from_kind(event.menu_type)); inventory.container_menu_title = Some(event.title.clone()); } @@ -609,7 +609,7 @@ pub struct CloseContainerEvent { pub entity: Entity, /// The ID of the container to close. 0 for the player's inventory. If this /// is not the same as the currently open inventory, nothing will happen. - pub id: u8, + pub id: i32, } fn handle_container_close_event( query: Query<(Entity, &Inventory)>, @@ -661,7 +661,7 @@ pub fn handle_client_side_close_container_event( #[derive(Event, Debug)] pub struct ContainerClickEvent { pub entity: Entity, - pub window_id: u8, + pub window_id: i32, pub operation: ClickOperation, } pub fn handle_container_click_event( @@ -715,7 +715,7 @@ pub fn handle_container_click_event( pub struct SetContainerContentEvent { pub entity: Entity, pub slots: Vec, - pub container_id: u8, + pub container_id: i32, } fn handle_set_container_content_event( mut events: EventReader, diff --git a/azalea-client/src/local_player.rs b/azalea-client/src/local_player.rs index c01dcef6d..0a8f006d0 100644 --- a/azalea-client/src/local_player.rs +++ b/azalea-client/src/local_player.rs @@ -138,7 +138,6 @@ pub fn death_event(query: Query<&LocalPlayerEvents, Added>) { } #[derive(Error, Debug)] -#[expect(clippy::large_enum_variant)] pub enum HandlePacketError { #[error("{0}")] Poison(String), diff --git a/azalea-client/src/movement.rs b/azalea-client/src/movement.rs index bdc29f2fb..8801e2c60 100644 --- a/azalea-client/src/movement.rs +++ b/azalea-client/src/movement.rs @@ -193,8 +193,7 @@ pub fn send_position( Some( ServerboundMovePlayerPosRot { pos: **position, - x_rot: direction.x_rot, - y_rot: direction.y_rot, + look_direction: *direction, on_ground: physics.on_ground(), } .into_variant(), @@ -202,9 +201,7 @@ pub fn send_position( } else if sending_position { Some( ServerboundMovePlayerPos { - x: position.x, - y: position.y, - z: position.z, + pos: **position, on_ground: physics.on_ground(), } .into_variant(), @@ -212,8 +209,7 @@ pub fn send_position( } else if sending_direction { Some( ServerboundMovePlayerRot { - x_rot: direction.x_rot, - y_rot: direction.y_rot, + look_direction: *direction, on_ground: physics.on_ground(), } .into_variant(), diff --git a/azalea-client/src/packet_handling/game.rs b/azalea-client/src/packet_handling/game.rs index 0c505d07f..d92f2464c 100644 --- a/azalea-client/src/packet_handling/game.rs +++ b/azalea-client/src/packet_handling/game.rs @@ -510,8 +510,7 @@ pub fn process_packet_events(ecs: &mut World) { player_entity, ServerboundMovePlayerPosRot { pos: new_pos, - y_rot: new_y_rot, - x_rot: new_x_rot, + look_direction: LookDirection::new(new_y_rot, new_x_rot), // this is always false on_ground: false, }, @@ -842,10 +841,10 @@ pub fn process_packet_events(ecs: &mut World) { continue; }; - let new_pos = p.position; + let new_pos = p.change.pos; let new_look_direction = LookDirection { - x_rot: (p.x_rot as i32 * 360) as f32 / 256., - y_rot: (p.y_rot as i32 * 360) as f32 / 256., + x_rot: (p.change.look_direction.x_rot as i32 * 360) as f32 / 256., + y_rot: (p.change.look_direction.y_rot as i32 * 360) as f32 / 256., }; commands.entity(entity).queue(RelativeEntityUpdate { partial_world: instance_holder.partial_instance.clone(), @@ -879,35 +878,34 @@ pub fn process_packet_events(ecs: &mut World) { debug!("Got move entity pos packet {p:?}"); - let entity = entity_id_index.get(&MinecraftEntityId(p.entity_id)); - - if let Some(entity) = entity { - let new_delta = p.delta.clone(); - let new_on_ground = p.on_ground; - commands.entity(entity).queue(RelativeEntityUpdate { - partial_world: instance_holder.partial_instance.clone(), - update: Box::new(move |entity_mut| { - let mut physics = entity_mut.get_mut::().unwrap(); - let new_pos = physics.vec_delta_codec.decode( - new_delta.xa as i64, - new_delta.ya as i64, - new_delta.za as i64, - ); - physics.vec_delta_codec.set_base(new_pos); - physics.set_on_ground(new_on_ground); - - let mut position = entity_mut.get_mut::().unwrap(); - if new_pos != **position { - **position = new_pos; - } - }), - }); - } else { + let Some(entity) = entity_id_index.get(&MinecraftEntityId(p.entity_id)) else { warn!( "Got move entity pos packet for unknown entity id {}", p.entity_id ); - } + continue; + }; + + let new_delta = p.delta.clone(); + let new_on_ground = p.on_ground; + commands.entity(entity).queue(RelativeEntityUpdate { + partial_world: instance_holder.partial_instance.clone(), + update: Box::new(move |entity_mut| { + let mut physics = entity_mut.get_mut::().unwrap(); + let new_pos = physics.vec_delta_codec.decode( + new_delta.xa as i64, + new_delta.ya as i64, + new_delta.za as i64, + ); + physics.vec_delta_codec.set_base(new_pos); + physics.set_on_ground(new_on_ground); + + let mut position = entity_mut.get_mut::().unwrap(); + if new_pos != **position { + **position = new_pos; + } + }), + }); system_state.apply(ecs); } @@ -1191,7 +1189,7 @@ pub fn process_packet_events(ecs: &mut World) { events.send(SetContainerContentEvent { entity: player_entity, slots: p.items.clone(), - container_id: p.container_id as u8, + container_id: p.container_id, }); } } @@ -1235,7 +1233,7 @@ pub fn process_packet_events(ecs: &mut World) { if let Some(slot) = inventory.inventory_menu.slot_mut(p.slot.into()) { *slot = p.item_stack.clone(); } - } else if p.container_id == (inventory.id as i8) + } else if p.container_id == inventory.id && (p.container_id != 0 || !is_creative_mode_and_inventory_closed) { // var2.containerMenu.setItem(var4, var1.getStateId(), var3); @@ -1260,20 +1258,18 @@ pub fn process_packet_events(ecs: &mut World) { ClientboundGamePacket::DeleteChat(_) => {} ClientboundGamePacket::Explode(p) => { trace!("Got explode packet {p:?}"); - let mut system_state: SystemState> = - SystemState::new(ecs); - let mut knockback_events = system_state.get_mut(ecs); + if let Some(knockback) = p.knockback { + let mut system_state: SystemState> = + SystemState::new(ecs); + let mut knockback_events = system_state.get_mut(ecs); - knockback_events.send(KnockbackEvent { - entity: player_entity, - knockback: KnockbackType::Set(Vec3 { - x: p.knockback_x as f64, - y: p.knockback_y as f64, - z: p.knockback_z as f64, - }), - }); + knockback_events.send(KnockbackEvent { + entity: player_entity, + knockback: KnockbackType::Set(knockback), + }); - system_state.apply(ecs); + system_state.apply(ecs); + } } ClientboundGamePacket::ForgetLevelChunk(p) => { debug!("Got forget level chunk packet {p:?}"); diff --git a/azalea-protocol/src/common/mod.rs b/azalea-protocol/src/common/mod.rs index da535b487..9258e538d 100644 --- a/azalea-protocol/src/common/mod.rs +++ b/azalea-protocol/src/common/mod.rs @@ -1,4 +1,6 @@ //! Some serializable data types that are used by several packets. pub mod client_information; +pub mod movements; +pub mod recipe; pub mod server_links; diff --git a/azalea-protocol/src/common/movements.rs b/azalea-protocol/src/common/movements.rs new file mode 100644 index 000000000..7672703f0 --- /dev/null +++ b/azalea-protocol/src/common/movements.rs @@ -0,0 +1,71 @@ +use std::io::{self, Cursor, Write}; + +use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError}; +use azalea_core::{bitset::FixedBitSet, position::Vec3}; +use azalea_entity::LookDirection; + +/// The updated position, velocity, and rotations for an entity. +/// +/// Often, this field comes alongside a [`RelativeMovements`] field, which +/// specifies which parts of this struct should be treated as relative. +#[derive(AzBuf, Clone, Debug)] +pub struct PositionMoveRotation { + pub pos: Vec3, + /// The updated delta movement (velocity). + pub delta: Vec3, + pub look_direction: LookDirection, +} + +#[derive(Debug, Clone)] +pub struct RelativeMovements { + pub x: bool, + pub y: bool, + pub z: bool, + pub y_rot: bool, + pub x_rot: bool, + pub delta_x: bool, + pub delta_y: bool, + pub delta_z: bool, + pub rotate_delta: bool, +} + +impl AzaleaRead for RelativeMovements { + fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { + // yes minecraft seriously wastes that many bits, smh + let set = FixedBitSet::<{ 32_usize.div_ceil(8) }>::azalea_read(buf)?; + Ok(RelativeMovements { + x: set.index(0), + y: set.index(1), + z: set.index(2), + y_rot: set.index(3), + x_rot: set.index(4), + delta_x: set.index(5), + delta_y: set.index(6), + delta_z: set.index(7), + rotate_delta: set.index(8), + }) + } +} + +impl AzaleaWrite for RelativeMovements { + fn azalea_write(&self, buf: &mut impl Write) -> Result<(), io::Error> { + let mut set = FixedBitSet::<{ 32_usize.div_ceil(8) }>::new(); + let mut set_bit = |index: usize, value: bool| { + if value { + set.set(index); + } + }; + + set_bit(0, self.x); + set_bit(1, self.y); + set_bit(2, self.z); + set_bit(3, self.y_rot); + set_bit(4, self.x_rot); + set_bit(5, self.delta_x); + set_bit(6, self.delta_y); + set_bit(7, self.delta_z); + set_bit(8, self.rotate_delta); + + set.azalea_write(buf) + } +} diff --git a/azalea-protocol/src/common/recipe.rs b/azalea-protocol/src/common/recipe.rs new file mode 100644 index 000000000..15d40ccad --- /dev/null +++ b/azalea-protocol/src/common/recipe.rs @@ -0,0 +1,101 @@ +use azalea_buf::AzBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_inventory::ItemStack; +use azalea_registry::HolderSet; + +/// [`azalea_registry::RecipeDisplay`] +#[derive(Clone, Debug, AzBuf)] +pub enum RecipeDisplayData { + Shapeless(ShapelessCraftingRecipeDisplay), + Shaped(ShapedCraftingRecipeDisplay), + Furnace(FurnaceRecipeDisplay), + Stonecutter(StonecutterRecipeDisplay), + Smithing(SmithingRecipeDisplay), +} + +#[derive(Clone, Debug, AzBuf)] +pub struct ShapelessCraftingRecipeDisplay { + pub ingredients: Vec, + pub result: SlotDisplayData, + pub crafting_station: SlotDisplayData, +} +#[derive(Clone, Debug, AzBuf)] +pub struct ShapedCraftingRecipeDisplay { + #[var] + pub width: u32, + #[var] + pub height: u32, + pub ingredients: Vec, + pub result: SlotDisplayData, + pub crafting_station: SlotDisplayData, +} +#[derive(Clone, Debug, AzBuf)] +pub struct FurnaceRecipeDisplay { + pub ingredient: SlotDisplayData, + pub fuel: SlotDisplayData, + pub result: SlotDisplayData, + pub crafting_station: SlotDisplayData, + #[var] + pub duration: u32, + pub experience: f32, +} +#[derive(Clone, Debug, AzBuf)] +pub struct StonecutterRecipeDisplay { + pub input: SlotDisplayData, + pub result: SlotDisplayData, + pub crafting_station: SlotDisplayData, +} +#[derive(Clone, Debug, AzBuf)] +pub struct SmithingRecipeDisplay { + pub template: SlotDisplayData, + pub base: SlotDisplayData, + pub addition: SlotDisplayData, + pub result: SlotDisplayData, + pub crafting_station: SlotDisplayData, +} + +#[derive(Clone, Debug, PartialEq, AzBuf)] +pub struct Ingredient { + pub allowed: HolderSet, +} + +/// [`azalea_registry::SlotDisplay`] +#[derive(Clone, Debug, PartialEq, AzBuf)] +pub enum SlotDisplayData { + Empty, + AnyFuel, + Item(ItemStackDisplay), + ItemStack(ItemStackSlotDisplay), + Tag(ResourceLocation), + SmithingTrim(Box), + WithRemainder(Box), + Composite(CompositeSlotDisplay), +} + +#[derive(Clone, Debug, PartialEq, AzBuf)] +pub struct ItemStackDisplay { + pub item: azalea_registry::Item, +} +#[derive(Clone, Debug, PartialEq, AzBuf)] +pub struct ItemStackSlotDisplay { + pub stack: ItemStack, +} +#[derive(Clone, Debug, PartialEq, AzBuf)] +pub struct TagSlotDisplay { + pub tag: azalea_registry::Item, +} +#[derive(Clone, Debug, PartialEq, AzBuf)] +pub struct SmithingTrimDemoSlotDisplay { + pub base: SlotDisplayData, + pub material: SlotDisplayData, + pub pattern: SlotDisplayData, +} +#[derive(Clone, Debug, PartialEq, AzBuf)] +pub struct WithRemainderSlotDisplay { + pub input: SlotDisplayData, + pub remainder: SlotDisplayData, +} +#[derive(Clone, Debug, PartialEq, AzBuf)] +pub struct CompositeSlotDisplay { + pub contents: Vec, +} diff --git a/azalea-protocol/src/packets/config/mod.rs b/azalea-protocol/src/packets/config/mod.rs index 4eda0f039..ab1c1a780 100755 --- a/azalea-protocol/src/packets/config/mod.rs +++ b/azalea-protocol/src/packets/config/mod.rs @@ -5,32 +5,32 @@ use azalea_protocol_macros::declare_state_packets; declare_state_packets!(ConfigPacket, Clientbound => [ - cookie_request, - custom_payload, - disconnect, - finish_configuration, - keep_alive, - ping, - reset_chat, - registry_data, - resource_pack_pop, - resource_pack_push, - store_cookie, - transfer, - update_enabled_features, - update_tags, - select_known_packs, - custom_report_details, - server_links, + cookie_request, // 0x00 + custom_payload, // 0x01 + disconnect, // 0x02 + finish_configuration, // 0x03 + keep_alive, // 0x04 + ping, // 0x05 + reset_chat, // 0x06 + registry_data, // 0x07 + resource_pack_pop, // 0x08 + resource_pack_push, // 0x09 + store_cookie, // 0x0A + transfer, // 0x0B + update_enabled_features, // 0x0C + update_tags, // 0x0D + select_known_packs, // 0x0E + custom_report_details, // 0x0F + server_links, // 0x10 ], Serverbound => [ - client_information, - cookie_response, - custom_payload, - finish_configuration, - keep_alive, - pong, - resource_pack, - select_known_packs, + client_information, // 0x00 + cookie_response, // 0x01 + custom_payload, // 0x02 + finish_configuration, // 0x03 + keep_alive, // 0x04 + pong, // 0x05 + resource_pack, // 0x06 + select_known_packs, // 0x07 ] ); diff --git a/azalea-protocol/src/packets/game/c_add_experience_orb.rs b/azalea-protocol/src/packets/game/c_add_experience_orb.rs index b3d12858d..195ccc5ae 100755 --- a/azalea-protocol/src/packets/game/c_add_experience_orb.rs +++ b/azalea-protocol/src/packets/game/c_add_experience_orb.rs @@ -1,12 +1,11 @@ use azalea_buf::AzBuf; +use azalea_core::position::Vec3; use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundAddExperienceOrb { #[var] pub id: u32, - pub x: f64, - pub y: f64, - pub z: f64, + pub pos: Vec3, pub value: u16, } diff --git a/azalea-protocol/src/packets/game/c_container_close.rs b/azalea-protocol/src/packets/game/c_container_close.rs index dda6153b2..1e6623c07 100644 --- a/azalea-protocol/src/packets/game/c_container_close.rs +++ b/azalea-protocol/src/packets/game/c_container_close.rs @@ -3,5 +3,6 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundContainerClose { - pub container_id: u8, + #[var] + pub container_id: i32, } diff --git a/azalea-protocol/src/packets/game/c_container_set_content.rs b/azalea-protocol/src/packets/game/c_container_set_content.rs index d4bd91840..0a7e910b9 100755 --- a/azalea-protocol/src/packets/game/c_container_set_content.rs +++ b/azalea-protocol/src/packets/game/c_container_set_content.rs @@ -4,7 +4,8 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundContainerSetContent { - pub container_id: i8, + #[var] + pub container_id: i32, #[var] pub state_id: u32, pub items: Vec, diff --git a/azalea-protocol/src/packets/game/c_container_set_data.rs b/azalea-protocol/src/packets/game/c_container_set_data.rs index 3815f5c51..149080b10 100755 --- a/azalea-protocol/src/packets/game/c_container_set_data.rs +++ b/azalea-protocol/src/packets/game/c_container_set_data.rs @@ -3,7 +3,8 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundContainerSetData { - pub container_id: i8, + #[var] + pub container_id: i32, pub id: u16, pub value: u16, } diff --git a/azalea-protocol/src/packets/game/c_container_set_slot.rs b/azalea-protocol/src/packets/game/c_container_set_slot.rs index 5e3476d9d..20df5b06f 100755 --- a/azalea-protocol/src/packets/game/c_container_set_slot.rs +++ b/azalea-protocol/src/packets/game/c_container_set_slot.rs @@ -4,7 +4,8 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundContainerSetSlot { - pub container_id: i8, + #[var] + pub container_id: i32, #[var] pub state_id: u32, pub slot: u16, diff --git a/azalea-protocol/src/packets/game/c_entity_position_sync.rs b/azalea-protocol/src/packets/game/c_entity_position_sync.rs index 6347ec5ed..0e8bea01f 100755 --- a/azalea-protocol/src/packets/game/c_entity_position_sync.rs +++ b/azalea-protocol/src/packets/game/c_entity_position_sync.rs @@ -1,7 +1,7 @@ use azalea_buf::AzBuf; use azalea_protocol_macros::ClientboundGamePacket; -use super::c_player_position::PositionMoveRotation; +use crate::common::movements::PositionMoveRotation; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundEntityPositionSync { diff --git a/azalea-protocol/src/packets/game/c_explode.rs b/azalea-protocol/src/packets/game/c_explode.rs index aef3887d0..c5d90d031 100755 --- a/azalea-protocol/src/packets/game/c_explode.rs +++ b/azalea-protocol/src/packets/game/c_explode.rs @@ -1,164 +1,13 @@ -use std::{ - io::{Cursor, Write}, - str::FromStr, -}; - -use azalea_buf::{AzBuf, AzaleaRead, AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError}; -use azalea_core::{position::BlockPos, resource_location::ResourceLocation}; +use azalea_buf::AzBuf; +use azalea_core::position::Vec3; +use azalea_entity::particle::Particle; use azalea_protocol_macros::ClientboundGamePacket; -use azalea_registry::{ParticleKind, SoundEvent}; +use azalea_registry::SoundEvent; -#[derive(Clone, Debug, PartialEq, ClientboundGamePacket)] +#[derive(Clone, Debug, ClientboundGamePacket, AzBuf)] pub struct ClientboundExplode { - pub x: f64, - pub y: f64, - pub z: f64, - pub power: f32, - pub to_blow: Vec, - pub knockback_x: f32, - pub knockback_y: f32, - pub knockback_z: f32, - pub block_interaction: BlockInteraction, - pub small_explosion_particles: ParticleKind, - pub large_explosion_particles: ParticleKind, + pub center: Vec3, + pub knockback: Option, + pub explosion_particle: Particle, pub explosion_sound: SoundEvent, } - -#[derive(Clone, Copy, Debug, PartialEq, AzBuf)] -pub enum BlockInteraction { - Keep, - Destroy, - DestroyWithDecay, - TriggerBlock, -} - -impl AzaleaRead for ClientboundExplode { - fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let x = f64::azalea_read(buf)?; - let y = f64::azalea_read(buf)?; - let z = f64::azalea_read(buf)?; - let power = f32::azalea_read(buf)?; - - let x_floor = x.floor() as i32; - let y_floor = y.floor() as i32; - let z_floor = z.floor() as i32; - - let to_blow_len = u32::azalea_read_var(buf)?; - let mut to_blow = Vec::with_capacity(to_blow_len as usize); - for _ in 0..to_blow_len { - // the bytes are offsets from the main x y z - let x = x_floor + i32::from(i8::azalea_read(buf)?); - let y = y_floor + i32::from(i8::azalea_read(buf)?); - let z = z_floor + i32::from(i8::azalea_read(buf)?); - to_blow.push(BlockPos { x, y, z }); - } - - let knockback_x = f32::azalea_read(buf)?; - let knockback_y = f32::azalea_read(buf)?; - let knockback_z = f32::azalea_read(buf)?; - - let block_interaction = BlockInteraction::azalea_read(buf)?; - let small_explosion_particles = ParticleKind::azalea_read(buf)?; - let large_explosion_particles = ParticleKind::azalea_read(buf)?; - - let sound_event_resource_location = ResourceLocation::azalea_read(buf)?.to_string(); - let explosion_sound = - SoundEvent::from_str(&sound_event_resource_location).map_err(|_| { - BufReadError::UnexpectedStringEnumVariant { - id: sound_event_resource_location, - } - })?; - - Ok(Self { - x, - y, - z, - power, - to_blow, - knockback_x, - knockback_y, - knockback_z, - block_interaction, - small_explosion_particles, - large_explosion_particles, - explosion_sound, - }) - } -} - -impl AzaleaWrite for ClientboundExplode { - fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - self.x.azalea_write(buf)?; - self.y.azalea_write(buf)?; - self.z.azalea_write(buf)?; - self.power.azalea_write(buf)?; - - let to_blow_len = self.to_blow.len() as u32; - to_blow_len.azalea_write_var(buf)?; - - let x_floor = self.x.floor() as i32; - let y_floor = self.y.floor() as i32; - let z_floor = self.z.floor() as i32; - - for pos in &self.to_blow { - let x = (pos.x - x_floor) as i8; - let y = (pos.y - y_floor) as i8; - let z = (pos.z - z_floor) as i8; - x.azalea_write(buf)?; - y.azalea_write(buf)?; - z.azalea_write(buf)?; - } - - self.knockback_x.azalea_write(buf)?; - self.knockback_y.azalea_write(buf)?; - self.knockback_z.azalea_write(buf)?; - - self.block_interaction.azalea_write(buf)?; - self.small_explosion_particles.azalea_write(buf)?; - self.large_explosion_particles.azalea_write(buf)?; - - let sound_event_resource_location = - ResourceLocation::new(&self.explosion_sound.to_string()); - sound_event_resource_location.azalea_write(buf)?; - - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_read_write() { - let packet = ClientboundExplode { - x: 123_456.0, - y: 789_012.0, - z: 345_678.0, - power: 1_000.0, - to_blow: vec![ - BlockPos { - x: 123_456 + 1, - y: 789_012 + 2, - z: 345_678 - 127, - }, - BlockPos { - x: 123_456 + 4, - y: 789_012 - 5, - z: 345_678 + 6, - }, - ], - knockback_x: 1_000.0, - knockback_y: 2_000.0, - knockback_z: 3_000.0, - block_interaction: BlockInteraction::Destroy, - small_explosion_particles: ParticleKind::Explosion, - large_explosion_particles: ParticleKind::ExplosionEmitter, - explosion_sound: SoundEvent::EntityGenericExplode, - }; - let mut buf = Vec::new(); - packet.azalea_write(&mut buf).unwrap(); - let packet2 = ClientboundExplode::azalea_read(&mut Cursor::new(&buf)).unwrap(); - assert_eq!(packet, packet2); - } -} diff --git a/azalea-protocol/src/packets/game/c_horse_screen_open.rs b/azalea-protocol/src/packets/game/c_horse_screen_open.rs index 13a672532..10a897259 100755 --- a/azalea-protocol/src/packets/game/c_horse_screen_open.rs +++ b/azalea-protocol/src/packets/game/c_horse_screen_open.rs @@ -3,8 +3,9 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundHorseScreenOpen { - pub container_id: u8, #[var] - pub size: u32, + pub container_id: i32, + #[var] + pub inventory_columns: u32, pub entity_id: u32, } diff --git a/azalea-protocol/src/packets/game/c_level_particles.rs b/azalea-protocol/src/packets/game/c_level_particles.rs index ef50d0cd7..4f77af842 100755 --- a/azalea-protocol/src/packets/game/c_level_particles.rs +++ b/azalea-protocol/src/packets/game/c_level_particles.rs @@ -1,4 +1,5 @@ use azalea_buf::AzBuf; +use azalea_core::position::Vec3; use azalea_entity::particle::Particle; use azalea_protocol_macros::ClientboundGamePacket; @@ -6,9 +7,7 @@ use azalea_protocol_macros::ClientboundGamePacket; pub struct ClientboundLevelParticles { pub override_limiter: bool, pub always_show: bool, - pub x: f64, - pub y: f64, - pub z: f64, + pub pos: Vec3, pub x_dist: f32, pub y_dist: f32, pub z_dist: f32, diff --git a/azalea-protocol/src/packets/game/c_merchant_offers.rs b/azalea-protocol/src/packets/game/c_merchant_offers.rs index e1822579b..f50f99320 100755 --- a/azalea-protocol/src/packets/game/c_merchant_offers.rs +++ b/azalea-protocol/src/packets/game/c_merchant_offers.rs @@ -5,7 +5,7 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundMerchantOffers { #[var] - pub container_id: u32, + pub container_id: i32, pub offers: Vec, #[var] pub villager_level: u32, diff --git a/azalea-protocol/src/packets/game/c_move_vehicle.rs b/azalea-protocol/src/packets/game/c_move_vehicle.rs index 96e3e5c27..e9891694d 100755 --- a/azalea-protocol/src/packets/game/c_move_vehicle.rs +++ b/azalea-protocol/src/packets/game/c_move_vehicle.rs @@ -1,11 +1,10 @@ use azalea_buf::AzBuf; +use azalea_core::position::Vec3; +use azalea_entity::LookDirection; use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundMoveVehicle { - pub x: f64, - pub y: f64, - pub z: f64, - pub y_rot: f32, - pub x_rot: f32, + pub pos: Vec3, + pub look_direction: LookDirection, } diff --git a/azalea-protocol/src/packets/game/c_open_screen.rs b/azalea-protocol/src/packets/game/c_open_screen.rs index 4ba717250..834802dd1 100755 --- a/azalea-protocol/src/packets/game/c_open_screen.rs +++ b/azalea-protocol/src/packets/game/c_open_screen.rs @@ -5,7 +5,7 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundOpenScreen { #[var] - pub container_id: u32, + pub container_id: i32, pub menu_type: azalea_registry::MenuKind, pub title: FormattedText, } diff --git a/azalea-protocol/src/packets/game/c_place_ghost_recipe.rs b/azalea-protocol/src/packets/game/c_place_ghost_recipe.rs index 41c324032..ec2fc7727 100755 --- a/azalea-protocol/src/packets/game/c_place_ghost_recipe.rs +++ b/azalea-protocol/src/packets/game/c_place_ghost_recipe.rs @@ -1,9 +1,11 @@ use azalea_buf::AzBuf; -use azalea_core::resource_location::ResourceLocation; use azalea_protocol_macros::ClientboundGamePacket; +use crate::common::recipe::RecipeDisplayData; + #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundPlaceGhostRecipe { - pub container_id: u8, - pub recipe: ResourceLocation, + #[var] + pub container_id: i32, + pub recipe: RecipeDisplayData, } diff --git a/azalea-protocol/src/packets/game/c_player_look_at.rs b/azalea-protocol/src/packets/game/c_player_look_at.rs index 4d8868140..cc5e0bdab 100755 --- a/azalea-protocol/src/packets/game/c_player_look_at.rs +++ b/azalea-protocol/src/packets/game/c_player_look_at.rs @@ -1,12 +1,11 @@ use azalea_buf::AzBuf; +use azalea_core::position::Vec3; use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundPlayerLookAt { pub from_anchor: Anchor, - pub x: f64, - pub y: f64, - pub z: f64, + pub pos: Vec3, pub entity: Option, } diff --git a/azalea-protocol/src/packets/game/c_player_position.rs b/azalea-protocol/src/packets/game/c_player_position.rs index 8d19ce368..8460f4283 100755 --- a/azalea-protocol/src/packets/game/c_player_position.rs +++ b/azalea-protocol/src/packets/game/c_player_position.rs @@ -1,10 +1,8 @@ -use std::io::{Cursor, Write}; - -use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError}; -use azalea_core::{bitset::FixedBitSet, position::Vec3}; -use azalea_entity::LookDirection; +use azalea_buf::AzBuf; use azalea_protocol_macros::ClientboundGamePacket; +use crate::common::movements::{PositionMoveRotation, RelativeMovements}; + #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundPlayerPosition { #[var] @@ -12,71 +10,3 @@ pub struct ClientboundPlayerPosition { pub change: PositionMoveRotation, pub relative: RelativeMovements, } - -/// These values are either absolute or relative, depending on the fields from -/// the [`RelativeMovements`]. -#[derive(Clone, Debug, AzBuf)] -pub struct PositionMoveRotation { - pub pos: Vec3, - /// The updated delta movement (velocity). - /// - /// This is unused when included in a [`ClientboundEntityPositionSync`]. - /// - /// [`ClientboundEntityPositionSync`]: super::c_entity_position_sync::ClientboundEntityPositionSync - pub delta: Vec3, - pub look_direction: LookDirection, -} - -#[derive(Debug, Clone)] -pub struct RelativeMovements { - pub x: bool, - pub y: bool, - pub z: bool, - pub y_rot: bool, - pub x_rot: bool, - pub delta_x: bool, - pub delta_y: bool, - pub delta_z: bool, - pub rotate_delta: bool, -} - -impl AzaleaRead for RelativeMovements { - fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - // yes minecraft seriously wastes that many bits, smh - let set = FixedBitSet::<{ 32_usize.div_ceil(8) }>::azalea_read(buf)?; - Ok(RelativeMovements { - x: set.index(0), - y: set.index(1), - z: set.index(2), - y_rot: set.index(3), - x_rot: set.index(4), - delta_x: set.index(5), - delta_y: set.index(6), - delta_z: set.index(7), - rotate_delta: set.index(8), - }) - } -} - -impl AzaleaWrite for RelativeMovements { - fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<{ 32_usize.div_ceil(8) }>::new(); - let mut set_bit = |index: usize, value: bool| { - if value { - set.set(index); - } - }; - - set_bit(0, self.x); - set_bit(1, self.y); - set_bit(2, self.z); - set_bit(3, self.y_rot); - set_bit(4, self.x_rot); - set_bit(5, self.delta_x); - set_bit(6, self.delta_y); - set_bit(7, self.delta_z); - set_bit(8, self.rotate_delta); - - set.azalea_write(buf) - } -} diff --git a/azalea-protocol/src/packets/game/c_player_rotation.rs b/azalea-protocol/src/packets/game/c_player_rotation.rs index 33214cf9e..3e214203d 100755 --- a/azalea-protocol/src/packets/game/c_player_rotation.rs +++ b/azalea-protocol/src/packets/game/c_player_rotation.rs @@ -1,8 +1,8 @@ use azalea_buf::AzBuf; +use azalea_entity::LookDirection; use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundPlayerRotation { - pub y_rot: f32, - pub x_rot: f32, + pub look_direction: LookDirection, } diff --git a/azalea-protocol/src/packets/game/c_recipe_book_add.rs b/azalea-protocol/src/packets/game/c_recipe_book_add.rs index e6b911306..d31c4e74f 100755 --- a/azalea-protocol/src/packets/game/c_recipe_book_add.rs +++ b/azalea-protocol/src/packets/game/c_recipe_book_add.rs @@ -1,7 +1,7 @@ use azalea_buf::AzBuf; use azalea_protocol_macros::ClientboundGamePacket; -use super::c_update_recipes::{Ingredient, SlotDisplayData}; +use crate::common::recipe::{Ingredient, RecipeDisplayData}; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundRecipeBookAdd { @@ -20,60 +20,9 @@ pub struct RecipeDisplayEntry { #[var] pub id: u32, pub display: RecipeDisplayData, - // ByteBufCodecs.OPTIONAL_VAR_INT + // optional varint #[var] pub group: u32, pub category: azalea_registry::RecipeBookCategory, pub crafting_requirements: Option>, } - -/// [`azalea_registry::RecipeDisplay`] -#[derive(Clone, Debug, AzBuf)] -pub enum RecipeDisplayData { - Shapeless(ShapelessCraftingRecipeDisplay), - Shaped(ShapedCraftingRecipeDisplay), - Furnace(FurnaceRecipeDisplay), - Stonecutter(StonecutterRecipeDisplay), - Smithing(SmithingRecipeDisplay), -} - -#[derive(Clone, Debug, AzBuf)] -pub struct ShapelessCraftingRecipeDisplay { - pub ingredients: Vec, - pub result: SlotDisplayData, - pub crafting_station: SlotDisplayData, -} -#[derive(Clone, Debug, AzBuf)] -pub struct ShapedCraftingRecipeDisplay { - #[var] - pub width: u32, - #[var] - pub height: u32, - pub ingredients: Vec, - pub result: SlotDisplayData, - pub crafting_station: SlotDisplayData, -} -#[derive(Clone, Debug, AzBuf)] -pub struct FurnaceRecipeDisplay { - pub ingredient: SlotDisplayData, - pub fuel: SlotDisplayData, - pub result: SlotDisplayData, - pub crafting_station: SlotDisplayData, - #[var] - pub duration: u32, - pub experience: f32, -} -#[derive(Clone, Debug, AzBuf)] -pub struct StonecutterRecipeDisplay { - pub input: SlotDisplayData, - pub result: SlotDisplayData, - pub crafting_station: SlotDisplayData, -} -#[derive(Clone, Debug, AzBuf)] -pub struct SmithingRecipeDisplay { - pub template: SlotDisplayData, - pub base: SlotDisplayData, - pub addition: SlotDisplayData, - pub result: SlotDisplayData, - pub crafting_station: SlotDisplayData, -} diff --git a/azalea-protocol/src/packets/game/c_set_cursor_item.rs b/azalea-protocol/src/packets/game/c_set_cursor_item.rs index 2c10ae26a..7736ae2df 100644 --- a/azalea-protocol/src/packets/game/c_set_cursor_item.rs +++ b/azalea-protocol/src/packets/game/c_set_cursor_item.rs @@ -4,5 +4,5 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundSetCursorItem { - pub contents: Option, + pub contents: ItemStack, } diff --git a/azalea-protocol/src/packets/game/c_set_held_slot.rs b/azalea-protocol/src/packets/game/c_set_held_slot.rs index 81c21651d..5f188cc6a 100644 --- a/azalea-protocol/src/packets/game/c_set_held_slot.rs +++ b/azalea-protocol/src/packets/game/c_set_held_slot.rs @@ -3,5 +3,6 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundSetHeldSlot { - pub slot: u8, + #[var] + pub slot: u32, } diff --git a/azalea-protocol/src/packets/game/c_set_player_inventory.rs b/azalea-protocol/src/packets/game/c_set_player_inventory.rs index ca8955ee7..6775a4864 100644 --- a/azalea-protocol/src/packets/game/c_set_player_inventory.rs +++ b/azalea-protocol/src/packets/game/c_set_player_inventory.rs @@ -5,6 +5,6 @@ use azalea_protocol_macros::ClientboundGamePacket; #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundSetPlayerInventory { #[var] - pub slot: i32, - pub contents: Option, + pub slot: u32, + pub contents: ItemStack, } diff --git a/azalea-protocol/src/packets/game/c_teleport_entity.rs b/azalea-protocol/src/packets/game/c_teleport_entity.rs index 0f0261332..7073c6250 100755 --- a/azalea-protocol/src/packets/game/c_teleport_entity.rs +++ b/azalea-protocol/src/packets/game/c_teleport_entity.rs @@ -1,13 +1,14 @@ use azalea_buf::AzBuf; -use azalea_core::position::Vec3; use azalea_protocol_macros::ClientboundGamePacket; +use crate::common::movements::{PositionMoveRotation, RelativeMovements}; + + #[derive(Clone, Debug, AzBuf, ClientboundGamePacket)] pub struct ClientboundTeleportEntity { #[var] pub id: u32, - pub position: Vec3, - pub y_rot: i8, - pub x_rot: i8, + pub change: PositionMoveRotation, + pub relatives: RelativeMovements, pub on_ground: bool, } diff --git a/azalea-protocol/src/packets/game/c_update_recipes.rs b/azalea-protocol/src/packets/game/c_update_recipes.rs index 38c4f37bf..e151ae519 100755 --- a/azalea-protocol/src/packets/game/c_update_recipes.rs +++ b/azalea-protocol/src/packets/game/c_update_recipes.rs @@ -2,9 +2,9 @@ use std::collections::HashMap; use azalea_buf::AzBuf; use azalea_core::resource_location::ResourceLocation; -use azalea_inventory::ItemStack; use azalea_protocol_macros::ClientboundGamePacket; -use azalea_registry::HolderSet; + +use crate::common::recipe::{Ingredient, SlotDisplayData}; #[derive(Clone, Debug, PartialEq, AzBuf, ClientboundGamePacket)] pub struct ClientboundUpdateRecipes { @@ -22,53 +22,7 @@ pub struct SelectableRecipe { pub option_display: SlotDisplayData, } -/// [`azalea_registry::SlotDisplay`] -#[derive(Clone, Debug, PartialEq, AzBuf)] -pub enum SlotDisplayData { - Empty, - AnyFuel, - Item(ItemStackDisplay), - ItemStack(ItemStackSlotDisplay), - Tag(ResourceLocation), - SmithingTrim(Box), - WithRemainder(Box), - Composite(CompositeSlotDisplay), -} - -#[derive(Clone, Debug, PartialEq, AzBuf)] -pub struct ItemStackDisplay { - pub item: azalea_registry::Item, -} -#[derive(Clone, Debug, PartialEq, AzBuf)] -pub struct ItemStackSlotDisplay { - pub stack: ItemStack, -} -#[derive(Clone, Debug, PartialEq, AzBuf)] -pub struct TagSlotDisplay { - pub tag: azalea_registry::Item, -} -#[derive(Clone, Debug, PartialEq, AzBuf)] -pub struct SmithingTrimDemoSlotDisplay { - pub base: SlotDisplayData, - pub material: SlotDisplayData, - pub pattern: SlotDisplayData, -} -#[derive(Clone, Debug, PartialEq, AzBuf)] -pub struct WithRemainderSlotDisplay { - pub input: SlotDisplayData, - pub remainder: SlotDisplayData, -} -#[derive(Clone, Debug, PartialEq, AzBuf)] -pub struct CompositeSlotDisplay { - pub contents: Vec, -} - #[derive(Clone, Debug, PartialEq, AzBuf)] pub struct RecipePropertySet { pub items: Vec, } - -#[derive(Clone, Debug, PartialEq, AzBuf)] -pub struct Ingredient { - pub allowed: HolderSet, -} diff --git a/azalea-protocol/src/packets/game/mod.rs b/azalea-protocol/src/packets/game/mod.rs index 35c1a2fef..e9c9e2a17 100755 --- a/azalea-protocol/src/packets/game/mod.rs +++ b/azalea-protocol/src/packets/game/mod.rs @@ -5,200 +5,200 @@ use azalea_protocol_macros::declare_state_packets; declare_state_packets!(GamePacket, Clientbound => [ - bundle_delimiter, - add_entity, - add_experience_orb, - animate, - award_stats, - block_changed_ack, - block_destruction, - block_entity_data, - block_event, - block_update, - boss_event, - change_difficulty, - chunk_batch_finished, - chunk_batch_start, - chunks_biomes, - clear_titles, - command_suggestions, - commands, - container_close, - container_set_content, - container_set_data, - container_set_slot, - cookie_request, - cooldown, - custom_chat_completions, - custom_payload, - damage_event, - debug_sample, - delete_chat, - disconnect, - disguised_chat, - entity_event, - entity_position_sync, - explode, - forget_level_chunk, - game_event, - horse_screen_open, - hurt_animation, - initialize_border, - keep_alive, - level_chunk_with_light, - level_event, - level_particles, - light_update, - login, - map_item_data, - merchant_offers, - move_entity_pos, - move_entity_pos_rot, - move_minecart_along_track, - move_entity_rot, - move_vehicle, - open_book, - open_screen, - open_sign_editor, - ping, - pong_response, - place_ghost_recipe, - player_abilities, - player_chat, - player_combat_end, - player_combat_enter, - player_combat_kill, - player_info_remove, - player_info_update, - player_look_at, - player_position, - player_rotation, - recipe_book_add, - recipe_book_remove, - recipe_book_settings, - remove_entities, - remove_mob_effect, - reset_score, - resource_pack_pop, - resource_pack_push, - respawn, - rotate_head, - section_blocks_update, - select_advancements_tab, - server_data, - set_action_bar_text, - set_border_center, - set_border_lerp_size, - set_border_size, - set_border_warning_delay, - set_border_warning_distance, - set_camera, - set_chunk_cache_center, - set_chunk_cache_radius, - set_cursor_item, - set_default_spawn_position, - set_display_objective, - set_entity_data, - set_entity_link, - set_entity_motion, - set_equipment, - set_experience, - set_health, - set_held_slot, - set_objective, - set_passengers, - set_player_inventory, - set_player_team, - set_score, - set_simulation_distance, - set_subtitle_text, - set_time, - set_title_text, - set_titles_animation, - sound_entity, - sound, - start_configuration, - stop_sound, - store_cookie, - system_chat, - tab_list, - tag_query, - take_item_entity, - teleport_entity, - ticking_state, - ticking_step, - transfer, - update_advancements, - update_attributes, - update_mob_effect, - update_recipes, - update_tags, - projectile_power, - custom_report_details, - server_links, + bundle_delimiter, // 0x00 + add_entity, // 0x01 + add_experience_orb, // 0x02 + animate, // 0x03 + award_stats, // 0x04 + block_changed_ack, // 0x05 + block_destruction, // 0x06 + block_entity_data, // 0x07 + block_event, // 0x08 + block_update, // 0x09 + boss_event, // 0x0A + change_difficulty, // 0x0B + chunk_batch_finished, // 0x0C + chunk_batch_start, // 0x0D + chunks_biomes, // 0x0E + clear_titles, // 0x0F + command_suggestions, // 0x10 + commands, // 0x11 + container_close, // 0x12 + container_set_content, // 0x13 + container_set_data, // 0x14 + container_set_slot, // 0x15 + cookie_request, // 0x16 + cooldown, // 0x17 + custom_chat_completions, // 0x18 + custom_payload, // 0x19 + damage_event, // 0x1A + debug_sample, // 0x1B + delete_chat, // 0x1C + disconnect, // 0x1D + disguised_chat, // 0x1E + entity_event, // 0x1F + entity_position_sync, // 0x20 + explode, // 0x21 + forget_level_chunk, // 0x22 + game_event, // 0x23 + horse_screen_open, // 0x24 + hurt_animation, // 0x25 + initialize_border, // 0x26 + keep_alive, // 0x27 + level_chunk_with_light, // 0x28 + level_event, // 0x29 + level_particles, // 0x2A + light_update, // 0x2B + login, // 0x2C + map_item_data, // 0x2D + merchant_offers, // 0x2E + move_entity_pos, // 0x2F + move_entity_pos_rot, // 0x30 + move_minecart_along_track, // 0x31 + move_entity_rot, // 0x32 + move_vehicle, // 0x33 + open_book, // 0x34 + open_screen, // 0x35 + open_sign_editor, // 0x36 + ping, // 0x37 + pong_response, // 0x38 + place_ghost_recipe, // 0x39 + player_abilities, // 0x3A + player_chat, // 0x3B + player_combat_end, // 0x3C + player_combat_enter, // 0x3D + player_combat_kill, // 0x3E + player_info_remove, // 0x3F + player_info_update, // 0x40 + player_look_at, // 0x41 + player_position, // 0x42 + player_rotation, // 0x43 + recipe_book_add, // 0x44 + recipe_book_remove, // 0x45 + recipe_book_settings, // 0x46 + remove_entities, // 0x47 + remove_mob_effect, // 0x48 + reset_score, // 0x49 + resource_pack_pop, // 0x4A + resource_pack_push, // 0x4B + respawn, // 0x4C + rotate_head, // 0x4D + section_blocks_update, // 0x4E + select_advancements_tab, // 0x4F + server_data, // 0x50 + set_action_bar_text, // 0x51 + set_border_center, // 0x52 + set_border_lerp_size, // 0x53 + set_border_size, // 0x54 + set_border_warning_delay, // 0x55 + set_border_warning_distance, // 0x56 + set_camera, // 0x57 + set_chunk_cache_center, // 0x58 + set_chunk_cache_radius, // 0x59 + set_cursor_item, // 0x5A + set_default_spawn_position, // 0x5B + set_display_objective, // 0x5C + set_entity_data, // 0x5D + set_entity_link, // 0x5E + set_entity_motion, // 0x5F + set_equipment, // 0x60 + set_experience, // 0x61 + set_health, // 0x62 + set_held_slot, // 0x63 + set_objective, // 0x64 + set_passengers, // 0x65 + set_player_inventory, // 0x66 + set_player_team, // 0x67 + set_score, // 0x68 + set_simulation_distance, // 0x69 + set_subtitle_text, // 0x6A + set_time, // 0x6B + set_title_text, // 0x6C + set_titles_animation, // 0x6D + sound_entity, // 0x6E + sound, // 0x6F + start_configuration, // 0x70 + stop_sound, // 0x71 + store_cookie, // 0x72 + system_chat, // 0x73 + tab_list, // 0x74 + tag_query, // 0x75 + take_item_entity, // 0x76 + teleport_entity, // 0x77 + ticking_state, // 0x78 + ticking_step, // 0x79 + transfer, // 0x7A + update_advancements, // 0x7B + update_attributes, // 0x7C + update_mob_effect, // 0x7D + update_recipes, // 0x7E + update_tags, // 0x7F + projectile_power, // 0x80 + custom_report_details, // 0x81 + server_links, // 0x82 ], Serverbound => [ - accept_teleportation, - block_entity_tag_query, - bundle_item_selected, - change_difficulty, - chat_ack, - chat_command, - chat_command_signed, - chat, - chat_session_update, - chunk_batch_received, - client_command, - client_tick_end, - client_information, - command_suggestion, - configuration_acknowledged, - container_button_click, - container_click, - container_close, - container_slot_state_changed, - cookie_response, - custom_payload, - debug_sample_subscription, - edit_book, - entity_tag_query, - interact, - jigsaw_generate, - keep_alive, - lock_difficulty, - move_player_pos, - move_player_pos_rot, - move_player_rot, - move_player_status_only, - move_vehicle, - paddle_boat, - pick_item_from_block, - pick_item_from_entity, - ping_request, - place_recipe, - player_abilities, - player_action, - player_command, - player_input, - player_loaded, - pong, - recipe_book_change_settings, - recipe_book_seen_recipe, - rename_item, - resource_pack, - seen_advancements, - select_trade, - set_beacon, - set_carried_item, - set_command_block, - set_command_minecart, - set_creative_mode_slot, - set_jigsaw_block, - set_structure_block, - sign_update, - swing, - teleport_to_entity, - use_item_on, - use_item, + accept_teleportation, // 0x00 + block_entity_tag_query, // 0x01 + bundle_item_selected, // 0x02 + change_difficulty, // 0x03 + chat_ack, // 0x04 + chat_command, // 0x05 + chat_command_signed, // 0x06 + chat, // 0x07 + chat_session_update, // 0x08 + chunk_batch_received, // 0x09 + client_command, // 0x0A + client_tick_end, // 0x0B + client_information, // 0x0C + command_suggestion, // 0x0D + configuration_acknowledged, // 0x0E + container_button_click, // 0x0F + container_click, // 0x10 + container_close, // 0x11 + container_slot_state_changed, // 0x12 + cookie_response, // 0x13 + custom_payload, // 0x14 + debug_sample_subscription, // 0x15 + edit_book, // 0x16 + entity_tag_query, // 0x17 + interact, // 0x18 + jigsaw_generate, // 0x19 + keep_alive, // 0x1A + lock_difficulty, // 0x1B + move_player_pos, // 0x1C + move_player_pos_rot, // 0x1D + move_player_rot, // 0x1E + move_player_status_only, // 0x1F + move_vehicle, // 0x20 + paddle_boat, // 0x21 + pick_item_from_block, // 0x22 + pick_item_from_entity, // 0x23 + ping_request, // 0x24 + place_recipe, // 0x25 + player_abilities, // 0x26 + player_action, // 0x27 + player_command, // 0x28 + player_input, // 0x29 + player_loaded, // 0x2A + pong, // 0x2B + recipe_book_change_settings, // 0x2C + recipe_book_seen_recipe, // 0x2D + rename_item, // 0x2E + resource_pack, // 0x2F + seen_advancements, // 0x30 + select_trade, // 0x31 + set_beacon, // 0x32 + set_carried_item, // 0x33 + set_command_block, // 0x34 + set_command_minecart, // 0x35 + set_creative_mode_slot, // 0x36 + set_jigsaw_block, // 0x37 + set_structure_block, // 0x38 + sign_update, // 0x39 + swing, // 0x3A + teleport_to_entity, // 0x3B + use_item_on, // 0x3C + use_item, // 0x3D ] ); diff --git a/azalea-protocol/src/packets/game/s_container_button_click.rs b/azalea-protocol/src/packets/game/s_container_button_click.rs index 909772f3c..7a27e1903 100755 --- a/azalea-protocol/src/packets/game/s_container_button_click.rs +++ b/azalea-protocol/src/packets/game/s_container_button_click.rs @@ -3,6 +3,8 @@ use azalea_protocol_macros::ServerboundGamePacket; #[derive(Clone, Debug, AzBuf, ServerboundGamePacket)] pub struct ServerboundContainerButtonClick { - pub container_id: u8, - pub button_id: u8, + #[var] + pub container_id: i32, + #[var] + pub button_id: u32, } diff --git a/azalea-protocol/src/packets/game/s_container_click.rs b/azalea-protocol/src/packets/game/s_container_click.rs index a6dee6972..2f7ef3d8f 100755 --- a/azalea-protocol/src/packets/game/s_container_click.rs +++ b/azalea-protocol/src/packets/game/s_container_click.rs @@ -6,7 +6,8 @@ use azalea_protocol_macros::ServerboundGamePacket; #[derive(Clone, Debug, AzBuf, ServerboundGamePacket)] pub struct ServerboundContainerClick { - pub container_id: u8, + #[var] + pub container_id: i32, #[var] pub state_id: u32, pub slot_num: i16, diff --git a/azalea-protocol/src/packets/game/s_container_close.rs b/azalea-protocol/src/packets/game/s_container_close.rs index 1cb88eabf..f19e0f2f1 100755 --- a/azalea-protocol/src/packets/game/s_container_close.rs +++ b/azalea-protocol/src/packets/game/s_container_close.rs @@ -3,5 +3,6 @@ use azalea_protocol_macros::ServerboundGamePacket; #[derive(Clone, Debug, AzBuf, ServerboundGamePacket)] pub struct ServerboundContainerClose { - pub container_id: u8, + #[var] + pub container_id: i32, } diff --git a/azalea-protocol/src/packets/game/s_container_slot_state_changed.rs b/azalea-protocol/src/packets/game/s_container_slot_state_changed.rs index 73ac02800..c22be4de9 100644 --- a/azalea-protocol/src/packets/game/s_container_slot_state_changed.rs +++ b/azalea-protocol/src/packets/game/s_container_slot_state_changed.rs @@ -6,6 +6,6 @@ pub struct ServerboundContainerSlotStateChanged { #[var] pub slot_id: u32, #[var] - pub container_id: u32, + pub container_id: i32, pub new_state: bool, } diff --git a/azalea-protocol/src/packets/game/s_move_player_pos.rs b/azalea-protocol/src/packets/game/s_move_player_pos.rs index 2e2ec0c55..2daf1d42c 100755 --- a/azalea-protocol/src/packets/game/s_move_player_pos.rs +++ b/azalea-protocol/src/packets/game/s_move_player_pos.rs @@ -1,10 +1,9 @@ use azalea_buf::AzBuf; +use azalea_core::position::Vec3; use azalea_protocol_macros::ServerboundGamePacket; #[derive(Clone, Debug, AzBuf, ServerboundGamePacket)] pub struct ServerboundMovePlayerPos { - pub x: f64, - pub y: f64, - pub z: f64, + pub pos: Vec3, pub on_ground: bool, } diff --git a/azalea-protocol/src/packets/game/s_move_player_pos_rot.rs b/azalea-protocol/src/packets/game/s_move_player_pos_rot.rs index 2cf186da2..3460c709a 100755 --- a/azalea-protocol/src/packets/game/s_move_player_pos_rot.rs +++ b/azalea-protocol/src/packets/game/s_move_player_pos_rot.rs @@ -1,11 +1,11 @@ use azalea_buf::AzBuf; use azalea_core::position::Vec3; +use azalea_entity::LookDirection; use azalea_protocol_macros::ServerboundGamePacket; #[derive(Clone, Debug, AzBuf, ServerboundGamePacket)] pub struct ServerboundMovePlayerPosRot { pub pos: Vec3, - pub y_rot: f32, - pub x_rot: f32, + pub look_direction: LookDirection, pub on_ground: bool, } diff --git a/azalea-protocol/src/packets/game/s_move_player_rot.rs b/azalea-protocol/src/packets/game/s_move_player_rot.rs index c3cda3ea1..6aef91b09 100755 --- a/azalea-protocol/src/packets/game/s_move_player_rot.rs +++ b/azalea-protocol/src/packets/game/s_move_player_rot.rs @@ -1,9 +1,9 @@ use azalea_buf::AzBuf; +use azalea_entity::LookDirection; use azalea_protocol_macros::ServerboundGamePacket; #[derive(Clone, Debug, AzBuf, ServerboundGamePacket)] pub struct ServerboundMovePlayerRot { - pub y_rot: f32, - pub x_rot: f32, + pub look_direction: LookDirection, pub on_ground: bool, } diff --git a/azalea-protocol/src/packets/game/s_move_vehicle.rs b/azalea-protocol/src/packets/game/s_move_vehicle.rs index 0452c9b02..76eac7e1e 100755 --- a/azalea-protocol/src/packets/game/s_move_vehicle.rs +++ b/azalea-protocol/src/packets/game/s_move_vehicle.rs @@ -1,11 +1,10 @@ use azalea_buf::AzBuf; +use azalea_core::position::Vec3; +use azalea_entity::LookDirection; use azalea_protocol_macros::ServerboundGamePacket; #[derive(Clone, Debug, AzBuf, ServerboundGamePacket)] pub struct ServerboundMoveVehicle { - pub x: f64, - pub y: f64, - pub z: f64, - pub y_rot: f32, - pub x_rot: f32, + pub pos: Vec3, + pub look_direction: LookDirection, } diff --git a/azalea-protocol/src/packets/game/s_place_recipe.rs b/azalea-protocol/src/packets/game/s_place_recipe.rs index 33456948b..849245416 100755 --- a/azalea-protocol/src/packets/game/s_place_recipe.rs +++ b/azalea-protocol/src/packets/game/s_place_recipe.rs @@ -4,7 +4,8 @@ use azalea_protocol_macros::ServerboundGamePacket; #[derive(Clone, Debug, AzBuf, ServerboundGamePacket)] pub struct ServerboundPlaceRecipe { - pub container_id: u8, + #[var] + pub container_id: i32, pub recipe: ResourceLocation, pub shift_down: bool, } diff --git a/azalea-protocol/src/packets/handshake/mod.rs b/azalea-protocol/src/packets/handshake/mod.rs index 90a312e7e..79dc583d8 100755 --- a/azalea-protocol/src/packets/handshake/mod.rs +++ b/azalea-protocol/src/packets/handshake/mod.rs @@ -7,6 +7,6 @@ declare_state_packets!(HandshakePacket, Clientbound => [ ], Serverbound => [ - intention, + intention, // 0x00 ] ); diff --git a/azalea-protocol/src/packets/login/mod.rs b/azalea-protocol/src/packets/login/mod.rs index 9edf50cf2..5e0a0433e 100755 --- a/azalea-protocol/src/packets/login/mod.rs +++ b/azalea-protocol/src/packets/login/mod.rs @@ -5,18 +5,18 @@ use azalea_protocol_macros::declare_state_packets; declare_state_packets!(LoginPacket, Clientbound => [ - login_disconnect, - hello, - login_finished, - login_compression, - custom_query, - cookie_request, + login_disconnect, // 0x00 + hello, // 0x01 + login_finished, // 0x02 + login_compression, // 0x03 + custom_query, // 0x04 + cookie_request, // 0x05 ], Serverbound => [ - hello, - key, - custom_query_answer, - login_acknowledged, - cookie_response, + hello, // 0x00 + key, // 0x01 + custom_query_answer, // 0x02 + login_acknowledged, // 0x03 + cookie_response, // 0x04 ] ); diff --git a/azalea-protocol/src/packets/status/mod.rs b/azalea-protocol/src/packets/status/mod.rs index 335600e31..6af513698 100755 --- a/azalea-protocol/src/packets/status/mod.rs +++ b/azalea-protocol/src/packets/status/mod.rs @@ -5,11 +5,11 @@ use azalea_protocol_macros::declare_state_packets; declare_state_packets!(StatusPacket, Clientbound => [ - status_response, - pong_response, + status_response, // 0x00 + pong_response, // 0x01 ], Serverbound => [ - status_request, - ping_request, + status_request, // 0x00 + ping_request, // 0x01 ] ); diff --git a/azalea/src/container.rs b/azalea/src/container.rs index df020dbec..388776161 100644 --- a/azalea/src/container.rs +++ b/azalea/src/container.rs @@ -117,7 +117,7 @@ impl ContainerClientExt for Client { /// A handle to a container that may be open. This does not close the container /// when it's dropped. See [`ContainerHandle`] if that behavior is desired. pub struct ContainerHandleRef { - id: u8, + id: i32, client: Client, } impl Debug for ContainerHandleRef { @@ -138,7 +138,7 @@ impl ContainerHandleRef { /// Get the id of the container. If this is 0, that means it's the player's /// inventory. Otherwise, the number isn't really meaningful since only one /// container can be open at a time. - pub fn id(&self) -> u8 { + pub fn id(&self) -> i32 { self.id } @@ -199,14 +199,14 @@ impl Debug for ContainerHandle { } } impl ContainerHandle { - fn new(id: u8, client: Client) -> Self { + fn new(id: i32, client: Client) -> Self { Self(ContainerHandleRef { id, client }) } /// Get the id of the container. If this is 0, that means it's the player's /// inventory. Otherwise, the number isn't really meaningful since only one /// container can be open at a time. - pub fn id(&self) -> u8 { + pub fn id(&self) -> i32 { self.0.id() } diff --git a/codegen/lib/code/packet.py b/codegen/lib/code/packet.py index 71bc3a704..1d60378ae 100755 --- a/codegen/lib/code/packet.py +++ b/codegen/lib/code/packet.py @@ -6,9 +6,6 @@ import re -def make_packet_mod_rs_line(packet_id: int, packet_class_name: str): - return f' {padded_hex(packet_id)}: {to_snake_case(packet_class_name)}::{to_camel_case(packet_class_name)},' - MOJMAP_TO_AZALEA_STATE_NAME_MAPPING = { # shorter name, i like it more 'configuration': 'config', @@ -62,12 +59,12 @@ def set_packets(packets_report): code.append('') code.append(f'declare_state_packets!({to_camel_case(state)}Packet,') code.append(' Clientbound => [') - for packet_name in clientbound_packets: - code.append(f' {packet_name},') + for packet_id, packet_name in enumerate(clientbound_packets): + code.append(f' {packet_name}, // {padded_hex(packet_id)}') code.append(' ],') code.append(' Serverbound => [') - for packet_name in serverbound_packets: - code.append(f' {packet_name},') + for packet_id, packet_name in enumerate(serverbound_packets): + code.append(f' {packet_name}, // {padded_hex(packet_id)}') code.append(' ]') code.append(');') code.append('') diff --git a/codegen/lib/utils.py b/codegen/lib/utils.py index efabbb384..162dd0fac 100755 --- a/codegen/lib/utils.py +++ b/codegen/lib/utils.py @@ -25,7 +25,7 @@ def upper_first_letter(name: str): def padded_hex(n: int): - return f'0x{n:02x}' + return f'0x{n:02X}' class PacketIdentifier: