azalea_client/packet_handling/
mod.rs

1use azalea_entity::{metadata::Health, EntityUpdateSet};
2use bevy_app::{App, First, Plugin, PreUpdate, Update};
3use bevy_ecs::prelude::*;
4
5use self::{
6    game::{
7        AddPlayerEvent, DeathEvent, InstanceLoadedEvent, KeepAliveEvent, RemovePlayerEvent,
8        ResourcePackEvent, UpdatePlayerEvent,
9    },
10    login::{LoginPacketEvent, SendLoginPacketEvent},
11};
12use crate::{chat::ChatReceivedEvent, events::death_listener};
13
14pub mod configuration;
15pub mod game;
16pub mod login;
17
18pub struct PacketHandlerPlugin;
19
20pub fn death_event_on_0_health(
21    query: Query<(Entity, &Health), Changed<Health>>,
22    mut death_events: EventWriter<DeathEvent>,
23) {
24    for (entity, health) in query.iter() {
25        if **health == 0. {
26            death_events.send(DeathEvent {
27                entity,
28                packet: None,
29            });
30        }
31    }
32}
33
34impl Plugin for PacketHandlerPlugin {
35    fn build(&self, app: &mut App) {
36        app.add_systems(
37            First,
38            (game::send_packet_events, configuration::send_packet_events),
39        )
40        .add_systems(
41            PreUpdate,
42            (
43                game::process_packet_events
44                    // we want to index and deindex right after
45                    .before(EntityUpdateSet::Deindex),
46                configuration::process_packet_events,
47                login::handle_send_packet_event,
48                login::process_packet_events,
49            ),
50        )
51        .add_systems(
52            Update,
53            (
54                (
55                    configuration::handle_send_packet_event,
56                    game::handle_send_packet_event,
57                )
58                    .chain(),
59                death_event_on_0_health.before(death_listener),
60            ),
61        )
62        // we do this instead of add_event so we can handle the events ourselves
63        .init_resource::<Events<game::PacketEvent>>()
64        .init_resource::<Events<configuration::ConfigurationEvent>>()
65        .add_event::<game::SendPacketEvent>()
66        .add_event::<configuration::SendConfigurationEvent>()
67        .add_event::<AddPlayerEvent>()
68        .add_event::<RemovePlayerEvent>()
69        .add_event::<UpdatePlayerEvent>()
70        .add_event::<ChatReceivedEvent>()
71        .add_event::<DeathEvent>()
72        .add_event::<KeepAliveEvent>()
73        .add_event::<ResourcePackEvent>()
74        .add_event::<InstanceLoadedEvent>()
75        .add_event::<LoginPacketEvent>()
76        .add_event::<SendLoginPacketEvent>();
77    }
78}