diff options
Diffstat (limited to 'azalea-client/src/plugins/packet')
| -rw-r--r-- | azalea-client/src/plugins/packet/config/events.rs | 2 | ||||
| -rw-r--r-- | azalea-client/src/plugins/packet/game/events.rs | 40 | ||||
| -rw-r--r-- | azalea-client/src/plugins/packet/game/mod.rs | 22 | ||||
| -rw-r--r-- | azalea-client/src/plugins/packet/mod.rs | 3 |
4 files changed, 37 insertions, 30 deletions
diff --git a/azalea-client/src/plugins/packet/config/events.rs b/azalea-client/src/plugins/packet/config/events.rs index eddcf72f..9ed6c097 100644 --- a/azalea-client/src/plugins/packet/config/events.rs +++ b/azalea-client/src/plugins/packet/config/events.rs @@ -34,7 +34,7 @@ impl SendConfigPacketEvent { } } -pub fn handle_send_packet_event( +pub fn handle_outgoing_packets( mut send_packet_events: EventReader<SendConfigPacketEvent>, mut query: Query<(&mut RawConnection, Option<&InConfigState>)>, ) { diff --git a/azalea-client/src/plugins/packet/game/events.rs b/azalea-client/src/plugins/packet/game/events.rs index 5ba9972d..8a5aca3c 100644 --- a/azalea-client/src/plugins/packet/game/events.rs +++ b/azalea-client/src/plugins/packet/game/events.rs @@ -49,7 +49,7 @@ pub struct ReceivePacketEvent { } /// An event for sending a packet to the server while we're in the `game` state. -#[derive(Event)] +#[derive(Event, Clone, Debug)] pub struct SendPacketEvent { pub sent_by: Entity, pub packet: ServerboundGamePacket, @@ -61,28 +61,36 @@ impl SendPacketEvent { } } -pub fn handle_outgoing_packets( - mut send_packet_events: EventReader<SendPacketEvent>, +pub fn handle_outgoing_packets_observer( + trigger: Trigger<SendPacketEvent>, mut query: Query<(&mut RawConnection, Option<&InGameState>)>, ) { - for event in send_packet_events.read() { - if let Ok((raw_connection, in_game_state)) = query.get_mut(event.sent_by) { - if in_game_state.is_none() { - error!( - "Tried to send a game packet {:?} while not in game state", - event.packet - ); - continue; - } + let event = trigger.event(); + + if let Ok((raw_connection, in_game_state)) = query.get_mut(event.sent_by) { + if in_game_state.is_none() { + error!( + "Tried to send a game packet {:?} while not in game state", + event.packet + ); + return; + } - // debug!("Sending packet: {:?}", event.packet); - if let Err(e) = raw_connection.write_packet(event.packet.clone()) { - error!("Failed to send packet: {e}"); - } + // debug!("Sending packet: {:?}", event.packet); + if let Err(e) = raw_connection.write_packet(event.packet.clone()) { + error!("Failed to send packet: {e}"); } } } +/// A system that converts [`SendPacketEvent`] events into triggers so they get +/// received by [`handle_outgoing_packets_observer`]. +pub fn handle_outgoing_packets(mut commands: Commands, mut events: EventReader<SendPacketEvent>) { + for event in events.read() { + commands.trigger(event.clone()); + } +} + pub fn emit_receive_packet_events( query: Query<(Entity, &RawConnection), With<InGameState>>, mut packet_events: ResMut<Events<ReceivePacketEvent>>, diff --git a/azalea-client/src/plugins/packet/game/mod.rs b/azalea-client/src/plugins/packet/game/mod.rs index c72ce551..ed8c62ea 100644 --- a/azalea-client/src/plugins/packet/game/mod.rs +++ b/azalea-client/src/plugins/packet/game/mod.rs @@ -222,7 +222,6 @@ impl GamePacketHandler<'_> { EventWriter<InstanceLoadedEvent>, ResMut<InstanceContainer>, ResMut<EntityUuidIndex>, - EventWriter<SendPacketEvent>, Query<&mut LoadedBy, Without<LocalEntity>>, )>( self.ecs, @@ -232,7 +231,6 @@ impl GamePacketHandler<'_> { mut instance_loaded_events, mut instance_container, mut entity_uuid_index, - mut send_packet_events, mut loaded_by_query, )| { let ( @@ -342,7 +340,7 @@ impl GamePacketHandler<'_> { "Sending client information because login: {:?}", client_information ); - send_packet_events.send(SendPacketEvent::new(self.player, + commands.trigger(SendPacketEvent::new(self.player, azalea_protocol::packets::game::s_client_information::ServerboundClientInformation { information: client_information.clone() }, )); }, @@ -435,8 +433,8 @@ impl GamePacketHandler<'_> { &mut Position, &mut LastSentPosition, )>, - EventWriter<SendPacketEvent>, - )>(self.ecs, |(mut query, mut send_packet_events)| { + Commands, + )>(self.ecs, |(mut query, mut commands)| { let Ok((mut physics, mut direction, mut position, mut last_sent_position)) = query.get_mut(self.player) else { @@ -507,11 +505,11 @@ impl GamePacketHandler<'_> { // send the relevant packets - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( self.player, ServerboundAcceptTeleportation { id: p.id }, )); - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( self.player, ServerboundMovePlayerPosRot { pos: new_pos, @@ -1043,14 +1041,14 @@ impl GamePacketHandler<'_> { pub fn keep_alive(&mut self, p: &ClientboundKeepAlive) { debug!("Got keep alive packet {p:?} for {:?}", self.player); - as_system::<(EventWriter<KeepAliveEvent>, EventWriter<SendPacketEvent>)>( + as_system::<(EventWriter<KeepAliveEvent>, Commands)>( self.ecs, - |(mut keepalive_events, mut send_packet_events)| { + |(mut keepalive_events, mut commands)| { keepalive_events.send(KeepAliveEvent { entity: self.player, id: p.id, }); - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( self.player, ServerboundKeepAlive { id: p.id }, )); @@ -1364,8 +1362,8 @@ impl GamePacketHandler<'_> { pub fn ping(&mut self, p: &ClientboundPing) { debug!("Got ping packet {p:?}"); - as_system::<EventWriter<_>>(self.ecs, |mut events| { - events.send(SendPacketEvent::new( + as_system::<Commands>(self.ecs, |mut commands| { + commands.trigger(SendPacketEvent::new( self.player, ServerboundPong { id: p.id }, )); diff --git a/azalea-client/src/plugins/packet/mod.rs b/azalea-client/src/plugins/packet/mod.rs index 96a396d9..826cd5cf 100644 --- a/azalea-client/src/plugins/packet/mod.rs +++ b/azalea-client/src/plugins/packet/mod.rs @@ -54,11 +54,12 @@ impl Plugin for PacketPlugin { login::process_packet_events, ), ) + .add_observer(game::handle_outgoing_packets_observer) .add_systems( Update, ( ( - config::handle_send_packet_event, + config::handle_outgoing_packets, game::handle_outgoing_packets, ) .chain(), |
