This is an automated email from the git hooks/post-receive script. smcv pushed a commit to tag 1.51b in repository iortcw.
commit 2f826e2a4ee3144278a00931bbfaffdc5334fd77 Author: MAN-AT-ARMS <[email protected]> Date: Tue Jun 13 14:12:24 2017 -0400 All: Refactor ClientNumberFromString MP: kick-clientkick refactor / prevent local client kicks SP: Not used --- MP/code/game/g_cmds.c | 62 ++++++++++++++++++++++++++++++++--------------- MP/code/server/sv_ccmds.c | 2 +- SP/code/game/g_cmds.c | 47 +++++++++++++++++++---------------- SP/code/server/sv_ccmds.c | 2 +- 4 files changed, 70 insertions(+), 43 deletions(-) diff --git a/MP/code/game/g_cmds.c b/MP/code/game/g_cmds.c index e85f380..10a03f4 100644 --- a/MP/code/game/g_cmds.c +++ b/MP/code/game/g_cmds.c @@ -196,31 +196,35 @@ Returns a player number for either a number or name string Returns -1 if invalid ================== */ -int ClientNumberFromString( gentity_t *to, char *s ) { +int ClientNumberFromString( gentity_t *to, char *s, qboolean checkNums, qboolean checkNames ) { gclient_t *cl; int idnum; char cleanName[MAX_STRING_CHARS]; - // numeric values could be slot numbers - if ( StringIsInteger( s ) ) { - idnum = atoi( s ); - if ( idnum >= 0 && idnum < level.maxclients ) { - cl = &level.clients[idnum]; - if ( cl->pers.connected == CON_CONNECTED ) { - return idnum; + if ( checkNums ) { + // numeric values could be slot numbers + if ( StringIsInteger( s ) ) { + idnum = atoi( s ); + if ( idnum >= 0 && idnum < level.maxclients ) { + cl = &level.clients[idnum]; + if ( cl->pers.connected == CON_CONNECTED ) { + return idnum; + } } } } - // check for a name match - for ( idnum = 0,cl = level.clients ; idnum < level.maxclients ; idnum++,cl++ ) { - if ( cl->pers.connected != CON_CONNECTED ) { - continue; - } - Q_strncpyz(cleanName, cl->pers.netname, sizeof(cleanName)); - Q_CleanStr(cleanName); - if ( !Q_stricmp( cleanName, s ) ) { - return idnum; + if ( checkNames ) { + // check for a name match + for ( idnum = 0, cl = level.clients; idnum < level.maxclients; idnum++, cl++ ) { + if ( cl->pers.connected != CON_CONNECTED ) { + continue; + } + Q_strncpyz( cleanName, cl->pers.netname, sizeof( cleanName ) ); + Q_CleanStr( cleanName ); + if ( !Q_stricmp( cleanName, s ) ) { + return idnum; + } } } @@ -819,7 +823,7 @@ void Cmd_Follow_f( gentity_t *ent ) { } trap_Argv( 1, arg, sizeof( arg ) ); - i = ClientNumberFromString( ent, arg ); + i = ClientNumberFromString( ent, arg, qtrue, qtrue ); if ( i == -1 ) { return; } @@ -1097,7 +1101,7 @@ static void Cmd_Tell_f( gentity_t *ent ) { } trap_Argv( 1, arg, sizeof( arg ) ); - targetNum = ClientNumberFromString( ent, arg ); + targetNum = ClientNumberFromString( ent, arg, qtrue, qtrue ); if ( targetNum == -1 ) { return; } @@ -1370,7 +1374,7 @@ void Cmd_GameCommand_f( gentity_t *ent ) { } trap_Argv( 1, arg, sizeof( arg ) ); - targetNum = ClientNumberFromString( ent, arg ); + targetNum = ClientNumberFromString( ent, arg, qtrue, qtrue ); if ( targetNum == -1 ) { return; } @@ -1548,6 +1552,23 @@ void Cmd_CallVote_f( gentity_t *ent ) { } Com_sprintf( level.voteString, sizeof( level.voteString ), "vstr nextmap" ); Com_sprintf( level.voteDisplayString, sizeof( level.voteDisplayString ), "%s", level.voteString ); + } else if ( !Q_stricmp( arg1, "clientkick" ) || !Q_stricmp( arg1, "kick" ) ) { + i = ClientNumberFromString( ent, arg2, !Q_stricmp( arg1, "clientkick" ), !Q_stricmp( arg1, "kick" ) ); + if ( i == -1 ) { + // if it can't do a client number match, don't allow kick (to prevent votekick text spam wars) + trap_SendServerCommand( ent - g_entities, "print \"Client not on server.\n\"" ); + return; + } + + if ( level.clients[i].pers.localClient ) { + trap_SendServerCommand( ent - g_entities, "print \"Cannot kick host player.\n\"" ); + return; + } + + // found a client number to kick, so override votestring with better one + Com_sprintf( level.voteString, sizeof( level.voteString ), "clientkick \"%d\"", i ); + Com_sprintf( level.voteDisplayString, sizeof( level.voteDisplayString ), "kick %s", level.clients[i].pers.netname ); +#if 0 // JPW NERVE } else if ( !Q_stricmp( arg1,"kick" ) ) { int i,kicknum = MAX_CLIENTS; @@ -1570,6 +1591,7 @@ void Cmd_CallVote_f( gentity_t *ent ) { return; } // jpw +#endif } else { Com_sprintf( level.voteString, sizeof( level.voteString ), "%s \"%s\"", arg1, arg2 ); Com_sprintf( level.voteDisplayString, sizeof( level.voteDisplayString ), "%s", level.voteString ); diff --git a/MP/code/server/sv_ccmds.c b/MP/code/server/sv_ccmds.c index be18877..3099385 100644 --- a/MP/code/server/sv_ccmds.c +++ b/MP/code/server/sv_ccmds.c @@ -729,7 +729,7 @@ static void SV_Ban_f( void ) { } if ( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { - Com_Printf("Cannot kick host player\n"); + Com_Printf("Cannot ban host player\n"); return; } diff --git a/SP/code/game/g_cmds.c b/SP/code/game/g_cmds.c index cd0b951..57dddcc 100644 --- a/SP/code/game/g_cmds.c +++ b/SP/code/game/g_cmds.c @@ -181,32 +181,35 @@ Returns a player number for either a number or name string Returns -1 if invalid ================== */ -int ClientNumberFromString( gentity_t *to, char *s ) { +int ClientNumberFromString( gentity_t *to, char *s, qboolean checkNums, qboolean checkNames ) { gclient_t *cl; int idnum; char cleanName[MAX_STRING_CHARS]; - // numeric values could be slot numbers - if ( StringIsInteger( s ) ) { - idnum = atoi( s ); - - if ( idnum >= 0 && idnum < level.maxclients ) { - cl = &level.clients[idnum]; - if ( cl->pers.connected == CON_CONNECTED ) { - return idnum; + if ( checkNums ) { + // numeric values could be slot numbers + if ( StringIsInteger( s ) ) { + idnum = atoi( s ); + if ( idnum >= 0 && idnum < level.maxclients ) { + cl = &level.clients[idnum]; + if ( cl->pers.connected == CON_CONNECTED ) { + return idnum; + } } } } - // check for a name match - for ( idnum = 0,cl = level.clients ; idnum < level.maxclients ; idnum++,cl++ ) { - if ( cl->pers.connected != CON_CONNECTED ) { - continue; - } - Q_strncpyz(cleanName, cl->pers.netname, sizeof(cleanName)); - Q_CleanStr(cleanName); - if ( !Q_stricmp( cleanName, s ) ) { - return idnum; + if ( checkNames ) { + // check for a name match + for ( idnum = 0, cl = level.clients; idnum < level.maxclients; idnum++, cl++ ) { + if ( cl->pers.connected != CON_CONNECTED ) { + continue; + } + Q_strncpyz( cleanName, cl->pers.netname, sizeof( cleanName ) ); + Q_CleanStr( cleanName ); + if ( !Q_stricmp( cleanName, s ) ) { + return idnum; + } } } @@ -769,7 +772,7 @@ void Cmd_Follow_f( gentity_t *ent ) { } trap_Argv( 1, arg, sizeof( arg ) ); - i = ClientNumberFromString( ent, arg ); + i = ClientNumberFromString( ent, arg, qtrue, qtrue ); if ( i == -1 ) { return; } @@ -1032,7 +1035,7 @@ static void Cmd_Tell_f( gentity_t *ent ) { } trap_Argv( 1, arg, sizeof( arg ) ); - targetNum = ClientNumberFromString( ent, arg ); + targetNum = ClientNumberFromString( ent, arg, qtrue, qtrue ); if ( targetNum == -1 ) { return; } @@ -1082,7 +1085,7 @@ void Cmd_GameCommand_f( gentity_t *ent ) { } trap_Argv( 1, arg, sizeof( arg ) ); - targetNum = ClientNumberFromString( ent, arg ); + targetNum = ClientNumberFromString( ent, arg, qtrue, qtrue ); if ( targetNum == -1 ) { return; } @@ -1156,10 +1159,12 @@ void Cmd_CallVote_f( gentity_t *ent ) { } else if ( !Q_stricmp( arg1, "map" ) ) { } else if ( !Q_stricmp( arg1, "g_gametype" ) ) { } else if ( !Q_stricmp( arg1, "kick" ) ) { + } else if ( !Q_stricmp( arg1, "clientkick" ) ) { } else { trap_SendServerCommand( ent - g_entities, "print \"Invalid vote string.\n\"" ); return; } + Com_sprintf( level.voteString, sizeof( level.voteString ), "%s %s", arg1, arg2 ); trap_SendServerCommand( -1, va( "print \"%s called a vote.\n\"", ent->client->pers.netname ) ); diff --git a/SP/code/server/sv_ccmds.c b/SP/code/server/sv_ccmds.c index edde770..60c2174 100644 --- a/SP/code/server/sv_ccmds.c +++ b/SP/code/server/sv_ccmds.c @@ -746,7 +746,7 @@ static void SV_Ban_f( void ) { } if ( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { - Com_Printf("Cannot kick host player\n"); + Com_Printf("Cannot ban host player\n"); return; } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

