Skip to content

Commit 0aeef23

Browse files
committed
fix load state before last input
1 parent 02abae6 commit 0aeef23

File tree

8 files changed

+22
-8
lines changed

8 files changed

+22
-8
lines changed

src/Backdash/Data/CircularBuffer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ T DropLast()
6161
return value;
6262
}
6363

64-
6564
public ref T Next() => ref array[head];
6665
public ref T Front() => ref array[CurrentIndex];
6766
public ref T Back() => ref array[tail];

src/Backdash/Frame.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public bool TryFormat(
102102
}
103103

104104
/// <inheritdoc cref="Number" />
105-
public static explicit operator int(Frame frame) => frame.Number;
105+
public static implicit operator int(Frame frame) => frame.Number;
106106

107107
/// <inheritdoc cref="Frame(int)" />
108108
public static explicit operator Frame(int frame) => new(frame);

src/Backdash/Session/Backends/LocalSession.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ public void AdvanceFrame()
208208

209209
public bool LoadFrame(Frame frame)
210210
{
211-
frame = Frame.Max(in frame, in Frame.Zero);
211+
if (frame.Number < 1) return false;
212212

213213
if (frame.Number == CurrentFrame.Number)
214214
{

src/Backdash/Session/Backends/RemoteSession.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ public void SetFrameDelay(NetcodePlayer player, int delayInFrames)
441441

442442
public bool LoadFrame(Frame frame)
443443
{
444-
frame = Frame.Max(in frame, in Frame.Zero);
444+
if (frame.Number < 0) return false;
445445
return synchronizer.TryLoadFrame(in frame);
446446
}
447447

src/Backdash/Session/Backends/ReplaySession.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ public void SaveCurrentFrame()
207207

208208
public bool LoadFrame(Frame frame)
209209
{
210-
frame = Frame.Max(in frame, in Frame.Zero);
210+
if (frame.Number < 0) return false;
211211

212212
if (frame.Number == CurrentFrame.Number)
213213
{

src/Backdash/Session/Backends/SpectatorSession.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ void SaveCurrentFrame()
355355

356356
public bool LoadFrame(Frame frame)
357357
{
358-
frame = Frame.Max(in frame, in Frame.Zero);
358+
if (frame.Number < 0) return false;
359359

360360
if (frame.Number == CurrentFrame.Number)
361361
{

src/Backdash/Session/Backends/SyncTestSession.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ public ResultCode SynchronizeInputs()
268268

269269
public bool LoadFrame(Frame frame)
270270
{
271-
frame = Frame.Max(in frame, in Frame.Zero);
271+
if (frame.Number < 0) return false;
272272
return synchronizer.TryLoadFrame(in frame);
273273
}
274274

src/Backdash/Synchronizing/Input/InputQueue.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,19 @@ public void DiscardInputsAfter(in Frame frame)
7979

8080
var offset = lastUserAddedFrame.Number - frame.Number;
8181
if (offset < 0) return;
82+
8283
logger.Write(LogLevel.Debug, $"Queue {QueueId} => dropping last {offset} frames.");
8384
inputs.Advance(-offset);
85+
8486
lastUserAddedFrame = frame;
8587
lastFrameRequested = frame;
8688
lastAddedFrame = frame + LocalFrameDelay;
89+
90+
if (!inputs.IsEmpty) return;
91+
var firstInput = inputs.Front();
92+
firstInput.Frame = frame;
93+
lastAddedFrame = frame;
94+
inputs.Add(firstInput);
8795
}
8896

8997
public bool GetConfirmedInput(in Frame requestedFrame, ref GameInput<TInput> input)
@@ -101,13 +109,20 @@ public bool GetConfirmedInput(in Frame requestedFrame, ref GameInput<TInput> inp
101109

102110
public bool GetInput(in Frame requestedFrame, out GameInput<TInput> input)
103111
{
112+
if (inputs.IsEmpty)
113+
throw new InvalidOperationException("Can't get inputs: queue is empty.");
114+
104115
logger.Write(LogLevel.Trace, $"Queue {QueueId} => requesting input frame {requestedFrame.Number}.");
105116
// No one should ever try to grab any input when we have a prediction error.
106117
// Doing so means that we're just going further down the wrong path.
107118
ThrowIf.Assert(firstIncorrectFrame.IsNull);
108119
// Remember the last requested frame number for later. We'll need this in AddInput() to drop out of prediction mode.
109120
lastFrameRequested = requestedFrame;
110-
ThrowIf.Assert(requestedFrame.Number >= FirstInput.Frame.Number);
121+
if (requestedFrame.Number < FirstInput.Frame.Number)
122+
throw new InvalidOperationException(
123+
$"Requested frame ({requestedFrame.Number}) can not be smaller than the first input frame ({FirstInput.Frame.Number})."
124+
);
125+
111126
if (prediction.Frame.IsNull)
112127
{
113128
// If the frame requested is in our range, fetch it out of the queue and return it.

0 commit comments

Comments
 (0)