summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/commands.c12
-rw-r--r--src/server/main.c10
-rw-r--r--src/server/server.h1
-rw-r--r--src/server/user.c15
4 files changed, 34 insertions, 4 deletions
diff --git a/src/server/commands.c b/src/server/commands.c
index 30df491..457f5b5 100644
--- a/src/server/commands.c
+++ b/src/server/commands.c
@@ -589,16 +589,20 @@ static void dump_time(void)
client_t *client;
char buffer[MAX_QPATH];
time_t clock = time(NULL);
+ unsigned idle;
Com_Printf(
- "num name time\n"
- "--- --------------- --------\n");
+ "num name idle time\n"
+ "--- --------------- ---- --------\n");
FOR_EACH_CLIENT(client) {
+ idle = (svs.realtime - client->lastactivity) / 1000;
+ if (idle > 9999)
+ idle = 9999;
Com_TimeDiff(buffer, sizeof(buffer),
&client->connect_time, clock);
- Com_Printf("%3i %-15.15s %s\n",
- client->number, client->name, buffer);
+ Com_Printf("%3i %-15.15s %4u %s\n",
+ client->number, client->name, idle, buffer);
}
}
diff --git a/src/server/main.c b/src/server/main.c
index dbae1de..0383779 100644
--- a/src/server/main.c
+++ b/src/server/main.c
@@ -41,6 +41,7 @@ cvar_t *sv_fps;
cvar_t *sv_timeout; // seconds without any message
cvar_t *sv_zombietime; // seconds to sink messages after disconnect
cvar_t *sv_ghostime;
+cvar_t *sv_idlekick;
cvar_t *sv_password;
cvar_t *sv_reserved_password;
@@ -1120,6 +1121,7 @@ static void SVC_DirectConnect(void)
newcl->framenum = 1; // frame 0 can't be used
newcl->lastframe = -1;
newcl->lastmessage = svs.realtime; // don't timeout
+ newcl->lastactivity = svs.realtime;
newcl->min_ping = 9999;
}
@@ -1534,6 +1536,7 @@ static void SV_CheckTimeouts(void)
unsigned zombie_time = 1000 * sv_zombietime->value;
unsigned drop_time = 1000 * sv_timeout->value;
unsigned ghost_time = 1000 * sv_ghostime->value;
+ unsigned idle_time = 1000 * sv_idlekick->value;
unsigned delta;
FOR_EACH_CLIENT(client) {
@@ -1572,6 +1575,12 @@ static void SV_CheckTimeouts(void)
SV_DropClient(client, "too many nodelta frames");
continue;
}
+
+ delta = svs.realtime - client->lastactivity;
+ if (idle_time && delta > idle_time) {
+ SV_DropClient(client, "idling");
+ continue;
+ }
}
}
@@ -2035,6 +2044,7 @@ void SV_Init(void)
sv_timeout = Cvar_Get("timeout", "90", 0);
sv_zombietime = Cvar_Get("zombietime", "2", 0);
sv_ghostime = Cvar_Get("sv_ghostime", "6", 0);
+ sv_idlekick = Cvar_Get("sv_idlekick", "0", 0);
sv_showclamp = Cvar_Get("showclamp", "0", 0);
sv_enforcetime = Cvar_Get("sv_enforcetime", "1", 0);
sv_allow_nodelta = Cvar_Get("sv_allow_nodelta", "1", 0);
diff --git a/src/server/server.h b/src/server/server.h
index 3347ed5..1f9535d 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -286,6 +286,7 @@ typedef struct client_s {
// usercmd stuff
unsigned lastmessage; // svs.realtime when packet was last received
+ unsigned lastactivity; // svs.realtime when user activity was last seen
int lastframe; // for delta compression
usercmd_t lastcmd; // for filling in big drops
int command_msec; // every seconds this is reset, if user
diff --git a/src/server/user.c b/src/server/user.c
index 66f2ac7..8292795 100644
--- a/src/server/user.c
+++ b/src/server/user.c
@@ -993,6 +993,11 @@ static void SV_ExecuteUserCommand(const char *s)
}
}
+ if (!strcmp(c, "say") || !strcmp(c, "say_team")) {
+ // don't timeout. only chat commands count as activity.
+ sv_client->lastactivity = svs.realtime;
+ }
+
ge->ClientCommand(sv_player);
}
@@ -1015,6 +1020,8 @@ SV_ClientThink
*/
static inline void SV_ClientThink(usercmd_t *cmd)
{
+ usercmd_t *old = &sv_client->lastcmd;
+
sv_client->command_msec -= cmd->msec;
sv_client->num_moves++;
@@ -1024,6 +1031,14 @@ static inline void SV_ClientThink(usercmd_t *cmd)
return;
}
+ if (cmd->buttons != old->buttons
+ || cmd->forwardmove != old->forwardmove
+ || cmd->sidemove != old->sidemove
+ || cmd->upmove != old->upmove) {
+ // don't timeout
+ sv_client->lastactivity = svs.realtime;
+ }
+
ge->ClientThink(sv_player, cmd);
}