Struct valence_server::layer::message::Messages

source ·
pub struct Messages<G, L> { /* private fields */ }
Expand description

A message buffer of global messages (G) and local messages (L) meant for consumption by clients. Local messages are those that have some spatial component to them and implement the GetChunkPos trait. Local messages are placed in a bounding volume hierarchy for fast queries via Self::query_local. Global messages do not necessarily have a spatial component and all globals will be visited when using Self::iter_global.

Every message is associated with an arbitrary span of bytes. The meaning of the bytes is whatever the message needs it to be.

At the end of the tick and before clients have access to the buffer, all messages are sorted and then deduplicated by concatenating byte spans together. This is done for a couple of reasons:

  • Messages may rely on sorted message order for correctness, like in the case of entity spawn & despawn messages. Sorting also makes deduplication easy.
  • Deduplication reduces the total number of messages that all clients must examine. Consider the case of a message such as “send all clients in view of this chunk position these packet bytes”. If two of these messages have the same chunk position, then they can just be combined together.

Implementations§

source§

impl<G, L> Messages<G, L>
where G: Clone + Ord, L: Clone + Ord + GetChunkPos,

source

pub fn bytes(&self) -> &[u8]

All message bytes. Use this in conjunction with Self::iter_global and Self::query_local.

source

pub fn iter_global(&self) -> impl Iterator<Item = (G, Range<usize>)> + '_

Returns an iterator over all global messages and their span of bytes in Self::bytes.

source

pub fn query_local<F: FnMut(L, Range<usize>)>(&self, view: ChunkView, f: F)

Takes a visitor function f and visits all local messages contained within the chunk view view. f is called with the local message and its span of bytes in Self::bytes.

Trait Implementations§

source§

impl<G, L> Debug for Messages<G, L>
where G: Debug, L: Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<G, L> Default for Messages<G, L>

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<G, L> Freeze for Messages<G, L>

§

impl<G, L> RefUnwindSafe for Messages<G, L>

§

impl<G, L> Send for Messages<G, L>
where G: Send, L: Send,

§

impl<G, L> Sync for Messages<G, L>
where G: Sync, L: Sync,

§

impl<G, L> Unpin for Messages<G, L>
where G: Unpin, L: Unpin,

§

impl<G, L> UnwindSafe for Messages<G, L>
where G: UnwindSafe, L: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromWorld for T
where T: Default,

§

fn from_world(_world: &mut World) -> T

Creates Self using data from the given [World].
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ConditionalSend for T
where T: Send,