pub mod incoming_planets;
pub mod incoming_parts;
use avian2d::math::{Scalar, Vector};
use bevy::ecs::query::QueryData;
use bevy_transform_interpolation::VelocitySource;
use crate::{prelude::*, shared::net::{ServerEntityMap}};
use crate::client::net::incoming_parts::handle_incoming_parts;
use crate::client::net::incoming_planets::handle_incoming_planets;
pub fn net_plugin(app: &mut App) {
app
.insert_resource(ServerEntityMap::default())
.add_systems(FixedUpdate, (update_previous_velocities, (handle_incoming_planets, handle_incoming_parts)).chain());
}
#[derive(Component)]
pub struct PreviousAngularVelocity(Scalar);
#[derive(Component)]
pub struct PreviousLinearVelocity(Vector);
#[derive(QueryData)]
pub struct LinearVelocitySource;
#[derive(QueryData)]
pub struct AngularVelocitySource;
impl VelocitySource for LinearVelocitySource {
type Previous = PreviousLinearVelocity;
type Current = LinearVelocity;
fn previous(start: &Self::Previous) -> Vec3 {
let v = start.0.extend(0.0);
Vec3::new(v.x as f32, v.y as f32, v.z as f32)
}
fn current(end: &Self::Current) -> Vec3 {
let v = end.0.extend(0.0);
Vec3::new(v.x as f32, v.y as f32, v.z as f32)
}
}
impl VelocitySource for AngularVelocitySource {
type Previous = PreviousAngularVelocity;
type Current = AngularVelocity;
fn previous(start: &Self::Previous) -> Vec3 {
Vec3::Z * start.0 as f32
}
fn current(end: &Self::Current) -> Vec3 {
Vec3::Z * end.0 as f32
}
}
fn update_previous_velocities(
mut entities: Query<(&mut PreviousAngularVelocity, &AngularVelocity, &mut PreviousLinearVelocity, &LinearVelocity)>
) {
for mut entity in entities.iter_mut() {
*entity.0 = PreviousAngularVelocity(**entity.1);
*entity.2 = PreviousLinearVelocity(**entity.3);
}
}