use lightyear_macros::ChannelInternal;
use std::time::Duration;
use crate::channel::receivers::ordered_reliable::OrderedReliableReceiver;
use crate::channel::receivers::sequenced_reliable::SequencedReliableReceiver;
use crate::channel::receivers::sequenced_unreliable::SequencedUnreliableReceiver;
use crate::channel::receivers::tick_unreliable::TickUnreliableReceiver;
use crate::channel::receivers::unordered_reliable::UnorderedReliableReceiver;
use crate::channel::receivers::unordered_unreliable::UnorderedUnreliableReceiver;
use crate::channel::receivers::ChannelReceiver;
use crate::channel::senders::reliable::ReliableSender;
use crate::channel::senders::sequenced_unreliable::SequencedUnreliableSender;
use crate::channel::senders::tick_unreliable::TickUnreliableSender;
use crate::channel::senders::unordered_unreliable::UnorderedUnreliableSender;
use crate::channel::senders::unordered_unreliable_with_acks::UnorderedUnreliableWithAcksSender;
use crate::channel::senders::ChannelSender;
use crate::prelude::ChannelKind;
use crate::utils::named::TypeNamed;
pub struct ChannelContainer {
pub setting: ChannelSettings,
pub(crate) receiver: ChannelReceiver,
pub(crate) sender: ChannelSender,
}
pub trait Channel: 'static + TypeNamed {
fn get_builder(settings: ChannelSettings) -> ChannelBuilder;
fn kind() -> ChannelKind
where
Self: Sized,
{
ChannelKind::of::<Self>()
}
}
#[doc(hidden)]
#[derive(Clone, Debug)]
pub struct ChannelBuilder {
pub settings: ChannelSettings,
}
impl ChannelBuilder {
pub fn build(&self) -> ChannelContainer {
ChannelContainer::new(self.settings.clone())
}
}
impl ChannelContainer {
pub fn new(settings: ChannelSettings) -> Self {
let receiver: ChannelReceiver;
let sender: ChannelSender;
let settings_clone = settings.clone();
match settings.mode {
ChannelMode::UnorderedUnreliableWithAcks => {
receiver = UnorderedUnreliableReceiver::new().into();
sender = UnorderedUnreliableWithAcksSender::new().into();
}
ChannelMode::UnorderedUnreliable => {
receiver = UnorderedUnreliableReceiver::new().into();
sender = UnorderedUnreliableSender::new().into();
}
ChannelMode::SequencedUnreliable => {
receiver = SequencedUnreliableReceiver::new().into();
sender = SequencedUnreliableSender::new().into();
}
ChannelMode::UnorderedReliable(reliable_settings) => {
receiver = UnorderedReliableReceiver::new().into();
sender = ReliableSender::new(reliable_settings).into();
}
ChannelMode::SequencedReliable(reliable_settings) => {
receiver = SequencedReliableReceiver::new().into();
sender = ReliableSender::new(reliable_settings).into();
}
ChannelMode::OrderedReliable(reliable_settings) => {
receiver = OrderedReliableReceiver::new().into();
sender = ReliableSender::new(reliable_settings).into();
}
ChannelMode::TickBuffered => {
receiver = TickUnreliableReceiver::new().into();
sender = TickUnreliableSender::new().into();
}
}
Self {
setting: settings_clone,
receiver,
sender,
}
}
}
#[derive(Clone, Debug)]
pub struct ChannelSettings {
pub mode: ChannelMode,
pub direction: ChannelDirection,
}
#[derive(Clone, Debug, PartialEq)]
pub enum ChannelMode {
UnorderedUnreliableWithAcks,
UnorderedUnreliable,
SequencedUnreliable,
UnorderedReliable(ReliableSettings),
SequencedReliable(ReliableSettings),
OrderedReliable(ReliableSettings),
TickBuffered,
}
impl ChannelMode {
pub fn is_reliable(&self) -> bool {
match self {
ChannelMode::UnorderedUnreliableWithAcks => false,
ChannelMode::UnorderedUnreliable => false,
ChannelMode::SequencedUnreliable => false,
ChannelMode::UnorderedReliable(_) => true,
ChannelMode::SequencedReliable(_) => true,
ChannelMode::OrderedReliable(_) => true,
ChannelMode::TickBuffered => false,
}
}
pub(crate) fn is_watching_acks(&self) -> bool {
match self {
ChannelMode::UnorderedUnreliableWithAcks => true,
ChannelMode::UnorderedUnreliable => false,
ChannelMode::SequencedUnreliable => false,
ChannelMode::UnorderedReliable(_) => true,
ChannelMode::SequencedReliable(_) => true,
ChannelMode::OrderedReliable(_) => true,
ChannelMode::TickBuffered => false,
}
}
}
#[derive(Clone, PartialEq, Debug)]
pub enum ChannelDirection {
ClientToServer,
ServerToClient,
Bidirectional,
}
#[derive(Clone, Debug, PartialEq)]
pub struct ReliableSettings {
pub rtt_resend_factor: f32,
pub rtt_resend_min_delay: Duration,
}
impl Default for ReliableSettings {
fn default() -> Self {
Self {
rtt_resend_factor: 1.5,
rtt_resend_min_delay: Duration::default(),
}
}
}
impl ReliableSettings {
pub(crate) fn resend_delay(&self, rtt: Duration) -> Duration {
let delay = rtt.mul_f32(self.rtt_resend_factor);
std::cmp::max(delay, self.rtt_resend_min_delay)
}
}
#[derive(ChannelInternal)]
pub struct EntityActionsChannel;
#[derive(ChannelInternal)]
pub struct EntityUpdatesChannel;
#[derive(ChannelInternal)]
pub struct PingChannel;
#[derive(ChannelInternal)]
pub struct InputChannel;
#[derive(ChannelInternal)]
pub struct DefaultUnorderedUnreliableChannel;
#[derive(ChannelInternal)]
pub struct TickBufferChannel;