aboutsummaryrefslogtreecommitdiff
path: root/azalea-client/src/plugins/packet
diff options
context:
space:
mode:
Diffstat (limited to 'azalea-client/src/plugins/packet')
-rw-r--r--azalea-client/src/plugins/packet/config/events.rs2
-rw-r--r--azalea-client/src/plugins/packet/game/events.rs40
-rw-r--r--azalea-client/src/plugins/packet/game/mod.rs22
-rw-r--r--azalea-client/src/plugins/packet/mod.rs3
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(),