Add auto-kick for inactive players

This commit is contained in:
Gustaf Alhäll 2023-09-19 19:05:43 +02:00
parent 6deaf89f72
commit a8fe500d0e
No known key found for this signature in database
GPG key ID: 6C1F67D690CDEDFD
5 changed files with 40 additions and 2 deletions

View file

@ -113,6 +113,7 @@ consvar_t cv_blamecfail = CVAR_INIT ("blamecfail", "Off", CV_SAVE|CV_NETVAR, CV_
static CV_PossibleValue_t playbackspeed_cons_t[] = {{1, "MIN"}, {10, "MAX"}, {0, NULL}};
consvar_t cv_playbackspeed = CVAR_INIT ("playbackspeed", "1", 0, playbackspeed_cons_t, NULL);
consvar_t cv_idletime = CVAR_INIT ("idletime", "0", CV_SAVE, CV_Unsigned, NULL);
consvar_t cv_dedicatedidletime = CVAR_INIT ("dedicatedidletime", "10", CV_SAVE, CV_Unsigned, NULL);
void ResetNode(INT32 node)
@ -492,6 +493,10 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
HU_AddChatText(va("\x82*%s has been banned (%s)", player_names[pnum], reason), false);
kickreason = KR_BAN;
break;
case KICK_MSG_IDLE:
HU_AddChatText(va("\x82*%s has left the game (Inactive for too long)", player_names[pnum]), false);
kickreason = KR_TIMEOUT;
break;
}
if (pnum == consoleplayer)
@ -507,6 +512,8 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
M_StartMessage(M_GetText("Server closed connection\n(synch failure)\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_PING_HIGH)
M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_IDLE)
M_StartMessage(M_GetText("Server closed connection\n(Inactive for too long)\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_BANNED)
M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_CUSTOM_KICK)
@ -1267,6 +1274,30 @@ static void UpdatePingTable(void)
}
}
static void IdleUpdate(void)
{
INT32 i;
if (!server || !netgame)
return;
for (i = 1; i < MAXPLAYERS; i++)
{
if (cv_idletime.value && playeringame[i] && playernode[i] != UINT8_MAX && !players[i].quittime && !players[i].spectator && i != serverplayer)
{
if (players[i].cmd.forwardmove || players[i].cmd.sidemove || players[i].cmd.buttons)
netnodes[i].lastinput = gametime;
if (gametime - netnodes[i].lastinput > cv_idletime.value * TICRATE)
{
netnodes[i].lastinput = gametime;
SendKick(i, KICK_MSG_IDLE | KICK_MSG_KEEP_BODY);
}
}
else
netnodes[i].lastinput = gametime;
}
}
// Handle timeouts to prevent definitive freezes from happenning
static void HandleNodeTimeouts(void)
{
@ -1299,6 +1330,8 @@ void NetKeepAlive(void)
GetPackets();
IdleUpdate();
#ifdef MASTERSERVER
MasterClient_Ticker();
#endif
@ -1419,6 +1452,8 @@ void NetUpdate(void)
GetPackets(); // get packet from client or from server
IdleUpdate();
// The client sends the command after receiving from the server
// The server sends it before because this is better in single player

View file

@ -48,7 +48,7 @@ typedef enum
KR_TIMEOUT = 4, //Connection Timeout
KR_BAN = 5, //Banned by server
KR_LEAVE = 6, //Quit the game
KR_IDLE = 7, //Remained still for too long
} kickreason_t;
/* the max number of name changes in some time period */
@ -73,7 +73,7 @@ extern UINT32 realpingtable[MAXPLAYERS];
extern UINT32 playerpingtable[MAXPLAYERS];
extern tic_t servermaxping;
extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_dedicatedidletime;
extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_idletime, cv_dedicatedidletime;
// Used in d_net, the only dependence
void D_ClientServerInit(void);

View file

@ -43,6 +43,7 @@ typedef struct netnode_s
{
boolean ingame; // set false as nodes leave game
tic_t freezetimeout; // Until when can this node freeze the server before getting a timeout?
tic_t lastinput; // the last tic the player has made any input
SINT8 player;
SINT8 player2; // say the numplayer for this node if any (splitscreen)

View file

@ -601,6 +601,7 @@ void D_RegisterServerCommands(void)
CV_RegisterVar(&cv_showjoinaddress);
CV_RegisterVar(&cv_blamecfail);
CV_RegisterVar(&cv_dedicatedidletime);
CV_RegisterVar(&cv_idletime);
COM_AddCommand("ping", Command_Ping_f, COM_LUA);
CV_RegisterVar(&cv_nettimeout);

View file

@ -331,6 +331,7 @@ typedef struct
#define KICK_MSG_PING_HIGH 6
#define KICK_MSG_CUSTOM_KICK 7
#define KICK_MSG_CUSTOM_BAN 8
#define KICK_MSG_IDLE 9
#define KICK_MSG_KEEP_BODY 0x80
#endif