80 lines
2.2 KiB
Rust
80 lines
2.2 KiB
Rust
#![allow(clippy::needless_pass_by_value)]
|
|
|
|
use std::sync::Arc;
|
|
|
|
use azalea::{
|
|
ecs::event::EventReader,
|
|
packet::{
|
|
config::ReceiveConfigPacketEvent, game::ReceiveGamePacketEvent,
|
|
login::ReceiveLoginPacketEvent,
|
|
},
|
|
protocol::packets::login::ClientboundLoginPacket,
|
|
};
|
|
use bevy_app::{App, First, Plugin};
|
|
use bevy_ecs::system::ResMut;
|
|
use log::error;
|
|
use parking_lot::Mutex;
|
|
|
|
use super::recorder::Recorder;
|
|
|
|
pub struct RecordPlugin {
|
|
pub recorder: Arc<Mutex<Option<Recorder>>>,
|
|
}
|
|
|
|
impl Plugin for RecordPlugin {
|
|
fn build(&self, app: &mut App) {
|
|
let recorder = self.recorder.lock().take();
|
|
if let Some(recorder) = recorder {
|
|
app.insert_resource(recorder)
|
|
.add_systems(First, record_login_packets)
|
|
.add_systems(First, record_configuration_packets)
|
|
.add_systems(First, record_game_packets);
|
|
}
|
|
}
|
|
}
|
|
|
|
fn record_login_packets(
|
|
recorder: Option<ResMut<Recorder>>,
|
|
mut events: EventReader<ReceiveLoginPacketEvent>,
|
|
) {
|
|
if let Some(mut recorder) = recorder {
|
|
for event in events.read() {
|
|
if recorder.should_ignore_compression
|
|
&& let ClientboundLoginPacket::LoginCompression(_) = *event.packet
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if let Err(error) = recorder.save_packet(event.packet.as_ref()) {
|
|
error!("failed to record login packet: {error:?}");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn record_configuration_packets(
|
|
recorder: Option<ResMut<Recorder>>,
|
|
mut events: EventReader<ReceiveConfigPacketEvent>,
|
|
) {
|
|
if let Some(mut recorder) = recorder {
|
|
for event in events.read() {
|
|
if let Err(error) = recorder.save_packet(event.packet.as_ref()) {
|
|
error!("failed to record configuration packet: {error:?}");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn record_game_packets(
|
|
recorder: Option<ResMut<Recorder>>,
|
|
mut events: EventReader<ReceiveGamePacketEvent>,
|
|
) {
|
|
if let Some(mut recorder) = recorder {
|
|
for event in events.read() {
|
|
if let Err(error) = recorder.save_packet(event.packet.as_ref()) {
|
|
error!("failed to record game packet: {error:?}");
|
|
}
|
|
}
|
|
}
|
|
}
|