use std::time::Duration;
use bevy::prelude::Resource;
use tracing::trace;
use crate::utils::wrapping_id::wrapping_id;
wrapping_id!(Tick);
pub trait TickManaged: Resource {
fn increment_tick(&mut self);
}
#[derive(Clone)]
pub struct TickConfig {
pub tick_duration: Duration,
}
impl TickConfig {
pub fn new(tick_duration: Duration) -> Self {
Self { tick_duration }
}
}
#[derive(Resource)]
pub struct TickManager {
pub config: TickConfig,
tick: Tick,
}
impl TickManager {
pub fn from_config(config: TickConfig) -> Self {
Self {
config,
tick: Tick(0),
}
}
#[doc(hidden)]
pub fn increment_tick(&mut self) {
self.tick += 1;
trace!(new_tick = ?self.tick, "incremented client tick")
}
pub(crate) fn set_tick_to(&mut self, tick: Tick) {
self.tick = tick;
}
pub fn current_tick(&self) -> Tick {
self.tick
}
}