use std::pin::pin;
use std::time::Duration;
use crate::_reexport::ReadBuffer;
use anyhow::Result;
use bevy::ecs::component::Tick as BevyTick;
use bevy::prelude::World;
use tracing::trace;
use crate::channel::builder::PingChannel;
use crate::connection::events::{ConnectionEvents, IterMessageEvent};
use crate::connection::message::ProtocolMessage;
use crate::inputs::input_buffer::{InputBuffer, InputMessage};
use crate::packet::packet_manager::Payload;
use crate::protocol::channel::{ChannelKind, ChannelRegistry};
use crate::protocol::Protocol;
use crate::shared::ping::manager::{PingConfig, PingManager};
use crate::shared::ping::message::{Ping, Pong, SyncMessage};
use crate::shared::tick_manager::TickManager;
use crate::shared::time_manager::TimeManager;
pub struct Connection<P: Protocol> {
pub(crate) base: crate::connection::Connection<P>,
pub(crate) input_buffer: InputBuffer<P::Input>,
}
impl<P: Protocol> Connection<P> {
pub fn new(channel_registry: &ChannelRegistry, ping_config: &PingConfig) -> Self {
Self {
base: crate::connection::Connection::new(channel_registry, ping_config),
input_buffer: InputBuffer::default(),
}
}
pub fn recv_packet(&mut self, reader: &mut impl ReadBuffer, bevy_tick: BevyTick) -> Result<()> {
self.base.recv_packet(reader)?;
self.base.replication_manager.recv_update_acks(bevy_tick);
Ok(())
}
pub fn receive(
&mut self,
world: &mut World,
time_manager: &TimeManager,
) -> ConnectionEvents<P> {
let mut events = self.base.receive(world, time_manager);
if events.has_messages::<InputMessage<P::Input>>() {
trace!("update input buffer");
let input_messages: Vec<_> = events
.into_iter_messages::<InputMessage<P::Input>>()
.map(|(input_message, _)| input_message)
.collect();
for input_message in input_messages {
self.input_buffer.update_from_message(input_message);
}
}
events
}
}