use std::fmt::Debug;
use bevy::prelude::{Added, Commands, Component, Entity, Query, Resource};
use tracing::info;
pub use despawn::{PredictionCommandsExt, PredictionDespawnMarker};
pub use plugin::add_prediction_systems;
pub use predicted_history::{ComponentState, PredictionHistory};
use crate::client::components::{ComponentSyncMode, Confirmed};
use crate::shared::replication::components::ShouldBePredicted;
use crate::shared::tick_manager::Tick;
mod despawn;
pub mod plugin;
pub mod predicted_history;
pub(crate) mod rollback;
#[derive(Component, Debug)]
pub struct Predicted {
pub confirmed_entity: Entity,
}
#[derive(Resource)]
pub struct Rollback {
pub(crate) state: RollbackState,
}
#[derive(Debug)]
pub enum RollbackState {
Default,
ShouldRollback {
current_tick: Tick,
},
}
pub fn spawn_predicted_entity(
mut commands: Commands,
mut confirmed_entities: Query<(Entity, Option<&mut Confirmed>), Added<ShouldBePredicted>>,
) {
for (confirmed_entity, confirmed) in confirmed_entities.iter_mut() {
let predicted_entity_mut = commands.spawn(Predicted { confirmed_entity });
let predicted_entity = predicted_entity_mut.id();
let mut confirmed_entity_mut = commands.get_entity(confirmed_entity).unwrap();
if let Some(mut confirmed) = confirmed {
confirmed.predicted = Some(predicted_entity);
} else {
confirmed_entity_mut.insert(Confirmed {
predicted: Some(predicted_entity),
interpolated: None,
});
}
info!(
"Spawn predicted entity {:?} for confirmed: {:?}",
predicted_entity, confirmed_entity
);
#[cfg(feature = "metrics")]
{
metrics::increment_counter!("spawn_predicted_entity");
}
}
}