mirror of
https://github.com/mat-1/azalea.git
synced 2025-08-02 06:16:04 +00:00
* 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
109 lines
3.1 KiB
Rust
109 lines
3.1 KiB
Rust
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);
|
|
}
|