pub mod client_event;
pub mod server_event;
#[cfg(test)]
mod test_events;
use std::{
fmt::{self, Display, Formatter},
marker::PhantomData,
time::Duration,
};
use bevy::{ecs::entity::EntityMap, prelude::*, reflect::TypeRegistryInternal};
use bevy_renet::renet::SendType;
#[derive(Resource)]
pub struct EventChannel<T> {
pub id: u8,
marker: PhantomData<T>,
}
impl<T> EventChannel<T> {
fn new(id: u8) -> Self {
Self {
id,
marker: PhantomData,
}
}
}
pub trait BuildEventSerializer<T> {
type EventSerializer<'a>
where
T: 'a;
fn new<'a>(event: &'a T, registry: &'a TypeRegistryInternal) -> Self::EventSerializer<'a>;
}
pub trait BuildEventDeserializer {
type EventDeserializer<'a>;
fn new(registry: &TypeRegistryInternal) -> Self::EventDeserializer<'_>;
}
#[derive(Clone, Copy, Debug)]
pub enum SendPolicy {
Unreliable,
Unordered,
Ordered,
}
impl From<SendPolicy> for SendType {
fn from(policy: SendPolicy) -> Self {
const RESEND_TIME: Duration = Duration::from_millis(300);
match policy {
SendPolicy::Unreliable => SendType::Unreliable,
SendPolicy::Unordered => SendType::ReliableUnordered {
resend_time: RESEND_TIME,
},
SendPolicy::Ordered => SendType::ReliableOrdered {
resend_time: RESEND_TIME,
},
}
}
}
pub trait MapEventEntities {
fn map_entities(&mut self, entity_map: &EntityMap) -> Result<(), MapError>;
}
pub struct MapError(pub Entity);
impl Display for MapError {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "unable to map entity {:?}", self.0)
}
}