aboutsummaryrefslogtreecommitdiff
path: root/azalea-client/src/plugins/packet/mod.rs
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2025-02-22 21:45:26 -0600
committerGitHub <noreply@github.com>2025-02-22 21:45:26 -0600
commite21e1b97bf9337e9f4747cd1b545b1b3a03e2ce7 (patch)
treeadd6f8bfce40d0c07845d8aa4c9945a0b918444c /azalea-client/src/plugins/packet/mod.rs
parentf8130c3c92946d2293634ba4e252d6bc93026c3c (diff)
downloadazalea-drasl-e21e1b97bf9337e9f4747cd1b545b1b3a03e2ce7.tar.xz
Refactor azalea-client (#205)
* start organizing packet_handling more by moving packet handlers into their own functions * finish writing all the handler functions for packets * use macro for generating match statement for packet handler functions * fix set_entity_data * update config state to also use handler functions * organize az-client file structure by moving things into plugins directory * fix merge issues
Diffstat (limited to 'azalea-client/src/plugins/packet/mod.rs')
-rw-r--r--azalea-client/src/plugins/packet/mod.rs109
1 files changed, 109 insertions, 0 deletions
diff --git a/azalea-client/src/plugins/packet/mod.rs b/azalea-client/src/plugins/packet/mod.rs
new file mode 100644
index 00000000..cbd8a175
--- /dev/null
+++ b/azalea-client/src/plugins/packet/mod.rs
@@ -0,0 +1,109 @@
+use azalea_entity::{EntityUpdateSet, metadata::Health};
+use bevy_app::{App, First, Plugin, PreUpdate, Update};
+use bevy_ecs::{
+ prelude::*,
+ system::{SystemParam, SystemState},
+};
+
+use self::{
+ game::{
+ AddPlayerEvent, DeathEvent, InstanceLoadedEvent, KeepAliveEvent, RemovePlayerEvent,
+ ResourcePackEvent, UpdatePlayerEvent,
+ },
+ login::{LoginPacketEvent, SendLoginPacketEvent},
+};
+use crate::{chat::ChatReceivedEvent, events::death_listener};
+
+pub mod config;
+pub mod game;
+pub mod login;
+
+pub struct PacketPlugin;
+
+pub fn death_event_on_0_health(
+ query: Query<(Entity, &Health), Changed<Health>>,
+ mut death_events: EventWriter<DeathEvent>,
+) {
+ for (entity, health) in query.iter() {
+ if **health == 0. {
+ death_events.send(DeathEvent {
+ entity,
+ packet: None,
+ });
+ }
+ }
+}
+
+impl Plugin for PacketPlugin {
+ fn build(&self, app: &mut App) {
+ app.add_systems(
+ First,
+ (game::send_receivepacketevent, config::send_packet_events),
+ )
+ .add_systems(
+ PreUpdate,
+ (
+ game::process_packet_events
+ // we want to index and deindex right after
+ .before(EntityUpdateSet::Deindex),
+ config::process_packet_events,
+ login::handle_send_packet_event,
+ login::process_packet_events,
+ ),
+ )
+ .add_systems(
+ Update,
+ (
+ (
+ config::handle_send_packet_event,
+ game::handle_outgoing_packets,
+ )
+ .chain(),
+ death_event_on_0_health.before(death_listener),
+ ),
+ )
+ // we do this instead of add_event so we can handle the events ourselves
+ .init_resource::<Events<game::ReceivePacketEvent>>()
+ .init_resource::<Events<config::ReceiveConfigPacketEvent>>()
+ .add_event::<game::SendPacketEvent>()
+ .add_event::<config::SendConfigPacketEvent>()
+ .add_event::<AddPlayerEvent>()
+ .add_event::<RemovePlayerEvent>()
+ .add_event::<UpdatePlayerEvent>()
+ .add_event::<ChatReceivedEvent>()
+ .add_event::<DeathEvent>()
+ .add_event::<KeepAliveEvent>()
+ .add_event::<ResourcePackEvent>()
+ .add_event::<InstanceLoadedEvent>()
+ .add_event::<LoginPacketEvent>()
+ .add_event::<SendLoginPacketEvent>();
+ }
+}
+
+#[macro_export]
+macro_rules! declare_packet_handlers {
+ (
+ $packetenum:ident,
+ $packetvar:expr,
+ $handler:ident,
+ [$($packet:path),+ $(,)?]
+ ) => {
+ paste::paste! {
+ match $packetvar {
+ $(
+ $packetenum::[< $packet:camel >](p) => $handler.$packet(p),
+ )+
+ }
+ }
+ };
+}
+
+pub(crate) fn as_system<T>(ecs: &mut World, f: impl FnOnce(T::Item<'_, '_>))
+where
+ T: SystemParam + 'static,
+{
+ let mut system_state = SystemState::<T>::new(ecs);
+ let values = system_state.get_mut(ecs);
+ f(values);
+ system_state.apply(ecs);
+}