*/
#include "quakedef.h"
-#include "libcurl.h"
int current_skill;
cvar_t sv_cheats = {0, "sv_cheats", "0", "enables cheat commands in any game, and cheat impulses in dpmod"};
+cvar_t sv_adminnick = {CVAR_SAVE, "sv_adminnick", "", "nick name to use for admin messages instead of host name"};
cvar_t rcon_password = {CVAR_PRIVATE, "rcon_password", "", "password to authenticate rcon commands"};
cvar_t rcon_address = {0, "rcon_address", "", "server address to send rcon commands to (when not connected to a server)"};
cvar_t team = {CVAR_USERINFO | CVAR_SAVE, "team", "none", "QW team (4 character limit, example: blue)"};
*/
void Host_God_f (void)
{
- if (cmd_source == src_command)
- {
- Cmd_ForwardToServer ();
- return;
- }
-
if (!allowcheats)
{
SV_ClientPrint("No cheats allowed, use sv_cheats 1 and restart level to enable.\n");
void Host_Notarget_f (void)
{
- if (cmd_source == src_command)
- {
- Cmd_ForwardToServer ();
- return;
- }
-
if (!allowcheats)
{
SV_ClientPrint("No cheats allowed, use sv_cheats 1 and restart level to enable.\n");
void Host_Noclip_f (void)
{
- if (cmd_source == src_command)
- {
- Cmd_ForwardToServer ();
- return;
- }
-
if (!allowcheats)
{
SV_ClientPrint("No cheats allowed, use sv_cheats 1 and restart level to enable.\n");
*/
void Host_Fly_f (void)
{
- if (cmd_source == src_command)
- {
- Cmd_ForwardToServer ();
- return;
- }
-
if (!allowcheats)
{
SV_ClientPrint("No cheats allowed, use sv_cheats 1 and restart level to enable.\n");
{
if (!client->active)
continue;
- print("%4i %s\n", (int)floor(client->ping*1000+0.5), client->name);
+ print("%4i %s\n", bound(0, (int)floor(client->ping*1000+0.5), 9999), client->name);
}
// now call the Pings command also, which will send a report that contains packet loss for the scoreboard (as well as a simpler ping report)
return;
}
- if (cmd_source != src_command)
- return;
-
cls.demonum = -1; // stop demo loop in case this fails
CL_Disconnect ();
svs.serverflags = 0; // haven't completed an episode yet
allowcheats = sv_cheats.integer != 0;
- strcpy(level, Cmd_Argv(1));
+ strlcpy(level, Cmd_Argv(1), sizeof(level));
SV_SpawnServer(level);
if (sv.active && cls.state == ca_disconnected)
CL_EstablishConnection("local:1");
Host_Map_f();
return;
}
- if (cmd_source != src_command)
- return;
// remove menu
key_dest = key_game;
SV_SaveSpawnparms ();
SV_VM_End();
allowcheats = sv_cheats.integer != 0;
- strcpy(level, Cmd_Argv(1));
+ strlcpy(level, Cmd_Argv(1), sizeof(level));
SV_SpawnServer(level);
if (sv.active && cls.state == ca_disconnected)
CL_EstablishConnection("local:1");
Con_Print("Only the server may restart\n");
return;
}
- if (cmd_source != src_command)
- return;
// remove menu
key_dest = key_game;
allowcheats = sv_cheats.integer != 0;
- strcpy(mapname, sv.name);
+ strlcpy(mapname, sv.name, sizeof(mapname));
SV_SpawnServer(mapname);
if (sv.active && cls.state == ca_disconnected)
CL_EstablishConnection("local:1");
int i;
char comment[SAVEGAME_COMMENT_LENGTH+1];
- if (cmd_source != src_command)
- return;
-
if (cls.state != ca_connected || !sv.active)
{
Con_Print("Not playing a local game.\n");
int version;
float spawn_parms[NUM_SPAWN_PARMS];
- if (cmd_source != src_command)
- return;
-
if (Cmd_Argc() != 2)
{
Con_Print("load <savename> : load a game\n");
return;
}
- strcpy (filename, Cmd_Argv(1));
+ strlcpy (filename, Cmd_Argv(1), sizeof(filename));
FS_DefaultExtension (filename, ".sav", sizeof (filename));
Con_Printf("Loading game from %s...\n", filename);
// mapname
COM_ParseTokenConsole(&t);
- strcpy (mapname, com_token);
+ strlcpy (mapname, com_token, sizeof(mapname));
// time
COM_ParseTokenConsole(&t);
{
if (host_client->spawned)
SV_BroadcastPrintf("%s changed name to %s\n", host_client->old_name, host_client->name);
- strcpy(host_client->old_name, host_client->name);
+ strlcpy(host_client->old_name, host_client->name, sizeof(host_client->old_name));
// send notification to all clients
MSG_WriteByte (&sv.reliable_datagram, svc_updatename);
MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients);
PRVM_GETEDICTFIELDVALUE(host_client->edict, eval_playermodel)->string = PRVM_SetEngineString(host_client->playermodel);
if (strcmp(host_client->old_model, host_client->playermodel))
{
- strcpy(host_client->old_model, host_client->playermodel);
+ strlcpy(host_client->old_model, host_client->playermodel, sizeof(host_client->old_model));
/*// send notification to all clients
MSG_WriteByte (&sv.reliable_datagram, svc_updatepmodel);
MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients);
{
//if (host_client->spawned)
// SV_BroadcastPrintf("%s changed skin to %s\n", host_client->name, host_client->playerskin);
- strcpy(host_client->old_skin, host_client->playerskin);
+ strlcpy(host_client->old_skin, host_client->playerskin, sizeof(host_client->old_skin));
/*// send notification to all clients
MSG_WriteByte (&sv.reliable_datagram, svc_updatepskin);
MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients);
// note this uses the chat prefix \001
if (!fromServer)
dpsnprintf (text, sizeof(text), "\001%s" STRING_COLOR_DEFAULT_STR ": %s", host_client->name, p1);
+ else if(*(sv_adminnick.string))
+ dpsnprintf (text, sizeof(text), "\001<%s" STRING_COLOR_DEFAULT_STR "> %s", sv_adminnick.string, p1);
else
dpsnprintf (text, sizeof(text), "\001<%s" STRING_COLOR_DEFAULT_STR "> %s", hostname.string, p1);
p2 = text + strlen(text);
// note: save is not a valid edict if fromServer is true
save = host_client;
for (j = 0, host_client = svs.clients;j < svs.maxclients;j++, host_client++)
- if (host_client->spawned && (!teamonly || host_client->edict->fields.server->team == save->edict->fields.server->team))
+ if (host_client->active && (!teamonly || host_client->edict->fields.server->team == save->edict->fields.server->team))
SV_ClientPrint(text);
host_client = save;
void Host_Tell_f(void)
{
+ const char *playername_start = NULL;
+ size_t playername_length = 0;
+ int playernumber = 0;
client_t *save;
int j;
const char *p1, *p2;
}
}
- if (Cmd_Argc () < 3)
+ if (Cmd_Argc () < 2)
return;
// note this uses the chat prefix \001
if (!fromServer)
sprintf (text, "\001%s tells you: ", host_client->name);
+ else if(*(sv_adminnick.string))
+ sprintf (text, "\001<%s tells you> ", sv_adminnick.string);
else
sprintf (text, "\001<%s tells you> ", hostname.string);
p1 = Cmd_Args();
p2 = p1 + strlen(p1);
// remove the target name
- while (p1 < p2 && *p1 != ' ')
+ while (p1 < p2 && *p1 == ' ')
p1++;
+ if(*p1 == '#')
+ {
+ ++p1;
+ while (p1 < p2 && *p1 == ' ')
+ p1++;
+ while (p1 < p2 && isdigit(*p1))
+ {
+ playernumber = playernumber * 10 + (*p1 - '0');
+ p1++;
+ }
+ --playernumber;
+ }
+ else if(*p1 == '"')
+ {
+ ++p1;
+ playername_start = p1;
+ while (p1 < p2 && *p1 != '"')
+ p1++;
+ playername_length = p1 - playername_start;
+ if(p1 < p2)
+ p1++;
+ }
+ else
+ {
+ playername_start = p1;
+ while (p1 < p2 && *p1 != ' ')
+ p1++;
+ playername_length = p1 - playername_start;
+ }
while (p1 < p2 && *p1 == ' ')
p1++;
+ if(playername_start)
+ {
+ // set playernumber to the right client
+ char namebuf[128];
+ if(playername_length >= sizeof(namebuf))
+ {
+ if (fromServer)
+ Con_Print("Host_Tell: too long player name/ID\n");
+ else
+ SV_ClientPrint("Host_Tell: too long player name/ID\n");
+ return;
+ }
+ memcpy(namebuf, playername_start, playername_length);
+ namebuf[playername_length] = 0;
+ for (playernumber = 0; playernumber < svs.maxclients; playernumber++)
+ {
+ if (!svs.clients[playernumber].active)
+ continue;
+ if (strcasecmp(svs.clients[playernumber].name, namebuf) == 0)
+ break;
+ }
+ }
+ if(playernumber < 0 || playernumber >= svs.maxclients || !(svs.clients[playernumber].active))
+ {
+ if (fromServer)
+ Con_Print("Host_Tell: invalid player name/ID\n");
+ else
+ SV_ClientPrint("Host_Tell: invalid player name/ID\n");
+ return;
+ }
// remove trailing newlines
while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r'))
p2--;
}
while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r'))
p2--;
+ if(p1 == p2)
+ return; // empty say
for (j = (int)strlen(text);j < (int)(sizeof(text) - 2) && p1 < p2;)
text[j++] = *p1++;
text[j++] = '\n';
text[j++] = 0;
save = host_client;
- for (j = 0, host_client = svs.clients;j < svs.maxclients;j++, host_client++)
- if (host_client->spawned && !strcasecmp(host_client->name, Cmd_Argv(1)))
- SV_ClientPrint(text);
+ host_client = svs.clients + playernumber;
+ SV_ClientPrint(text);
host_client = save;
}
if (Cmd_Argc() != 2)
{
Con_Printf("\"rate\" is \"%i\"\n", cl_rate.integer);
- Con_Print("rate <500-25000>\n");
+ Con_Print("rate <bytespersecond>\n");
return;
}
if (cmd_source == src_command)
{
- Cvar_SetValue ("_cl_rate", bound(NET_MINRATE, rate, NET_MAXRATE));
+ Cvar_SetValue ("_cl_rate", max(NET_MINRATE, rate));
CL_SetInfo("rate", va("%i", rate), true, false, false, false);
return;
}
*/
void Host_Kill_f (void)
{
- if (cmd_source == src_command)
- {
- Cmd_ForwardToServer ();
- return;
- }
-
if (host_client->edict->fields.server->health <= 0)
{
SV_ClientPrint("Can't suicide -- already dead!\n");
*/
void Host_Pause_f (void)
{
-
- if (cmd_source == src_command)
- {
- Cmd_ForwardToServer ();
- return;
- }
if (!pausable.integer)
SV_ClientPrint("Pause not allowed.\n");
else
*/
void Host_PreSpawn_f (void)
{
- if (cmd_source == src_command)
- {
- Con_Print("prespawn is not valid from the console\n");
- return;
- }
-
if (host_client->spawned)
{
Con_Print("prespawn not valid -- already spawned\n");
mfunction_t *f;
int stats[MAX_CL_STATS];
- if (cmd_source == src_command)
- {
- Con_Print("spawn is not valid from the console\n");
- return;
- }
-
if (host_client->spawned)
{
Con_Print("Spawn not valid -- already spawned\n");
*/
void Host_Begin_f (void)
{
- if (cmd_source == src_command)
- {
- Con_Print("begin is not valid from the console\n");
- return;
- }
-
- Curl_SendRequirements();
-
host_client->spawned = true;
}
int i;
qboolean byNumber = false;
- if (cmd_source != src_command || !sv.active)
+ if (!sv.active)
return;
SV_VM_Begin();
int v;
prvm_eval_t *val;
- if (cmd_source == src_command)
- {
- Cmd_ForwardToServer ();
- return;
- }
-
if (!allowcheats)
{
SV_ClientPrint("No cheats allowed, use sv_cheats 1 and restart level to enable.\n");
int i, j, ping, packetloss;
char temp[128];
- if (cmd_source == src_command)
- {
- Cmd_ForwardToServer ();
- return;
- }
if (!host_client->netconnection)
return;
{
dpsnprintf(cls.userinfo, sizeof(cls.userinfo), "\\name\\player\\team\\none\\topcolor\\0\\bottomcolor\\0\\rate\\10000\\msg\\1\\noaim\\1\\*ver\\%s", engineversion);
- Cmd_AddCommand ("status", Host_Status_f, "print server status information");
+ Cmd_AddCommand_WithClientCommand ("status", Host_Status_f, Host_Status_f, "print server status information");
Cmd_AddCommand ("quit", Host_Quit_f, "quit the game");
if (gamemode == GAME_NEHAHRA)
{
- Cmd_AddCommand ("max", Host_God_f, "god mode (invulnerability)");
- Cmd_AddCommand ("monster", Host_Notarget_f, "notarget mode (monsters do not see you)");
- Cmd_AddCommand ("scrag", Host_Fly_f, "fly mode (flight)");
- Cmd_AddCommand ("wraith", Host_Noclip_f, "noclip mode (flight without collisions, move through walls)");
- Cmd_AddCommand ("gimme", Host_Give_f, "alter inventory");
+ Cmd_AddCommand_WithClientCommand ("max", NULL, Host_God_f, "god mode (invulnerability)");
+ Cmd_AddCommand_WithClientCommand ("monster", NULL, Host_Notarget_f, "notarget mode (monsters do not see you)");
+ Cmd_AddCommand_WithClientCommand ("scrag", NULL, Host_Fly_f, "fly mode (flight)");
+ Cmd_AddCommand_WithClientCommand ("wraith", NULL, Host_Noclip_f, "noclip mode (flight without collisions, move through walls)");
+ Cmd_AddCommand_WithClientCommand ("gimme", NULL, Host_Give_f, "alter inventory");
}
else
{
- Cmd_AddCommand ("god", Host_God_f, "god mode (invulnerability)");
- Cmd_AddCommand ("notarget", Host_Notarget_f, "notarget mode (monsters do not see you)");
- Cmd_AddCommand ("fly", Host_Fly_f, "fly mode (flight)");
- Cmd_AddCommand ("noclip", Host_Noclip_f, "noclip mode (flight without collisions, move through walls)");
- Cmd_AddCommand ("give", Host_Give_f, "alter inventory");
+ Cmd_AddCommand_WithClientCommand ("god", NULL, Host_God_f, "god mode (invulnerability)");
+ Cmd_AddCommand_WithClientCommand ("notarget", NULL, Host_Notarget_f, "notarget mode (monsters do not see you)");
+ Cmd_AddCommand_WithClientCommand ("fly", NULL, Host_Fly_f, "fly mode (flight)");
+ Cmd_AddCommand_WithClientCommand ("noclip", NULL, Host_Noclip_f, "noclip mode (flight without collisions, move through walls)");
+ Cmd_AddCommand_WithClientCommand ("give", NULL, Host_Give_f, "alter inventory");
}
Cmd_AddCommand ("map", Host_Map_f, "kick everyone off the server and start a new level");
Cmd_AddCommand ("restart", Host_Restart_f, "restart current level");
Cmd_AddCommand ("connect", Host_Connect_f, "connect to a server by IP address or hostname");
Cmd_AddCommand ("reconnect", Host_Reconnect_f, "reset signon level in preparation for a new level (do not use)");
Cmd_AddCommand ("version", Host_Version_f, "print engine version");
- Cmd_AddCommand ("say", Host_Say_f, "send a chat message to everyone on the server");
- Cmd_AddCommand ("say_team", Host_Say_Team_f, "send a chat message to your team on the server");
- Cmd_AddCommand ("tell", Host_Tell_f, "send a chat message to only one person on the server");
- Cmd_AddCommand ("kill", Host_Kill_f, "die instantly");
- Cmd_AddCommand ("pause", Host_Pause_f, "pause the game (if the server allows pausing)");
+ Cmd_AddCommand_WithClientCommand ("say", Host_Say_f, Host_Say_f, "send a chat message to everyone on the server");
+ Cmd_AddCommand_WithClientCommand ("say_team", Host_Say_Team_f, Host_Say_Team_f, "send a chat message to your team on the server");
+ Cmd_AddCommand_WithClientCommand ("tell", Host_Tell_f, Host_Tell_f, "send a chat message to only one person on the server");
+ Cmd_AddCommand_WithClientCommand ("kill", NULL, Host_Kill_f, "die instantly");
+ Cmd_AddCommand_WithClientCommand ("pause", NULL, Host_Pause_f, "pause the game (if the server allows pausing)");
Cmd_AddCommand ("kick", Host_Kick_f, "kick a player off the server by number or name");
- Cmd_AddCommand ("ping", Host_Ping_f, "print ping times of all players on the server");
+ Cmd_AddCommand_WithClientCommand ("ping", Host_Ping_f, Host_Ping_f, "print ping times of all players on the server");
Cmd_AddCommand ("load", Host_Loadgame_f, "load a saved game file");
Cmd_AddCommand ("save", Host_Savegame_f, "save the game to a file");
Cmd_AddCommand ("viewprev", Host_Viewprev_f, "change to previous animation frame of viewthing entity in current level");
Cvar_RegisterVariable (&cl_name);
- Cmd_AddCommand ("name", Host_Name_f, "change your player name");
+ Cmd_AddCommand_WithClientCommand ("name", Host_Name_f, Host_Name_f, "change your player name");
Cvar_RegisterVariable (&cl_color);
- Cmd_AddCommand ("color", Host_Color_f, "change your player shirt and pants colors");
+ Cmd_AddCommand_WithClientCommand ("color", Host_Color_f, Host_Color_f, "change your player shirt and pants colors");
Cvar_RegisterVariable (&cl_rate);
- Cmd_AddCommand ("rate", Host_Rate_f, "change your network connection speed");
+ Cmd_AddCommand_WithClientCommand ("rate", Host_Rate_f, Host_Rate_f, "change your network connection speed");
if (gamemode == GAME_NEHAHRA)
{
Cvar_RegisterVariable (&cl_pmodel);
- Cmd_AddCommand ("pmodel", Host_PModel_f, "change your player model choice (Nehahra specific)");
+ Cmd_AddCommand_WithClientCommand ("pmodel", Host_PModel_f, Host_PModel_f, "change your player model choice (Nehahra specific)");
}
// BLACK: This isnt game specific anymore (it was GAME_NEXUIZ at first)
Cvar_RegisterVariable (&cl_playermodel);
- Cmd_AddCommand ("playermodel", Host_Playermodel_f, "change your player model");
+ Cmd_AddCommand_WithClientCommand ("playermodel", Host_Playermodel_f, Host_Playermodel_f, "change your player model");
Cvar_RegisterVariable (&cl_playerskin);
- Cmd_AddCommand ("playerskin", Host_Playerskin_f, "change your player skin number");
+ Cmd_AddCommand_WithClientCommand ("playerskin", Host_Playerskin_f, Host_Playerskin_f, "change your player skin number");
- Cmd_AddCommand ("prespawn", Host_PreSpawn_f, "signon 1 (client acknowledges that server information has been received)");
- Cmd_AddCommand ("spawn", Host_Spawn_f, "signon 2 (client has sent player information, and is asking server to send scoreboard rankings)");
- Cmd_AddCommand ("begin", Host_Begin_f, "signon 3 (client asks server to start sending entities, and will go to signon 4 (playing) when the first entity update is received)");
+ Cmd_AddCommand_WithClientCommand ("prespawn", NULL, Host_PreSpawn_f, "signon 1 (client acknowledges that server information has been received)");
+ Cmd_AddCommand_WithClientCommand ("spawn", NULL, Host_Spawn_f, "signon 2 (client has sent player information, and is asking server to send scoreboard rankings)");
+ Cmd_AddCommand_WithClientCommand ("begin", NULL, Host_Begin_f, "signon 3 (client asks server to start sending entities, and will go to signon 4 (playing) when the first entity update is received)");
Cmd_AddCommand ("maxplayers", MaxPlayers_f, "sets limit on how many players (or bots) may be connected to the server at once");
Cmd_AddCommand ("sendcvar", Host_SendCvar_f, "sends the value of a cvar to the server as a sentcvar command, for use by QuakeC"); // By [515]
Cmd_AddCommand ("topcolor", Host_TopColor_f, "QW command to set top color without changing bottom color");
Cmd_AddCommand ("bottomcolor", Host_BottomColor_f, "QW command to set bottom color without changing top color");
- Cmd_AddCommand ("pings", Host_Pings_f, "command sent by clients to request updated ping and packetloss of players on scoreboard (originally from QW, but also used on NQ servers)");
+ Cmd_AddCommand_WithClientCommand ("pings", NULL, Host_Pings_f, "command sent by clients to request updated ping and packetloss of players on scoreboard (originally from QW, but also used on NQ servers)");
Cmd_AddCommand ("pingplreport", Host_PingPLReport_f, "command sent by server containing client ping and packet loss values for scoreboard, triggered by pings command from client (not used by QW servers)");
Cvar_RegisterVariable (&team);
Cvar_RegisterVariable (&noaim);
Cvar_RegisterVariable(&sv_cheats);
+ Cvar_RegisterVariable(&sv_adminnick);
}