In server.h, I added:
char userinfobuffer[MAX_INFO_STRING];
int nextReliableUserTime;
to client_s
In sv_main.c, I added:
SV_CheckClientUserinfoTimer();
to end of sv_frame
In sv_snapshot.c, I added:
void SV_CheckClientUserinfoTimer( void ) {
int i;
client_t *cl;
char bigbuffer[ MAX_INFO_STRING * 2];
for (i=0, cl = svs.clients ; i < sv_maxclients->integer ; i++, cl++) {
if (!cl->state) {
continue; // not connected
}
if ( (sv_floodProtect->integer) &&
(svs.time >= cl->nextReliableUserTime)
&& (cl->state >= CS_ACTIVE) &&
(cl->userinfobuffer[0]!=0) )
{
//We have something in the buffer
//and its time to process it
sprintf(bigbuffer,"userinfo %s/0",cl->userinfobuffer);
Cmd_TokenizeString(bigbuffer);
SV_UpdateUserinfo_f(cl);
}
}
}
at the bottom.
And in sv_client.c, I changed SV_UpdateUserinfo_f to:
void SV_UpdateUserinfo_f( client_t *cl ) {
if ( (sv_floodProtect->integer) && (cl->state >= CS_ACTIVE) && (svs.time < cl->nextReliableUserTime) ) {
Q_strncpyz( cl->userinfobuffer, Cmd_Argv(1), sizeof(cl->userinfobuffer) );
SV_SendServerCommand(cl, "print \"^7Command ^1delayed^7 due to sv_floodprotect.\"");
return;
}
cl->userinfobuffer[0]=0;
cl->nextReliableUserTime = svs.time + 4000;
Q_strncpyz( cl->userinfo, Cmd_Argv(1), sizeof(cl->userinfo) );
SV_UserinfoChanged( cl );
// call prog code to allow overrides
VM_Call( gvm, GAME_CLIENT_USERINFO_CHANGED, cl - svs.clients );
}
But for some reason, when updating userinfo from the userinfobuffer, it breaks after a space in the userinfo.