From 18232e1d4860bd72d7acd4a48a93989f76a425bb Mon Sep 17 00:00:00 2001 From: Shayne Hartford Date: Mon, 15 Jul 2024 18:49:01 -0400 Subject: [PATCH 1/5] Emit configuration packets --- azalea-client/src/events.rs | 51 +++++++++++++++---- azalea-client/src/interact.rs | 12 ++--- azalea-client/src/lib.rs | 2 +- .../src/packet_handling/configuration.rs | 11 ++-- azalea-client/src/packet_handling/game.rs | 10 ++-- azalea-client/src/packet_handling/mod.rs | 2 +- azalea-protocol/src/connect.rs | 11 ++++ azalea/src/container.rs | 4 +- 8 files changed, 75 insertions(+), 28 deletions(-) diff --git a/azalea-client/src/events.rs b/azalea-client/src/events.rs index 9a51992c9..ba665f7cb 100644 --- a/azalea-client/src/events.rs +++ b/azalea-client/src/events.rs @@ -5,8 +5,12 @@ use std::sync::Arc; use azalea_chat::FormattedText; use azalea_core::tick::GameTick; -use azalea_protocol::packets::game::{ - clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket, ClientboundGamePacket, +use azalea_protocol::packets::{ + configuration::{ClientboundConfigurationPacket, ServerboundConfigurationPacket}, + game::{ + clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket, + ClientboundGamePacket, ServerboundGamePacket, + }, }; use azalea_world::{InstanceName, MinecraftEntityId}; use bevy_app::{App, Plugin, PreUpdate, Update}; @@ -23,13 +27,22 @@ use tokio::sync::mpsc; use crate::{ chat::{ChatPacket, ChatReceivedEvent}, disconnect::DisconnectEvent, - packet_handling::game::{ - AddPlayerEvent, DeathEvent, KeepAliveEvent, PacketEvent, RemovePlayerEvent, - UpdatePlayerEvent, + packet_handling::{ + configuration::ConfigurationPacketEvent, + game::{ + AddPlayerEvent, DeathEvent, GamePacketEvent, KeepAliveEvent, RemovePlayerEvent, + UpdatePlayerEvent, + }, }, PlayerInfo, }; +#[derive(Debug, Clone)] +pub enum ClientboundPacket { + Configuration(Arc), + Game(Arc), +} + // (for contributors): // HOW TO ADD A NEW (packet based) EVENT: // - make a struct that contains an entity field and a data field (look in @@ -82,7 +95,7 @@ pub enum Event { /// # } /// # } /// ``` - Packet(Arc), + Packet(ClientboundPacket), /// A player joined the game (or more specifically, was added to the tab /// list). AddPlayer(PlayerInfo), @@ -116,7 +129,8 @@ impl Plugin for EventPlugin { ( chat_listener, login_listener, - packet_listener, + configuration_packet_listener, + game_packet_listener, add_player_listener, update_player_listener, remove_player_listener, @@ -165,13 +179,32 @@ fn tick_listener(query: Query<&LocalPlayerEvents, With>) { } } -fn packet_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader) { +fn configuration_packet_listener( + query: Query<&LocalPlayerEvents>, + mut events: EventReader, +) { + for event in events.read() { + let local_player_events = query + .get(event.entity) + .expect("Non-local entities shouldn't be able to receive packet events"); + local_player_events + .send(Event::Packet(ClientboundPacket::Configuration( + event.packet.clone(), + ))) + .unwrap(); + } +} + +fn game_packet_listener( + query: Query<&LocalPlayerEvents>, + mut events: EventReader, +) { for event in events.read() { let local_player_events = query .get(event.entity) .expect("Non-local entities shouldn't be able to receive packet events"); local_player_events - .send(Event::Packet(event.packet.clone())) + .send(Event::Packet(ClientboundPacket::Game(event.packet.clone()))) .unwrap(); } } diff --git a/azalea-client/src/interact.rs b/azalea-client/src/interact.rs index 97e30471d..6426a4e0a 100644 --- a/azalea-client/src/interact.rs +++ b/azalea-client/src/interact.rs @@ -363,11 +363,11 @@ fn update_modifiers_for_held_item( Item::Trident => -2.9, _ => 0., }; - attributes - .attack_speed - .insert(azalea_entity::attributes::base_attack_speed_modifier( - added_attack_speed, - )) - .unwrap(); + let _ = + attributes + .attack_speed + .insert(azalea_entity::attributes::base_attack_speed_modifier( + added_attack_speed, + )); } } diff --git a/azalea-client/src/lib.rs b/azalea-client/src/lib.rs index ec19e3ace..c8d63d0cf 100644 --- a/azalea-client/src/lib.rs +++ b/azalea-client/src/lib.rs @@ -35,7 +35,7 @@ pub use client::{ start_ecs_runner, Client, DefaultPlugins, JoinError, JoinedClientBundle, StartClientOpts, TickBroadcast, }; -pub use events::Event; +pub use events::{ClientboundPacket, Event}; pub use local_player::{GameProfileComponent, InstanceHolder, TabList}; pub use movement::{ PhysicsState, SprintDirection, StartSprintEvent, StartWalkEvent, WalkDirection, diff --git a/azalea-client/src/packet_handling/configuration.rs b/azalea-client/src/packet_handling/configuration.rs index 1be34a129..45c76f548 100644 --- a/azalea-client/src/packet_handling/configuration.rs +++ b/azalea-client/src/packet_handling/configuration.rs @@ -1,4 +1,5 @@ use std::io::Cursor; +use std::sync::Arc; use azalea_entity::indexing::EntityIdIndex; use azalea_protocol::packets::configuration::serverbound_finish_configuration_packet::ServerboundFinishConfigurationPacket; @@ -27,7 +28,7 @@ pub struct ConfigurationPacketEvent { /// The client entity that received the packet. pub entity: Entity, /// The packet that was actually received. - pub packet: ClientboundConfigurationPacket, + pub packet: Arc, } pub fn send_packet_events( @@ -55,7 +56,7 @@ pub fn send_packet_events( }; packet_events.send(ConfigurationPacketEvent { entity: player_entity, - packet, + packet: Arc::new(packet), }); } // clear the packets right after we read them @@ -78,7 +79,7 @@ pub fn process_packet_events(ecs: &mut World) { events_owned.push((*player_entity, packet.clone())); } for (player_entity, packet) in events_owned { - match packet { + match packet.as_ref() { ClientboundConfigurationPacket::RegistryData(p) => { let mut system_state: SystemState> = SystemState::new(ecs); @@ -87,7 +88,9 @@ pub fn process_packet_events(ecs: &mut World) { let mut instance = instance_holder.instance.write(); // add the new registry data - instance.registries.append(p.registry_id, p.entries); + instance + .registries + .append(p.registry_id.clone(), p.entries.clone()); } ClientboundConfigurationPacket::CustomPayload(p) => { diff --git a/azalea-client/src/packet_handling/game.rs b/azalea-client/src/packet_handling/game.rs index daa420c3f..85500081b 100644 --- a/azalea-client/src/packet_handling/game.rs +++ b/azalea-client/src/packet_handling/game.rs @@ -71,7 +71,7 @@ use crate::{ /// } /// ``` #[derive(Event, Debug, Clone)] -pub struct PacketEvent { +pub struct GamePacketEvent { /// The client entity that received the packet. pub entity: Entity, /// The packet that was actually received. @@ -147,7 +147,7 @@ pub struct InstanceLoadedEvent { pub fn send_packet_events( query: Query<(Entity, &RawConnection), With>, - mut packet_events: ResMut>, + mut packet_events: ResMut>, ) { // we manually clear and send the events at the beginning of each update // since otherwise it'd cause issues with events in process_packet_events @@ -168,7 +168,7 @@ pub fn send_packet_events( continue; } }; - packet_events.send(PacketEvent { + packet_events.send(GamePacketEvent { entity: player_entity, packet: Arc::new(packet), }); @@ -182,9 +182,9 @@ pub fn send_packet_events( pub fn process_packet_events(ecs: &mut World) { let mut events_owned = Vec::<(Entity, Arc)>::new(); { - let mut system_state = SystemState::>::new(ecs); + let mut system_state = SystemState::>::new(ecs); let mut events = system_state.get_mut(ecs); - for PacketEvent { + for GamePacketEvent { entity: player_entity, packet, } in events.read() diff --git a/azalea-client/src/packet_handling/mod.rs b/azalea-client/src/packet_handling/mod.rs index 19de27eb5..669ece6fb 100644 --- a/azalea-client/src/packet_handling/mod.rs +++ b/azalea-client/src/packet_handling/mod.rs @@ -61,7 +61,7 @@ impl Plugin for PacketHandlerPlugin { ), ) // we do this instead of add_event so we can handle the events ourselves - .init_resource::>() + .init_resource::>() .init_resource::>() .add_event::() .add_event::() diff --git a/azalea-protocol/src/connect.rs b/azalea-protocol/src/connect.rs index 20a145cc3..a2135b389 100755 --- a/azalea-protocol/src/connect.rs +++ b/azalea-protocol/src/connect.rs @@ -529,6 +529,17 @@ impl Connection } } +impl Connection { + /// Change our state from configuration to game. This is the state that's + /// used when the client is actually in the world. + #[must_use] + pub fn game( + self, + ) -> Connection { + Connection::from(self) + } +} + impl Connection { /// Change our state back to configuration. #[must_use] diff --git a/azalea/src/container.rs b/azalea/src/container.rs index c354390ea..d5d7fd0e7 100644 --- a/azalea/src/container.rs +++ b/azalea/src/container.rs @@ -2,7 +2,7 @@ use std::fmt::Formatter; use azalea_client::{ inventory::{CloseContainerEvent, ContainerClickEvent, InventoryComponent}, - packet_handling::game::PacketEvent, + packet_handling::game::GamePacketEvent, Client, }; use azalea_core::position::BlockPos; @@ -240,7 +240,7 @@ impl ContainerHandle { #[derive(Component, Debug)] pub struct WaitingForInventoryOpen; -fn handle_menu_opened_event(mut commands: Commands, mut events: EventReader) { +fn handle_menu_opened_event(mut commands: Commands, mut events: EventReader) { for event in events.read() { if let ClientboundGamePacket::ContainerSetContent { .. } = event.packet.as_ref() { commands From 7d869cbe79267473dc0162b2a400c94e077383c6 Mon Sep 17 00:00:00 2001 From: Shayne Hartford Date: Sat, 20 Jul 2024 01:29:40 -0400 Subject: [PATCH 2/5] Add separate configuration and game packet events --- azalea-client/src/events.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/azalea-client/src/events.rs b/azalea-client/src/events.rs index ba665f7cb..d77305209 100644 --- a/azalea-client/src/events.rs +++ b/azalea-client/src/events.rs @@ -95,6 +95,8 @@ pub enum Event { /// # } /// # } /// ``` + ConfigurationPacket(ClientboundConfigurationPacket), + GamePacket(ClientboundGamePacket), Packet(ClientboundPacket), /// A player joined the game (or more specifically, was added to the tab /// list). @@ -192,6 +194,9 @@ fn configuration_packet_listener( event.packet.clone(), ))) .unwrap(); + local_player_events + .send(Event::ConfigurationPacket(event.packet.clone())) + .unwrap(); } } @@ -206,6 +211,9 @@ fn game_packet_listener( local_player_events .send(Event::Packet(ClientboundPacket::Game(event.packet.clone()))) .unwrap(); + local_player_events + .send(Event::GamePacket(event.packet.clone())) + .unwrap(); } } From 6e722255febaa5ae45b73c4d008c53c1e92a8762 Mon Sep 17 00:00:00 2001 From: Shayne Hartford Date: Sat, 20 Jul 2024 01:59:34 -0400 Subject: [PATCH 3/5] Add missing Arc and remove unused imports --- azalea-client/src/events.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azalea-client/src/events.rs b/azalea-client/src/events.rs index d77305209..e2f9e0f44 100644 --- a/azalea-client/src/events.rs +++ b/azalea-client/src/events.rs @@ -6,10 +6,10 @@ use std::sync::Arc; use azalea_chat::FormattedText; use azalea_core::tick::GameTick; use azalea_protocol::packets::{ - configuration::{ClientboundConfigurationPacket, ServerboundConfigurationPacket}, + configuration::ClientboundConfigurationPacket, game::{ clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket, - ClientboundGamePacket, ServerboundGamePacket, + ClientboundGamePacket, }, }; use azalea_world::{InstanceName, MinecraftEntityId}; @@ -95,8 +95,8 @@ pub enum Event { /// # } /// # } /// ``` - ConfigurationPacket(ClientboundConfigurationPacket), - GamePacket(ClientboundGamePacket), + ConfigurationPacket(Arc), + GamePacket(Arc), Packet(ClientboundPacket), /// A player joined the game (or more specifically, was added to the tab /// list). From cc7d64b46d8520889ecece6220cc4bc852cb68da Mon Sep 17 00:00:00 2001 From: Shayne Hartford Date: Thu, 3 Oct 2024 00:31:13 -0400 Subject: [PATCH 4/5] Update events.rs --- azalea-client/src/events.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/azalea-client/src/events.rs b/azalea-client/src/events.rs index 9f85d8b74..72b9dcfb1 100644 --- a/azalea-client/src/events.rs +++ b/azalea-client/src/events.rs @@ -191,6 +191,18 @@ fn configuration_packet_listener( } } +fn game_packet_listener( + query: Query<&LocalPlayerEvents>, + mut events: EventReader, +) { + for event in events.read() { + let local_player_events = query + .get(event.entity) + .expect("Non-local entities shouldn't be able to receive packet events"); + let _ = local_player_events.send(Event::Packet(event.packet.clone())); + } +} + fn add_player_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader) { for event in events.read() { let local_player_events = query From 3e0d62b90372926cba2a2a14bcf31dae82270b3d Mon Sep 17 00:00:00 2001 From: Shayne Hartford Date: Thu, 3 Oct 2024 00:38:53 -0400 Subject: [PATCH 5/5] Update events.rs --- azalea-client/src/events.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azalea-client/src/events.rs b/azalea-client/src/events.rs index 72b9dcfb1..47b28603d 100644 --- a/azalea-client/src/events.rs +++ b/azalea-client/src/events.rs @@ -187,7 +187,7 @@ fn configuration_packet_listener( let local_player_events = query .get(event.entity) .expect("Non-local entities shouldn't be able to receive packet events"); - let _ = local_player_events.send(Event::Packet(event.packet.clone())); + let _ = local_player_events.send(Event::Packet(ClientboundPacket::Configuration(event.packet.clone()))); } } @@ -199,7 +199,7 @@ fn game_packet_listener( let local_player_events = query .get(event.entity) .expect("Non-local entities shouldn't be able to receive packet events"); - let _ = local_player_events.send(Event::Packet(event.packet.clone())); + let _ = local_player_events.send(Event::Packet(ClientboundPacket::Game(event.packet.clone()))); } }