Sys_Quit (0);
}
-
/*
==================
Host_Status_f
print ("version: %s build %s\n", gamename, buildstring);
print ("protocol: %i (%s)\n", Protocol_NumberForEnum(sv.protocol), Protocol_NameForEnum(sv.protocol));
print ("map: %s\n", sv.name);
+ print ("timing: %s\n", Host_TimingReport());
print ("players: %i active (%i max)\n\n", players, svs.maxclients);
for (j = 0, client = svs.clients;j < svs.maxclients;j++, client++)
{
#define SAVEGAME_VERSION 5
-/*
-===============
-Host_SavegameComment
-
-Writes a SAVEGAME_COMMENT_LENGTH character comment describing the current
-===============
-*/
-void Host_SavegameComment (char *text)
-{
- int i;
- char kills[20];
-
- for (i=0 ; i<SAVEGAME_COMMENT_LENGTH ; i++)
- text[i] = ' ';
- // LordHavoc: added min() to prevent overflow
- memcpy (text, cl.levelname, min(strlen(cl.levelname), SAVEGAME_COMMENT_LENGTH));
- sprintf (kills,"kills:%3i/%3i", cl.stats[STAT_MONSTERS], cl.stats[STAT_TOTALMONSTERS]);
- memcpy (text+22, kills, strlen(kills));
- // convert space to _ to make stdio happy
- // LordHavoc: convert control characters to _ as well
- for (i=0 ; i<SAVEGAME_COMMENT_LENGTH ; i++)
- if (text[i] <= ' ')
- text[i] = '_';
- text[SAVEGAME_COMMENT_LENGTH] = '\0';
-}
-
-
/*
===============
Host_Savegame_f
int i;
char comment[SAVEGAME_COMMENT_LENGTH+1];
- if (cls.state != ca_connected || !sv.active)
+ if (!sv.active)
{
- Con_Print("Not playing a local game.\n");
+ Con_Print("Can't save - no server running.\n");
return;
}
- if (cl.intermission)
+ if (cl.islocalgame)
{
- Con_Print("Can't save in intermission.\n");
- return;
- }
+ // singleplayer checks
+ if (cl.intermission)
+ {
+ Con_Print("Can't save in intermission.\n");
+ return;
+ }
- for (i = 0;i < svs.maxclients;i++)
- {
- if (svs.clients[i].active)
+ if (svs.clients[0].active && svs.clients[0].edict->fields.server->deadflag)
{
- if (i > 0)
- {
- Con_Print("Can't save multiplayer games.\n");
- return;
- }
- if (svs.clients[i].edict->fields.server->deadflag)
- {
- Con_Print("Can't savegame with a dead player\n");
- return;
- }
+ Con_Print("Can't savegame with a dead player\n");
+ return;
}
}
+ else
+ Con_Print("Warning: saving a multiplayer game may have strange results when restored (to properly resume, all players must join in the same player slots and then the game can be reloaded).\n");
if (Cmd_Argc() != 2)
{
return;
}
+ SV_VM_Begin();
+
FS_Printf(f, "%i\n", SAVEGAME_VERSION);
- Host_SavegameComment (comment);
+
+ memset(comment, 0, sizeof(comment));
+ sprintf(comment, "%-21s kills:%3i/%3i", PRVM_GetString(prog->edicts->fields.server->message), (int)prog->globals.server->killed_monsters, (int)prog->globals.server->total_monsters);
+ // convert space to _ to make stdio happy
+ // LordHavoc: convert control characters to _ as well
+ for (i=0 ; i<SAVEGAME_COMMENT_LENGTH ; i++)
+ if (comment[i] <= ' ')
+ comment[i] = '_';
+ comment[SAVEGAME_COMMENT_LENGTH] = '\0';
+
FS_Printf(f, "%s\n", comment);
for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
FS_Printf(f, "%f\n", svs.clients[0].spawn_parms[i]);
FS_Print(f,"m\n");
}
- SV_VM_Begin();
-
PRVM_ED_WriteGlobals (f);
for (i=0 ; i<prog->num_edicts ; i++)
PRVM_ED_Write (f, PRVM_EDICT_NUM(i));
SV_VM_End();
// make sure we're connected to loopback
- if (cls.state == ca_disconnected || !(cls.state == ca_connected && cls.netcon != NULL && LHNETADDRESS_GetAddressType(&cls.netcon->peeraddress) == LHNETADDRESSTYPE_LOOP))
+ if (sv.active && cls.state == ca_disconnected)
CL_EstablishConnection("local:1");
}
else
strlcpy (newName, Cmd_Args(), sizeof (newName));
- for (i = 0, j = 0;newName[i];i++)
- if (newName[i] != '\r' && newName[i] != '\n')
- newName[j++] = newName[i];
- newName[j] = 0;
-
if (cmd_source == src_command)
{
Cvar_Set ("_cl_name", newName);
// point the string back at updateclient->name to keep it safe
strlcpy (host_client->name, newName, sizeof (host_client->name));
+ for (i = 0, j = 0;host_client->name[i];i++)
+ if (host_client->name[i] != '\r' && host_client->name[i] != '\n')
+ host_client->name[j++] = host_client->name[i];
+ host_client->name[j] = 0;
+
COM_StringLengthNoColors(host_client->name, 0, &valid_colors);
if(!valid_colors) // NOTE: this also proves the string is not empty, as "" is a valid colored string
{
SZ_Write (&host_client->netconnection->message, sv.signon.data, sv.signon.cursize);
MSG_WriteByte (&host_client->netconnection->message, svc_signonnum);
MSG_WriteByte (&host_client->netconnection->message, 2);
- host_client->sendsignon = true; // send this message, this will be cleared later
+ host_client->sendsignon = 0; // enable unlimited sends again
}
// reset the name change timer because the client will send name soon
MSG_WriteByte (&host_client->netconnection->message, svc_signonnum);
MSG_WriteByte (&host_client->netconnection->message, 3);
- host_client->sendsignon = true; // send this message, this will be cleared later
}
/*