1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
use naia_serde::BitWrite;
use super::{
component_update::ComponentUpdate,
diff_mask::DiffMask,
entity_handle::EntityHandle,
entity_property::NetEntityHandleConverter,
property_mutate::PropertyMutator,
protocolize::Protocolize,
replica_ref::{ReplicaDynMut, ReplicaDynRef},
};
/// A struct that implements Replicate is a Message/Component, or otherwise,
/// a container of Properties that can be scoped, tracked, and synced, with a
/// remote host
pub trait Replicate<P: Protocolize>: ReplicateSafe<P> + Clone {}
/// The part of Replicate which is object-safe
pub trait ReplicateSafe<P: Protocolize>: ReplicateInner {
/// Gets the TypeId of the Message/Component, used to map to a
/// registered Protocolize
fn kind(&self) -> P::Kind;
/// Gets the number of bytes of the Message/Component's DiffMask
fn diff_mask_size(&self) -> u8;
/// Get an immutable reference to the inner Component/Message as a
/// Replicate trait object
fn dyn_ref(&self) -> ReplicaDynRef<'_, P>;
/// Get an mutable reference to the inner Component/Message as a
/// Replicate trait object
fn dyn_mut(&mut self) -> ReplicaDynMut<'_, P>;
/// Returns self as a Protocol
fn into_protocol(self) -> P;
/// Returns a copy of self as a Protocol
fn protocol_copy(&self) -> P;
/// Sets the current Replica to the state of another Replica of the
/// same type
fn mirror(&mut self, other: &P);
/// Set the Message/Component's PropertyMutator, which keeps track
/// of which Properties have been mutated, necessary to sync only the
/// Properties that have changed with the client
fn set_mutator(&mut self, mutator: &PropertyMutator);
/// Writes data into an outgoing byte stream, sufficient to completely
/// recreate the Message/Component on the client
fn write(&self, bit_writer: &mut dyn BitWrite, converter: &dyn NetEntityHandleConverter);
/// Write data into an outgoing byte stream, sufficient only to update the
/// mutated Properties of the Message/Component on the client
fn write_update(
&self,
diff_mask: &DiffMask,
bit_writer: &mut dyn BitWrite,
converter: &dyn NetEntityHandleConverter,
);
/// Reads data from an incoming packet, sufficient to sync the in-memory
/// Component with it's replica on the Server
fn read_apply_update(
&mut self,
converter: &dyn NetEntityHandleConverter,
update: ComponentUpdate<P::Kind>,
);
/// Returns whether has any EntityProperties
fn has_entity_properties(&self) -> bool;
/// Returns a list of Entities contained within the Replica's properties
fn entities(&self) -> Vec<EntityHandle>;
}
cfg_if! {
if #[cfg(feature = "bevy_support")]
{
// Require that Bevy Component to be implemented
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 {
}
}
}