use bevy::prelude::*;
use de_core::{
gconfig::is_multiplayer,
schedule::{Movement, PreMovement},
state::AppState,
};
use de_messages::ToPlayers;
use de_multiplayer::{GameNetSet, NetEntities, NetRecvSetPathEvent, ToPlayersEvent};
use crate::{
pplugin::{PathFoundEvent, PathingSet},
ScheduledPath,
};
pub struct SyncingPlugin;
impl Plugin for SyncingPlugin {
fn build(&self, app: &mut App) {
app.add_systems(
PreMovement,
receive_paths
.run_if(on_event::<NetRecvSetPathEvent>())
.run_if(in_state(AppState::InGame))
.after(GameNetSet::Messages),
)
.add_systems(
Movement,
send_new_paths
.run_if(is_multiplayer)
.run_if(in_state(AppState::InGame))
.after(PathingSet::PathResults),
);
}
}
fn receive_paths(mut commands: Commands, mut events: EventReader<NetRecvSetPathEvent>) {
for event in events.read() {
let mut entity_commands = commands.entity(event.entity());
match event.path() {
Some(path) => {
entity_commands.insert(ScheduledPath::new(path.clone()));
}
None => {
entity_commands.remove::<ScheduledPath>();
}
}
}
}
fn send_new_paths(
net_entities: NetEntities,
mut path_events: EventReader<PathFoundEvent>,
mut net_events: EventWriter<ToPlayersEvent>,
) {
for event in path_events.read() {
net_events.send(ToPlayersEvent::new(ToPlayers::SetPath {
entity: net_entities.local_net_id(event.entity()),
waypoints: event.path().map(|p| p.try_into().unwrap()),
}));
}
}