1- using System . Diagnostics ;
21using System . Runtime . CompilerServices ;
32using System . Runtime . InteropServices ;
43using Backdash . Core ;
@@ -36,6 +35,8 @@ sealed class RemoteBackend<TInput> : INetcodeSession<TInput>, IProtocolNetworkEv
3635 readonly HashSet < PlayerHandle > addedSpectators = [ ] ;
3736 readonly IInputListener < TInput > ? inputListener ;
3837 public IDeterministicRandom Random { get ; }
38+ readonly EqualityComparer < TInput > inputComparer ;
39+ readonly EqualityComparer < ConfirmedInputs < TInput > > inputGroupComparer ;
3940
4041 bool isSynchronizing = true ;
4142 int nextRecommendedInterval ;
@@ -59,7 +60,7 @@ BackendServices<TInput> services
5960 ArgumentNullException . ThrowIfNull ( options ) ;
6061 ArgumentOutOfRangeException . ThrowIfNegativeOrZero ( port ) ;
6162 ArgumentOutOfRangeException . ThrowIfNegativeOrZero ( options . FramesPerSecond ) ;
62- ThrowHelpers . ThrowIfArgumentOutOfBounds ( options . SpectatorOffset , min : Max . NumberOfPlayers ) ;
63+ ThrowIf . ArgumentOutOfBounds ( options . SpectatorOffset , min : Max . NumberOfPlayers ) ;
6364
6465 this . options = options ;
6566 inputSerializer = services . InputSerializer ;
@@ -68,6 +69,8 @@ BackendServices<TInput> services
6869 inputListener = services . InputListener ;
6970 Random = services . DeterministicRandom ;
7071 syncNumber = services . Random . MagicNumber ( ) ;
72+ inputComparer = services . InputComparer ;
73+ inputGroupComparer = ConfirmedInputComparer < TInput > . Create ( services . InputComparer ) ;
7174
7275 peerInputEventQueue = new ( ) ;
7376 peerCombinedInputsEventPublisher = new ProtocolCombinedInputsEventPublisher < TInput > ( peerInputEventQueue ) ;
@@ -84,7 +87,8 @@ BackendServices<TInput> services
8487 addedPlayers ,
8588 services . StateStore ,
8689 services . ChecksumProvider ,
87- localConnections
90+ localConnections ,
91+ inputComparer
8892 )
8993 {
9094 Callbacks = callbacks ,
@@ -253,7 +257,7 @@ public void SetHandler(INetcodeSessionHandler handler)
253257
254258 public void SetFrameDelay ( PlayerHandle player , int delayInFrames )
255259 {
256- ThrowHelpers . ThrowIfArgumentOutOfBounds ( player . InternalQueue , 0 , addedPlayers . Count ) ;
260+ ThrowIf . ArgumentOutOfBounds ( player . InternalQueue , 0 , addedPlayers . Count ) ;
257261 ArgumentOutOfRangeException . ThrowIfNegative ( delayInFrames ) ;
258262 synchronizer . SetFrameDelay ( player , delayInFrames ) ;
259263 }
@@ -295,7 +299,7 @@ ResultCode AddRemotePlayer(RemotePlayer player)
295299 var endpoint = player . EndPoint ;
296300 var protocol = peerConnectionFactory . Create (
297301 new ( player . Handle , endpoint , localConnections , syncNumber ) ,
298- inputSerializer , peerInputEventQueue
302+ inputSerializer , peerInputEventQueue , inputComparer
299303 ) ;
300304
301305 peerObservers . Add ( protocol . GetUdpObserver ( ) ) ;
@@ -334,7 +338,8 @@ ResultCode AddSpectator(Spectator spectator)
334338 var protocol = peerConnectionFactory . Create (
335339 new ( spectatorHandle , spectator . EndPoint , localConnections , syncNumber ) ,
336340 inputGroupSerializer ,
337- peerCombinedInputsEventPublisher
341+ peerCombinedInputsEventPublisher ,
342+ inputGroupComparer
338343 ) ;
339344 peerObservers . Add ( protocol . GetUdpObserver ( ) ) ;
340345 spectators . Add ( protocol ) ;
@@ -432,7 +437,7 @@ void ConsumeProtocolInputEvents()
432437 var currentRemoteFrame = localConnections [ player ] . LastFrame ;
433438 var newRemoteFrame = eventInput . Frame ;
434439
435- Trace . Assert ( currentRemoteFrame . IsNull || newRemoteFrame == currentRemoteFrame . Next ( ) ) ;
440+ ThrowIf . Assert ( currentRemoteFrame . IsNull || newRemoteFrame == currentRemoteFrame . Next ( ) ) ;
436441 synchronizer . AddRemoteInput ( in player , eventInput ) ;
437442 // Notify the other endpoints which frame we received from a peer
438443 logger . Write ( LogLevel . Trace , $ "setting remote connect status frame { player } to { eventInput . Frame } ") ;
@@ -490,7 +495,7 @@ void DoSync()
490495 eps [ i ] ? . SetLocalFrameNumber ( currentFrame , options . FramesPerSecond ) ;
491496
492497 var minConfirmedFrame = NumberOfPlayers <= 2 ? MinimumFrame2Players ( ) : MinimumFrameNPlayers ( ) ;
493- Trace . Assert ( minConfirmedFrame != Frame . MaxValue ) ;
498+ ThrowIf . Assert ( minConfirmedFrame != Frame . MaxValue ) ;
494499 logger . Write ( LogLevel . Trace , $ "last confirmed frame in p2p backend is { minConfirmedFrame } ") ;
495500
496501 if ( minConfirmedFrame >= Frame . Zero )
@@ -697,7 +702,7 @@ void DisconnectPlayerQueue(in PlayerHandle player, in Frame syncTo)
697702 $ "Changing player { player } local connect status for last frame from { connStatus . LastFrame } to { syncTo } on disconnect request (current: { frameCount } )") ;
698703 connStatus . Disconnected = true ;
699704 connStatus . LastFrame = syncTo ;
700- if ( syncTo < frameCount && syncTo . IsNotNull )
705+ if ( syncTo < frameCount && ! syncTo . IsNull )
701706 {
702707 logger . Write ( LogLevel . Information ,
703708 $ "adjusting simulation to account for the fact that { player } disconnected on frame { syncTo } ") ;
0 commit comments