mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-26 20:31:30 +00:00
Rewrite ping timeout
- ALWAYS kick someone who's about to stop the server because they're about to overrun TICQUEUE, even if they're in the joiner grace period - Reduce the joiner grace period for normal ping limit to 10 seconds (from 30) - Properly account for ignoring all local players when the host is splitscreen
This commit is contained in:
parent
33e35b7e13
commit
ab68f0dadd
1 changed files with 54 additions and 26 deletions
|
@ -5983,44 +5983,72 @@ boolean TryRunTics(tic_t realtics)
|
||||||
|
|
||||||
static INT32 pingtimeout[MAXPLAYERS];
|
static INT32 pingtimeout[MAXPLAYERS];
|
||||||
|
|
||||||
|
#define PINGKICK_TICQUEUE 2
|
||||||
|
#define PINGKICK_LIMIT 1
|
||||||
|
|
||||||
static inline void PingUpdate(void)
|
static inline void PingUpdate(void)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
boolean laggers[MAXPLAYERS];
|
UINT8 pingkick[MAXPLAYERS];
|
||||||
UINT8 numlaggers = 0;
|
UINT8 nonlaggers = 0;
|
||||||
memset(laggers, 0, sizeof(boolean) * MAXPLAYERS);
|
memset(pingkick, 0, sizeof(pingkick));
|
||||||
|
|
||||||
netbuffer->packettype = PT_PING;
|
netbuffer->packettype = PT_PING;
|
||||||
|
|
||||||
//check for ping limit breakage.
|
//check for ping limit breakage.
|
||||||
if (cv_maxping.value)
|
//if (cv_maxping.value) -- always check for TICQUEUE overrun
|
||||||
{
|
{
|
||||||
for (i = 1; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
if (playeringame[i] && (realpingtable[i] / pingmeasurecount > (unsigned)cv_maxping.value))
|
if (!playeringame[i] || P_IsLocalPlayer(&players[i])) // should be P_IsMachineLocalPlayer for DRRR
|
||||||
{
|
{
|
||||||
if (players[i].jointime > 30 * TICRATE)
|
pingtimeout[i] = 0;
|
||||||
laggers[i] = true;
|
continue;
|
||||||
numlaggers++;
|
}
|
||||||
|
|
||||||
|
if ((maketic + 5) >= nettics[playernode[i]] + (TICQUEUE-(2*TICRATE)))
|
||||||
|
{
|
||||||
|
// Anyone who's gobbled most of the TICQUEUE and is likely to halt the server the next few times this runs has to die *right now*. (See also NetUpdate)
|
||||||
|
pingkick[i] = PINGKICK_TICQUEUE;
|
||||||
|
}
|
||||||
|
else if ((cv_maxping.value)
|
||||||
|
&& (realpingtable[i] / pingmeasurecount > (unsigned)cv_maxping.value))
|
||||||
|
{
|
||||||
|
if (players[i].jointime > 10 * TICRATE)
|
||||||
|
{
|
||||||
|
pingkick[i] = PINGKICK_LIMIT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pingtimeout[i] = 0;
|
{
|
||||||
|
nonlaggers++;
|
||||||
|
|
||||||
|
// you aren't lagging, but you aren't free yet. In case you'll keep spiking, we just make the timer go back down. (Very unstable net must still get kicked).
|
||||||
|
if (pingtimeout[i] > 0)
|
||||||
|
pingtimeout[i]--;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//kick lagging players... unless everyone but the server's ping sucks.
|
//kick lagging players... unless everyone but the server's ping sucks.
|
||||||
//in that case, it is probably the server's fault.
|
//in that case, it is probably the server's fault.
|
||||||
if (numlaggers < D_NumPlayers() - 1)
|
// Always kick TICQUEUE-overrunners, too.
|
||||||
{
|
{
|
||||||
for (i = 1; i < MAXPLAYERS; i++)
|
UINT8 minimumkicklevel = (nonlaggers > 0) ? PINGKICK_LIMIT : PINGKICK_TICQUEUE;
|
||||||
{
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
if (playeringame[i] && laggers[i])
|
|
||||||
{
|
|
||||||
pingtimeout[i]++;
|
|
||||||
if (pingtimeout[i] > cv_pingtimeout.value) // ok your net has been bad for too long, you deserve to die.
|
|
||||||
{
|
{
|
||||||
XBOXSTATIC char buf[2];
|
XBOXSTATIC char buf[2];
|
||||||
|
|
||||||
|
if (!playeringame[i] || pingkick[i] < minimumkicklevel)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (pingkick[i] == PINGKICK_LIMIT)
|
||||||
|
{
|
||||||
|
// Don't kick on ping alone if we haven't reached our threshold yet.
|
||||||
|
if (++pingtimeout[i] < cv_pingtimeout.value)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
pingtimeout[i] = 0;
|
pingtimeout[i] = 0;
|
||||||
|
|
||||||
buf[0] = (char)i;
|
buf[0] = (char)i;
|
||||||
|
@ -6028,10 +6056,6 @@ static inline void PingUpdate(void)
|
||||||
SendNetXCmd(XD_KICK, &buf, 2);
|
SendNetXCmd(XD_KICK, &buf, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // you aren't lagging, but you aren't free yet. In case you'll keep spiking, we just make the timer go back down. (Very unstable net must still get kicked).
|
|
||||||
pingtimeout[i] = (pingtimeout[i] == 0 ? 0 : pingtimeout[i]-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//make the ping packet and clear server data for next one
|
//make the ping packet and clear server data for next one
|
||||||
|
@ -6057,6 +6081,9 @@ static inline void PingUpdate(void)
|
||||||
pingmeasurecount = 0; //Reset count
|
pingmeasurecount = 0; //Reset count
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef PINGKICK_DANGER
|
||||||
|
#undef PINGKICK_LIMIT
|
||||||
|
|
||||||
static tic_t gametime = 0;
|
static tic_t gametime = 0;
|
||||||
|
|
||||||
static void UpdatePingTable(void)
|
static void UpdatePingTable(void)
|
||||||
|
@ -6225,6 +6252,7 @@ FILESTAMP
|
||||||
// Do not make tics while resynching
|
// Do not make tics while resynching
|
||||||
if (counts != -666)
|
if (counts != -666)
|
||||||
{
|
{
|
||||||
|
// See also PingUpdate
|
||||||
if (maketic + counts >= firstticstosend + TICQUEUE)
|
if (maketic + counts >= firstticstosend + TICQUEUE)
|
||||||
counts = firstticstosend+TICQUEUE-maketic-1;
|
counts = firstticstosend+TICQUEUE-maketic-1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue