fix(game-server): adopt client packet sequences on first packet
Build Game Server / build (push) Successful in 16s
Build Game Server / build (push) Successful in 16s
The Cycle client does not derive its initial packet sequences from the handshake cookie the way stock UE does (its acked server-seq isn't present anywhere in the cookie), so the cookie-based InitSequence disagreed and every post-handshake packet was rejected as out-of-order. On the first packet, adopt the client's announced Seq/AckedSeq instead. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -267,6 +267,8 @@ public abstract class UNetConnection : UPlayer
|
||||
/// <summary>
|
||||
/// Full incoming packet index.
|
||||
/// </summary>
|
||||
private bool _bAdoptedInitialSequence;
|
||||
|
||||
public int InPacketId { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
@@ -540,6 +542,25 @@ public abstract class UNetConnection : UPlayer
|
||||
}
|
||||
|
||||
var packetSequenceDelta = PacketNotify.GetSequenceDelta(header);
|
||||
|
||||
// The Cycle client doesn't derive its initial packet sequences from the handshake
|
||||
// cookie the way stock UE does, so our cookie-based InitSequence disagrees with it
|
||||
// and every packet looks out-of-order. On the very first packet, adopt the client's
|
||||
// announced sequences (Seq + AckedSeq) instead of the cookie-derived ones.
|
||||
if (packetSequenceDelta <= 0 && !_bAdoptedInitialSequence && Driver != null && Driver.IsServer())
|
||||
{
|
||||
_bAdoptedInitialSequence = true;
|
||||
var adoptIn = new SequenceNumber((ushort)(header.Seq.Value - 1));
|
||||
var adoptOut = new SequenceNumber((ushort)(header.AckedSeq.Value + 1));
|
||||
PacketNotify.Init(adoptIn, adoptOut);
|
||||
InPacketId = header.Seq.Value - 1;
|
||||
OutPacketId = header.AckedSeq.Value + 1;
|
||||
OutAckPacketId = header.AckedSeq.Value;
|
||||
LastNotifiedPacketId = OutAckPacketId;
|
||||
Logger.Information("[HS-SEQ] Adopted client sequences: inSeq={In} outSeq={Out}", header.Seq.Value, header.AckedSeq.Value + 1);
|
||||
packetSequenceDelta = PacketNotify.GetSequenceDelta(header);
|
||||
}
|
||||
|
||||
if (packetSequenceDelta > 0)
|
||||
{
|
||||
var bPacketOrderCacheActive = !_bFlushingPacketOrderCache && _packetOrderCache != null;
|
||||
|
||||
Reference in New Issue
Block a user