pub struct RepliconSharedPlugin {
pub auth_method: AuthMethod,
}Expand description
Initializes types, resources and events needed for both client and server.
Fields§
§auth_method: AuthMethodConfigures the authorization process.
§Examples
Custom authorization to set a player name before starting replication.
We re-use ProtocolMismatch, which is registered only with
AuthMethod::ProtocolCheck, but it could be any event.
use bevy::{prelude::*, state::app::StatesPlugin};
use bevy_replicon::prelude::*;
use serde::{Deserialize, Serialize};
let mut app = App::new();
app.add_plugins((
MinimalPlugins,
StatesPlugin,
RepliconPlugins.set(RepliconSharedPlugin {
auth_method: AuthMethod::Custom,
}),
))
.add_client_event::<ClientInfo>(Channel::Ordered)
.add_server_event::<ProtocolMismatch>(Channel::Unreliable)
.make_event_independent::<ProtocolMismatch>() // Let the client receive it without replication.
.add_observer(start_game)
.add_systems(OnEnter(ClientState::Connected), send_info);
fn send_info(
mut commands: Commands,
protocol: Res<ProtocolHash>,
) {
commands.client_trigger(ClientInfo {
protocol: *protocol,
player_name: "Shatur".to_string(), // Could be read from console or UI.
});
}
fn start_game(
client_info: On<FromClient<ClientInfo>>,
mut commands: Commands,
mut disconnects: MessageWriter<DisconnectRequest>,
protocol: Res<ProtocolHash>,
) {
let client = client_info
.client_id
.entity()
.expect("protocol hash sent only from clients");
// Since we are using custom authorization,
// we need to verify the protocol manually.
if client_info.protocol != *protocol {
// Notify the client about the problem. No delivery
// guarantee, since we disconnect after sending.
commands.server_trigger(ToClients {
targets: SendTargets::Single(client_info.client_id),
message: ProtocolMismatch,
});
disconnects.write(DisconnectRequest { client });
}
// Validate player name, run the necessary game logic...
// Manually mark the client as authorized.
commands.entity(client).insert(AuthorizedClient);
}
/// A client event for custom authorization.
#[derive(Event, Serialize, Deserialize)]
struct ClientInfo {
protocol: ProtocolHash,
player_name: String,
}Trait Implementations§
Source§fn default() -> RepliconSharedPlugin
fn default() -> RepliconSharedPlugin
Returns the “default value” for a type. Read more
Source§fn finish(&self, app: &mut App)
fn finish(&self, app: &mut App)
Finish adding this plugin to the
App, once all plugins registered are ready. This can
be useful for plugins that depends on another plugin asynchronous setup, like the renderer.Source§fn ready(&self, _app: &App) -> bool
fn ready(&self, _app: &App) -> bool
Has the plugin finished its setup? This can be useful for plugins that need something
asynchronous to happen before they can finish their setup, like the initialization of a renderer.
Once the plugin is ready,
finish should be called.Source§fn cleanup(&self, _app: &mut App)
fn cleanup(&self, _app: &mut App)
Runs after all plugins are built and finished, but before the app schedule is executed.
This can be useful if you have some resource that other plugins need during their build step,
but after build you want to remove it and send it to another thread.
Auto Trait Implementations§
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Converts
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Converts
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Converts
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Converts
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self using default().
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
Converts this type into the system output type.