mirror of
https://git.code.sf.net/p/quake/newtree
synced 2024-11-29 07:12:30 +00:00
take care of repeated output for begin as well as say and say team. As this
list is likely to keep growing, I've re-written SV_ExecuteUserCommand to check a flag in the user command entry to see wheter output should be redirected or not. Also, the ucmds table is now qsorted on init and bsearched in SV_ExecuteUserCommand for both speed and code cleanliness.
This commit is contained in:
parent
d143410ecd
commit
e7a6ad981d
1 changed files with 27 additions and 22 deletions
|
@ -1199,6 +1199,7 @@ SV_NoSnap_f (void)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *name;
|
char *name;
|
||||||
void (*func) (void);
|
void (*func) (void);
|
||||||
|
int no_redirect;
|
||||||
} ucmd_t;
|
} ucmd_t;
|
||||||
|
|
||||||
ucmd_t ucmds[] = {
|
ucmd_t ucmds[] = {
|
||||||
|
@ -1207,7 +1208,7 @@ ucmd_t ucmds[] = {
|
||||||
{"soundlist", SV_Soundlist_f},
|
{"soundlist", SV_Soundlist_f},
|
||||||
{"prespawn", SV_PreSpawn_f},
|
{"prespawn", SV_PreSpawn_f},
|
||||||
{"spawn", SV_Spawn_f},
|
{"spawn", SV_Spawn_f},
|
||||||
{"begin", SV_Begin_f},
|
{"begin", SV_Begin_f, 1},
|
||||||
|
|
||||||
{"drop", SV_Drop_f},
|
{"drop", SV_Drop_f},
|
||||||
{"pings", SV_Pings_f},
|
{"pings", SV_Pings_f},
|
||||||
|
@ -1218,8 +1219,8 @@ ucmd_t ucmds[] = {
|
||||||
{"pause", SV_Pause_f},
|
{"pause", SV_Pause_f},
|
||||||
{"msg", SV_Msg_f},
|
{"msg", SV_Msg_f},
|
||||||
|
|
||||||
{"say", SV_Say_f},
|
{"say", SV_Say_f, 1},
|
||||||
{"say_team", SV_Say_Team_f},
|
{"say_team", SV_Say_Team_f, 1},
|
||||||
|
|
||||||
{"setinfo", SV_SetInfo_f},
|
{"setinfo", SV_SetInfo_f},
|
||||||
|
|
||||||
|
@ -1232,9 +1233,16 @@ ucmd_t ucmds[] = {
|
||||||
|
|
||||||
{"snap", SV_NoSnap_f},
|
{"snap", SV_NoSnap_f},
|
||||||
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
ucmds_compare (const void *_a, const void *_b)
|
||||||
|
{
|
||||||
|
ucmd_t *a = (ucmd_t*)_a;
|
||||||
|
ucmd_t *b = (ucmd_t*)_b;
|
||||||
|
return strcmp (a->name, b->name);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SV_ExecuteUserCommand
|
SV_ExecuteUserCommand
|
||||||
|
|
||||||
|
@ -1244,31 +1252,26 @@ void
|
||||||
SV_ExecuteUserCommand (char *s)
|
SV_ExecuteUserCommand (char *s)
|
||||||
{
|
{
|
||||||
ucmd_t *u;
|
ucmd_t *u;
|
||||||
int no_redirect;
|
ucmd_t cmd;
|
||||||
|
|
||||||
no_redirect = strnequal (s, "say", 3);
|
|
||||||
Cmd_TokenizeString (s);
|
Cmd_TokenizeString (s);
|
||||||
sv_player = host_client->edict;
|
sv_player = host_client->edict;
|
||||||
|
cmd.name = Cmd_Argv(0);
|
||||||
|
|
||||||
if (!no_redirect)
|
u = (ucmd_t*) bsearch (&cmd, ucmds, sizeof (ucmds) / sizeof (ucmds[0]),
|
||||||
|
sizeof (ucmds[0]), ucmds_compare);
|
||||||
|
|
||||||
|
if (!u) {
|
||||||
SV_BeginRedirect (RD_CLIENT);
|
SV_BeginRedirect (RD_CLIENT);
|
||||||
|
|
||||||
for (u = ucmds; u->name; u++) {
|
|
||||||
if (!strcmp (Cmd_Argv (0), u->name)) {
|
|
||||||
u->func ();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!u->name) {
|
|
||||||
if (no_redirect)
|
|
||||||
SV_BeginRedirect (RD_CLIENT);
|
|
||||||
no_redirect = 0;
|
|
||||||
Con_Printf ("Bad user command: %s\n", Cmd_Argv (0));
|
Con_Printf ("Bad user command: %s\n", Cmd_Argv (0));
|
||||||
}
|
|
||||||
|
|
||||||
if (!no_redirect)
|
|
||||||
SV_EndRedirect ();
|
SV_EndRedirect ();
|
||||||
|
} else {
|
||||||
|
if (!u->no_redirect)
|
||||||
|
SV_BeginRedirect (RD_CLIENT);
|
||||||
|
u->func ();
|
||||||
|
if (!u->no_redirect)
|
||||||
|
SV_EndRedirect ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1818,6 +1821,8 @@ SV_UserInit
|
||||||
void
|
void
|
||||||
SV_UserInit (void)
|
SV_UserInit (void)
|
||||||
{
|
{
|
||||||
|
qsort (ucmds, sizeof (ucmds) / sizeof (ucmds[0]), sizeof (ucmds[0]),
|
||||||
|
ucmds_compare);
|
||||||
cl_rollspeed = Cvar_Get ("cl_rollspeed", "200", CVAR_NONE, "How quickly a player straightens out after strafing");
|
cl_rollspeed = Cvar_Get ("cl_rollspeed", "200", CVAR_NONE, "How quickly a player straightens out after strafing");
|
||||||
cl_rollangle = Cvar_Get ("cl_rollangle", "2", CVAR_NONE, "How much a player's screen tilts when strafing");
|
cl_rollangle = Cvar_Get ("cl_rollangle", "2", CVAR_NONE, "How much a player's screen tilts when strafing");
|
||||||
sv_spectalk = Cvar_Get ("sv_spectalk", "1", CVAR_NONE, "Toggles the ability of spectators to talk to players");
|
sv_spectalk = Cvar_Get ("sv_spectalk", "1", CVAR_NONE, "Toggles the ability of spectators to talk to players");
|
||||||
|
|
Loading…
Reference in a new issue