diff --git a/src/common/engine/i_net.h b/src/common/engine/i_net.h index 510388fad..1d09517e2 100644 --- a/src/common/engine/i_net.h +++ b/src/common/engine/i_net.h @@ -11,7 +11,7 @@ enum ENetConstants BACKUPTICS = 35 * 5, // Remember up to 5 seconds of data. MAXTICDUP = 3, MAXSENDTICS = 35 * 1, // Only send up to 1 second of data at a time. - STABILITYTICS = 12, + STABILITYTICS = 17, LOCALCMDTICS = (BACKUPTICS * MAXTICDUP), MAX_MSGLEN = 14000, }; diff --git a/src/d_net.cpp b/src/d_net.cpp index 92c2e36e8..1ddfde27c 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -378,7 +378,7 @@ void Net_ClearBuffers() memset(state.RecvTime, 0, sizeof(state.RecvTime)); state.bNewLatency = true; - state.ResendID = 0u; + state.ResendID = state.StabilityBuffer = 0u; state.CurrentNetConsistency = state.LastVerifiedConsistency = state.ConsistencyAck = state.ResendConsistencyFrom = -1; state.CurrentSequence = state.SequenceAck = state.ResendSequenceFrom = -1; state.Flags = 0; @@ -535,6 +535,7 @@ void Net_ResetCommands(bool midTic) { auto& state = ClientStates[client]; state.Flags &= CF_QUIT; + state.StabilityBuffer = 0u; state.CurrentSequence = min(state.CurrentSequence, tic); state.SequenceAck = min(state.SequenceAck, tic); if (state.ResendSequenceFrom >= tic) @@ -589,7 +590,8 @@ static size_t GetNetBufferSize() const int ranTics = NetBuffer[totalBytes++]; if (ranTics > 0) totalBytes += 4; - if (NetMode == NET_PacketServer && RemoteClient == Net_Arbitrator) + // Stability buffer/commands ahead + if (NetMode == NET_PacketServer) ++totalBytes; // Minimum additional packet size per player: @@ -931,12 +933,16 @@ static void GetPackets() if (ranTics > 0) baseConsistency = (NetBuffer[curByte++] << 24) | (NetBuffer[curByte++] << 16) | (NetBuffer[curByte++] << 8) | NetBuffer[curByte++]; - if (NetMode == NET_PacketServer && clientNum == Net_Arbitrator) + if (NetMode == NET_PacketServer) { if (validID) - CommandsAhead = NetBuffer[curByte++]; - else - ++curByte; + { + if (clientNum == Net_Arbitrator) + CommandsAhead = NetBuffer[curByte]; + else if (consoleplayer == Net_Arbitrator) + clientState.StabilityBuffer = NetBuffer[curByte]; + } + ++curByte; } for (int p = 0; p < playerCount; ++p) @@ -1696,8 +1702,13 @@ void NetUpdate(int tics) NetBuffer[size++] = baseConsistency + curTicOfs; } - if (NetMode == NET_PacketServer && consoleplayer == Net_Arbitrator) - NetBuffer[size++] = client == Net_Arbitrator ? 0 : max(curState.CurrentSequence - newestTic, 0); + if (NetMode == NET_PacketServer) + { + if (consoleplayer == Net_Arbitrator) + NetBuffer[size++] = client == Net_Arbitrator ? 0 : max(curState.CurrentSequence + curState.StabilityBuffer - newestTic, 0); + else + NetBuffer[size++] = max(StabilityBuffer, 0); + } // Client commands. diff --git a/src/d_net.h b/src/d_net.h index b62f4be05..8938f0c42 100644 --- a/src/d_net.h +++ b/src/d_net.h @@ -109,6 +109,7 @@ struct FClientNetState int Flags = 0; // State of this client. + uint8_t StabilityBuffer = 0u; // If in packet-server mode, account for if the client is trying to stabilize when measuring their performance. uint8_t ResendID = 0u; // Make sure that if the retransmit happened on a wait barrier, it can be properly resent back over. int ResendSequenceFrom = -1; // If >= 0, send from this sequence up to the most recent one, capped to MAXSENDTICS. int SequenceAck = -1; // The last sequence the client reported from us.