Struct bones_framework::external::ggrs::SessionBuilder
pub struct SessionBuilder<T>where
T: Config,{ /* private fields */ }
Expand description
The SessionBuilder
builds all GGRS Sessions. After setting all appropriate values, use SessionBuilder::start_yxz_session(...)
to consume the builder and create a Session of desired type.
Implementations§
§impl<T> SessionBuilder<T>where
T: Config,
impl<T> SessionBuilder<T>where
T: Config,
pub fn new() -> SessionBuilder<T>
pub fn new() -> SessionBuilder<T>
Construct a new builder with all values set to their defaults.
pub fn add_player(
self,
player_type: PlayerType<<T as Config>::Address>,
player_handle: usize,
) -> Result<SessionBuilder<T>, GgrsError>
pub fn add_player( self, player_type: PlayerType<<T as Config>::Address>, player_handle: usize, ) -> Result<SessionBuilder<T>, GgrsError>
Must be called for each player in the session (e.g. in a 3 player session, must be called 3 times) before starting the session.
Player handles for players should be between 0 and num_players
, spectator handles should be higher than num_players
.
Later, you will need the player handle to add input, change parameters or disconnect the player or spectator.
§Errors
- Returns
InvalidRequest
if a player with that handle has been added before - Returns
InvalidRequest
if the handle is invalid for the givenPlayerType
pub fn with_max_prediction_window(
self,
window: usize,
) -> Result<SessionBuilder<T>, GgrsError>
pub fn with_max_prediction_window( self, window: usize, ) -> Result<SessionBuilder<T>, GgrsError>
Change the maximum prediction window. Default is 8.
§Errors
- Returns
InvalidRequest
if the prediction window is 0.
pub fn with_input_delay(self, delay: usize) -> SessionBuilder<T>
pub fn with_input_delay(self, delay: usize) -> SessionBuilder<T>
Change the amount of frames GGRS will delay the inputs for local players.
pub fn with_num_players(self, num_players: usize) -> SessionBuilder<T>
pub fn with_num_players(self, num_players: usize) -> SessionBuilder<T>
Change number of total players. Default is 2.
pub fn with_sparse_saving_mode(self, sparse_saving: bool) -> SessionBuilder<T>
pub fn with_sparse_saving_mode(self, sparse_saving: bool) -> SessionBuilder<T>
Sets the sparse saving mode. With sparse saving turned on, only the minimum confirmed frame (for which all inputs from all players are confirmed correct) will be saved. This leads to much less save requests at the cost of potentially longer rollbacks and thus more advance frame requests. Recommended, if saving your gamestate takes much more time than advancing the game state.
pub fn with_desync_detection_mode(
self,
desync_detection: DesyncDetection,
) -> SessionBuilder<T>
pub fn with_desync_detection_mode( self, desync_detection: DesyncDetection, ) -> SessionBuilder<T>
Sets the desync detection mode. With desync detection, the session will compare checksums for all peers to detect discrepancies / desyncs between peers If a desync is found the session will send a DesyncDetected event.
pub fn with_disconnect_timeout(self, timeout: Duration) -> SessionBuilder<T>
pub fn with_disconnect_timeout(self, timeout: Duration) -> SessionBuilder<T>
Sets the disconnect timeout. The session will automatically disconnect from a remote peer if it has not received a packet in the timeout window.
pub fn with_disconnect_notify_delay(
self,
notify_delay: Duration,
) -> SessionBuilder<T>
pub fn with_disconnect_notify_delay( self, notify_delay: Duration, ) -> SessionBuilder<T>
Sets the time before the first notification will be sent in case of a prolonged period of no received packages.
pub fn with_fps(self, fps: usize) -> Result<SessionBuilder<T>, GgrsError>
pub fn with_fps(self, fps: usize) -> Result<SessionBuilder<T>, GgrsError>
Sets the FPS this session is used with. This influences estimations for frame synchronization between sessions.
§Errors
- Returns
InvalidRequest
if the fps is 0
pub fn with_check_distance(self, check_distance: usize) -> SessionBuilder<T>
pub fn with_check_distance(self, check_distance: usize) -> SessionBuilder<T>
Change the check distance. Default is 2.
pub fn with_max_frames_behind(
self,
max_frames_behind: usize,
) -> Result<SessionBuilder<T>, GgrsError>
pub fn with_max_frames_behind( self, max_frames_behind: usize, ) -> Result<SessionBuilder<T>, GgrsError>
Sets the maximum frames behind. If the spectator is more than this amount of frames behind the received inputs,
it will catch up with catchup_speed
amount of frames per step.
pub fn with_catchup_speed(
self,
catchup_speed: usize,
) -> Result<SessionBuilder<T>, GgrsError>
pub fn with_catchup_speed( self, catchup_speed: usize, ) -> Result<SessionBuilder<T>, GgrsError>
Sets the catchup speed. Per default, this is set to 1, so the spectator never catches up.
If you want the spectator to catch up to the host if max_frames_behind
is surpassed, set this to a value higher than 1.
pub fn start_p2p_session(
self,
socket: impl NonBlockingSocket<<T as Config>::Address> + 'static,
) -> Result<P2PSession<T>, GgrsError>
pub fn start_p2p_session( self, socket: impl NonBlockingSocket<<T as Config>::Address> + 'static, ) -> Result<P2PSession<T>, GgrsError>
Consumes the builder to construct a P2PSession
and starts synchronization of endpoints.
§Errors
- Returns
InvalidRequest
if insufficient players have been registered.
pub fn start_spectator_session(
self,
host_addr: <T as Config>::Address,
socket: impl NonBlockingSocket<<T as Config>::Address> + 'static,
) -> SpectatorSession<T>
pub fn start_spectator_session( self, host_addr: <T as Config>::Address, socket: impl NonBlockingSocket<<T as Config>::Address> + 'static, ) -> SpectatorSession<T>
Consumes the builder to create a new SpectatorSession
.
A SpectatorSession
provides all functionality to connect to a remote host in a peer-to-peer fashion.
The host will broadcast all confirmed inputs to this session.
This session can be used to spectate a session without contributing to the game input.
pub fn start_synctest_session(self) -> Result<SyncTestSession<T>, GgrsError>
pub fn start_synctest_session(self) -> Result<SyncTestSession<T>, GgrsError>
Consumes the builder to construct a new SyncTestSession
. During a SyncTestSession
, GGRS will simulate a rollback every frame
and resimulate the last n states, where n is the given check_distance
.
The resimulated checksums will be compared with the original checksums and report if there was a mismatch.
Due to the decentralized nature of saving and loading gamestates, checksum comparisons can only be made if check_distance
is 2 or higher.
This is a great way to test if your system runs deterministically.
After creating the session, add a local player, set input delay for them and then start the session.
Trait Implementations§
§impl<T> Debug for SessionBuilder<T>
impl<T> Debug for SessionBuilder<T>
§impl<T> Default for SessionBuilder<T>where
T: Config,
impl<T> Default for SessionBuilder<T>where
T: Config,
§fn default() -> SessionBuilder<T>
fn default() -> SessionBuilder<T>
Auto Trait Implementations§
impl<T> Freeze for SessionBuilder<T>
impl<T> RefUnwindSafe for SessionBuilder<T>
impl<T> Send for SessionBuilder<T>
impl<T> Sync for SessionBuilder<T>
impl<T> Unpin for SessionBuilder<T>
impl<T> UnwindSafe for SessionBuilder<T>
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
source§fn from_world(_world: &World) -> T
fn from_world(_world: &World) -> T
Self
using data from the given World
.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> IntoArcAny for T
impl<T> IntoArcAny for T
§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.source§impl<T> RawDefault for Twhere
T: Default,
impl<T> RawDefault for Twhere
T: Default,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.