[iortcw] 12/89: All: Refactor ClientNumberFromString

Simon McVittie smcv at debian.org
Fri Sep 8 10:44:15 UTC 2017


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 <M4N4T4RMS at gmail.com>
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



More information about the Pkg-games-commits mailing list