use std::{any::Any, collections::HashSet};
use naia_serde::{BitReader, BitWrite, SerdeErr};
use crate::{
messages::named::Named,
world::{
component::{
component_kinds::{ComponentKind, ComponentKinds},
component_update::ComponentUpdate,
diff_mask::DiffMask,
property_mutate::PropertyMutator,
replica_ref::{ReplicaDynMut, ReplicaDynRef},
},
delegation::auth_channel::EntityAuthAccessor,
entity::entity_converters::LocalEntityAndGlobalEntityConverter,
},
ComponentFieldUpdate, LocalEntityAndGlobalEntityConverterMut, RemoteEntity,
};
pub trait ReplicateBuilder: Send + Sync + Named {
fn read(
&self,
reader: &mut BitReader,
converter: &dyn LocalEntityAndGlobalEntityConverter,
) -> Result<Box<dyn Replicate>, SerdeErr>;
fn read_create_update(&self, reader: &mut BitReader) -> Result<ComponentUpdate, SerdeErr>;
fn split_update(
&self,
converter: &dyn LocalEntityAndGlobalEntityConverter,
update: ComponentUpdate,
) -> Result<
(
Option<Vec<(RemoteEntity, ComponentFieldUpdate)>>,
Option<ComponentUpdate>,
),
SerdeErr,
>;
}
pub trait Replicate: ReplicateInner + Named + Any {
fn kind(&self) -> ComponentKind;
fn to_any(&self) -> &dyn Any;
fn to_any_mut(&mut self) -> &mut dyn Any;
fn to_boxed_any(self: Box<Self>) -> Box<dyn Any>;
fn copy_to_box(&self) -> Box<dyn Replicate>;
fn create_builder() -> Box<dyn ReplicateBuilder>
where
Self: Sized;
fn diff_mask_size(&self) -> u8;
fn dyn_ref(&self) -> ReplicaDynRef<'_>;
fn dyn_mut(&mut self) -> ReplicaDynMut<'_>;
fn mirror(&mut self, other: &dyn Replicate);
fn set_mutator(&mut self, mutator: &PropertyMutator);
fn write(
&self,
component_kinds: &ComponentKinds,
writer: &mut dyn BitWrite,
converter: &mut dyn LocalEntityAndGlobalEntityConverterMut,
);
fn write_update(
&self,
diff_mask: &DiffMask,
writer: &mut dyn BitWrite,
converter: &mut dyn LocalEntityAndGlobalEntityConverterMut,
);
fn read_apply_update(
&mut self,
converter: &dyn LocalEntityAndGlobalEntityConverter,
update: ComponentUpdate,
) -> Result<(), SerdeErr>;
fn read_apply_field_update(
&mut self,
converter: &dyn LocalEntityAndGlobalEntityConverter,
update: ComponentFieldUpdate,
) -> Result<(), SerdeErr>;
fn relations_waiting(&self) -> Option<HashSet<RemoteEntity>>;
fn relations_complete(&mut self, converter: &dyn LocalEntityAndGlobalEntityConverter);
fn publish(&mut self, mutator: &PropertyMutator);
fn unpublish(&mut self);
fn enable_delegation(
&mut self,
accessor: &EntityAuthAccessor,
mutator_opt: Option<&PropertyMutator>,
);
fn disable_delegation(&mut self);
fn localize(&mut self);
}
cfg_if! {
if #[cfg(feature = "bevy_support")]
{
use bevy_ecs::component::{TableStorage, Component};
pub trait ReplicateInner: Component<Storage = TableStorage> + Sync + Send + 'static {}
impl<T> ReplicateInner for T
where T: Component<Storage = TableStorage> + Sync + Send + 'static {
}
}
else
{
pub trait ReplicateInner: Sync + Send + 'static {}
impl<T> ReplicateInner for T
where T: Sync + Send + 'static {
}
}
}