@@ -53,6 +53,11 @@ func (rs *RollbackSystem) hijackRunMatch(s *System) bool {
5353 panic (err )
5454 }
5555
56+ // Desync/disconnect callbacks may request a session abort outside the normal input path.
57+ if s .esc {
58+ break
59+ }
60+
5661 // Sync speculative inputs and run a speculative frame
5762 running = rs .runFrame (s )
5863
@@ -62,7 +67,7 @@ func (rs *RollbackSystem) hijackRunMatch(s *System) bool {
6267
6368 rs .session .next = rs .session .now + 1000 / 60
6469
65- if ! running {
70+ if s . esc || ! running {
6671 break
6772 }
6873
@@ -71,7 +76,7 @@ func (rs *RollbackSystem) hijackRunMatch(s *System) bool {
7176 //rs.session.loopTimer.usToWaitThisLoop()
7277 running = s .update ()
7378
74- if ! running {
79+ if s . esc || ! running {
7580 break
7681 }
7782 }
@@ -151,6 +156,10 @@ func (rs *RollbackSystem) runFrame(s *System) bool {
151156 var buffer []byte
152157 var ggpoerr error
153158
159+ if s .esc {
160+ return false
161+ }
162+
154163 if rs .session .syncTest && rs .session .netTime == 0 {
155164 if rs .session .config .DesyncTestAI {
156165 buffer = getAIInputs (0 )
@@ -201,7 +210,7 @@ func (rs *RollbackSystem) runFrame(s *System) bool {
201210 if err != nil {
202211 panic (err )
203212 }
204- if ! keepRunning {
213+ if s . esc || ! keepRunning {
205214 return false
206215 }
207216 }
@@ -732,7 +741,9 @@ func (r *RollbackSession) OnEvent(info *ggpo.Event) {
732741 fmt .Println ("EventCodeDisconnectedFromPeer" )
733742 sys .endMatch = true
734743 r .SaveReplay ()
735- sys .sessionWarning = fmt .Sprintf (sys .motif .WarningInfo .Text .Text ["disconnect" ], int (info .Player ))
744+ if sys .sessionWarning == "" {
745+ sys .sessionWarning = fmt .Sprintf (sys .motif .WarningInfo .Text .Text ["disconnect" ], int (info .Player ))
746+ }
736747 case ggpo .EventCodeTimeSync :
737748 fmt .Printf ("EventCodeTimeSync: FramesAhead %f TimeSyncPeriodInFrames: %d\n " , info .FramesAhead , info .TimeSyncPeriodInFrames )
738749 r .loopTimer .OnGGPOTimeSyncEvent (info .FramesAhead )
@@ -741,7 +752,8 @@ func (r *RollbackSession) OnEvent(info *ggpo.Event) {
741752 r .log .saveLogs ()
742753 }
743754 fmt .Println ("EventCodeDesync" )
744- sys .endMatch = true
755+ log .Printf ("Rollback desync detected" )
756+ sys .esc = true
745757 r .SaveReplay ()
746758 sys .sessionWarning = sys .motif .WarningInfo .Text .Text ["desync" ]
747759 case ggpo .EventCodeConnectionInterrupted :
0 commit comments