use std::time::Duration;
use anyhow::Result;
use bevy::prelude::World;
use tracing::{debug, info, trace};
use crate::channel::builder::PingChannel;
use crate::client::sync::SyncConfig;
use crate::connection::events::ConnectionEvents;
use crate::connection::message::ProtocolMessage;
use crate::inputs::input_buffer::InputBuffer;
use crate::packet::packet_manager::Payload;
use crate::protocol::channel::{ChannelKind, ChannelRegistry};
use crate::protocol::Protocol;
use crate::serialize::reader::ReadBuffer;
use crate::shared::ping::manager::{PingConfig, PingManager};
use crate::shared::ping::message::SyncMessage;
use crate::shared::tick_manager::Tick;
use crate::shared::tick_manager::TickManager;
use crate::shared::time_manager::TimeManager;
use super::sync::SyncManager;
pub struct Connection<P: Protocol> {
pub(crate) base: crate::connection::Connection<P>,
pub(crate) input_buffer: InputBuffer<P::Input>,
pub(crate) sync_manager: SyncManager,
}
impl<P: Protocol> Connection<P> {
pub fn new(
channel_registry: &ChannelRegistry,
sync_config: SyncConfig,
ping_config: &PingConfig,
) -> Self {
Self {
base: crate::connection::Connection::new(channel_registry, ping_config),
input_buffer: InputBuffer::default(),
sync_manager: SyncManager::new(sync_config),
}
}
pub fn add_input(&mut self, input: P::Input, tick: Tick) {
self.input_buffer.set(tick, Some(input));
}
pub fn update(&mut self, time_manager: &TimeManager, tick_manager: &TickManager) {
self.base.update(time_manager, tick_manager);
}
pub fn recv_packet(
&mut self,
reader: &mut impl ReadBuffer,
time_manager: &TimeManager,
tick_manager: &TickManager,
) -> Result<()> {
let tick = self.base.recv_packet(reader)?;
debug!("Received server packet with tick: {:?}", tick);
if tick >= self.sync_manager.latest_received_server_tick {
self.sync_manager.latest_received_server_tick = tick;
self.sync_manager.duration_since_latest_received_server_tick = Duration::default();
self.sync_manager.update_current_server_time(
tick_manager.config.tick_duration,
self.base.ping_manager.rtt(),
);
}
debug!(?tick, last_server_tick = ?self.sync_manager.latest_received_server_tick, "Recv server packet");
Ok(())
}
#[cfg(test)]
pub fn base(&self) -> &crate::connection::Connection<P> {
&self.base
}
}