aboutsummaryrefslogtreecommitdiff
path: root/azalea-client/src/plugins/packet/login/events.rs
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2025-04-17 16:16:51 -0500
committerGitHub <noreply@github.com>2025-04-17 16:16:51 -0500
commit3f60bdadac1a02e1109148bbbe5a8a3545f13849 (patch)
tree6c0460be61e715c1b789f81b16ce4c0fb986c3b4 /azalea-client/src/plugins/packet/login/events.rs
parent1989f4ec979c138f8f466ccebadca335eb2917d6 (diff)
downloadazalea-drasl-3f60bdadac1a02e1109148bbbe5a8a3545f13849.tar.xz
Move login state to the ECS (#213)
* use packet handlers code for login custom_query * initial broken implementation for ecs-only login * fixes * run Update schedule 60 times per second and delete code related to run_schedule_sender * fix tests * fix online-mode * reply to query packets in a separate system and make it easier for plugins to disable individual replies * remove unused imports
Diffstat (limited to 'azalea-client/src/plugins/packet/login/events.rs')
-rw-r--r--azalea-client/src/plugins/packet/login/events.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/azalea-client/src/plugins/packet/login/events.rs b/azalea-client/src/plugins/packet/login/events.rs
new file mode 100644
index 00000000..fc7a6b22
--- /dev/null
+++ b/azalea-client/src/plugins/packet/login/events.rs
@@ -0,0 +1,86 @@
+use std::sync::Arc;
+
+use azalea_protocol::packets::{
+ Packet,
+ login::{
+ ClientboundCustomQuery, ClientboundHello, ClientboundLoginPacket, ServerboundLoginPacket,
+ },
+};
+use bevy_ecs::prelude::*;
+use tracing::{debug, error};
+
+use super::InLoginState;
+use crate::{Account, connection::RawConnection};
+
+#[derive(Event, Debug, Clone)]
+pub struct ReceiveLoginPacketEvent {
+ /// The client entity that received the packet.
+ pub entity: Entity,
+ /// The packet that was actually received.
+ pub packet: Arc<ClientboundLoginPacket>,
+}
+
+#[derive(Event, Debug, Clone)]
+pub struct ReceiveHelloEvent {
+ pub account: Account,
+ pub packet: ClientboundHello,
+}
+
+#[derive(Event, Debug, Clone)]
+pub struct ReceiveCustomQueryEvent {
+ /// The client entity that received the packet.
+ pub entity: Entity,
+ pub packet: ClientboundCustomQuery,
+ /// A system can set this to `true` to make Azalea not reply to the query.
+ /// You must make sure you modify this before the
+ /// [`reply_to_custom_queries`] system runs.
+ ///
+ /// [`reply_to_custom_queries`]: crate::login::reply_to_custom_queries
+ pub disabled: bool,
+}
+
+/// Event for sending a login packet to the server.
+#[derive(Event, Debug, Clone)]
+pub struct SendLoginPacketEvent {
+ pub sent_by: Entity,
+ pub packet: ServerboundLoginPacket,
+}
+impl SendLoginPacketEvent {
+ pub fn new(entity: Entity, packet: impl Packet<ServerboundLoginPacket>) -> Self {
+ let packet = packet.into_variant();
+ Self {
+ sent_by: entity,
+ packet,
+ }
+ }
+}
+
+pub fn handle_outgoing_packets_observer(
+ trigger: Trigger<SendLoginPacketEvent>,
+ mut query: Query<(&mut RawConnection, Option<&InLoginState>)>,
+) {
+ let event = trigger.event();
+ if let Ok((mut raw_conn, in_login_state)) = query.get_mut(event.sent_by) {
+ if in_login_state.is_none() {
+ error!(
+ "Tried to send a login packet {:?} while not in login state",
+ event.packet
+ );
+ return;
+ }
+ debug!("Sending login packet: {:?}", event.packet);
+ if let Err(e) = raw_conn.write(event.packet.clone()) {
+ error!("Failed to send packet: {e}");
+ }
+ }
+}
+/// A system that converts [`SendLoginPacketEvent`] events into triggers so
+/// they get received by [`handle_outgoing_packets_observer`].
+pub fn handle_outgoing_packets(
+ mut commands: Commands,
+ mut events: EventReader<SendLoginPacketEvent>,
+) {
+ for event in events.read() {
+ commands.trigger(event.clone());
+ }
+}