[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