void Host_Status_f (void)
{
client_t *client;
- int seconds, minutes, hours = 0, j;
+ int seconds, minutes, hours = 0, j, players;
void (*print) (const char *fmt, ...);
if (cmd_source == src_command)
else
print = SV_ClientPrintf;
+ for (players = 0, j = 0;j < svs.maxclients;j++)
+ if (svs.clients[j].active)
+ players++;
print ("host: %s\n", Cvar_VariableString ("hostname"));
print ("version: %s build %s\n", gamename, buildstring);
- if (tcpipAvailable)
- print ("tcp/ip: %s\n", my_tcpip_address);
- if (ipxAvailable)
- print ("ipx: %s\n", my_ipx_address);
print ("map: %s\n", sv.name);
- print ("players: %i active (%i max)\n\n", net_activeconnections, svs.maxclients);
+ print ("players: %i active (%i max)\n\n", players, svs.maxclients);
for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++)
{
if (!client->active)
continue;
- seconds = (int)(net_time - client->netconnection->connecttime);
+ seconds = (int)(realtime - client->netconnection->connecttime);
minutes = seconds / 60;
if (minutes)
{
*/
void Host_Reconnect_f (void)
{
- SCR_BeginLoadingPlaque ();
+ SCR_BeginLoadingPlaque();
cls.signon = 0; // need new connection messages
}
*/
void Host_Connect_f (void)
{
- char name[MAX_QPATH];
-
- cls.demonum = -1; // stop demo loop in case this fails
- if (cls.demoplayback)
- CL_Disconnect ();
- strcpy (name, Cmd_Argv(1));
- CL_EstablishConnection (name);
- Host_Reconnect_f ();
+ CL_EstablishConnection(Cmd_Argv(1));
}
return;
}
- sprintf (sv_loadgame, "%s/%s", fs_gamedir, Cmd_Argv(1));
+ strcpy (sv_loadgame, Cmd_Argv(1));
FS_DefaultExtension (sv_loadgame, ".sav");
Con_Printf ("Loading game from %s...\n", sv_loadgame);
str = FS_Getline (f);
sscanf (str, "%f\n",&time);
- CL_Disconnect_f ();
-
SV_SpawnServer (mapname);
if (!sv.active)
{
else
{
// parse an edict
+ if (entnum >= MAX_EDICTS)
+ Host_Error("Host_PerformLoadGame: too many edicts in save file (reached MAX_EDICTS %i)\n", MAX_EDICTS);
+ while (entnum >= sv.max_edicts)
+ SV_IncreaseEdicts();
ent = EDICT_NUM(entnum);
memset (ent->v, 0, progs->entityfields * 4);
- ent->free = false;
+ ent->e->free = false;
ED_ParseEdict (start, ent);
// link it into the bsp tree
- if (!ent->free)
+ if (!ent->e->free)
SV_LinkEdict (ent, false);
}
for (i = 0;i < NUM_SPAWN_PARMS;i++)
svs.clients->spawn_parms[i] = spawn_parms[i];
- if (cls.state != ca_dedicated)
- {
- CL_EstablishConnection ("local");
- Host_Reconnect_f ();
- }
+ // 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))
+ CL_EstablishConnection("local");
}
//============================================================================
Host_Name_f
======================
*/
+cvar_t cl_name = {CVAR_SAVE, "_cl_name", "player"};
void Host_Name_f (void)
{
- char newName[64];
+ char newName[sizeof(host_client->name)];
if (Cmd_Argc () == 1)
{
}
if (Cmd_Argc () == 2)
- strncpy(newName, Cmd_Argv(1), 15);
+ strncpy(newName, Cmd_Argv(1), sizeof(host_client->name) - 1);
else
- strncpy(newName, Cmd_Args(), 15);
- newName[15] = 0;
+ strncpy(newName, Cmd_Args(), sizeof(host_client->name) - 1);
+ newName[sizeof(host_client->name) - 1] = 0;
if (cmd_source == src_command)
{
if (strcmp(host_client->name, newName) != 0)
Con_Printf ("%s renamed to %s\n", host_client->name, newName);
strcpy (host_client->name, newName);
- host_client->edict->v->netname = PR_SetString(host_client->name);
+ strcpy (host_client->old_name, newName);
+ sv_player->v->netname = PR_SetString(host_client->name);
// send notification to all clients
Host_Color_f
==================
*/
+cvar_t cl_color = {CVAR_SAVE, "_cl_color", "0"};
void Host_Color_f(void)
{
int top, bottom;
Con_DPrintf("Calling SV_ChangeTeam\n");
pr_global_struct->time = sv.time;
pr_globals[OFS_PARM0] = playercolor;
- pr_global_struct->self = EDICT_TO_PROG(host_client->edict);
+ pr_global_struct->self = EDICT_TO_PROG(sv_player);
PR_ExecuteProgram (SV_ChangeTeam, "");
}
else
{
+ eval_t *val;
+ if ((val = GETEDICTFIELDVALUE(sv_player, eval_clientcolors)))
+ val->_float = playercolor;
host_client->colors = playercolor;
- host_client->edict->v->team = bottom + 1;
+ host_client->old_colors = playercolor;
+ sv_player->v->team = bottom + 1;
// send notification to all clients
MSG_WriteByte (&sv.reliable_datagram, svc_updatecolors);
}
pr_global_struct->time = sv.time;
- pr_global_struct->self = EDICT_TO_PROG(sv_player);
+ pr_global_struct->self = EDICT_TO_PROG(host_client->edict);
PR_ExecuteProgram (pr_global_struct->ClientKill, "QC function ClientKill is missing");
}
}
}
+/*
+======================
+Host_PModel_f
+LordHavoc: only supported for Nehahra, I personally think this is dumb, but Mindcrime won't listen.
+======================
+*/
+cvar_t cl_pmodel = {CVAR_SAVE, "_cl_pmodel", "0"};
+static void Host_PModel_f (void)
+{
+ int i;
+ eval_t *val;
+
+ if (Cmd_Argc () == 1)
+ {
+ Con_Printf ("\"pmodel\" is \"%s\"\n", cl_pmodel.string);
+ return;
+ }
+ i = atoi(Cmd_Argv(1));
+
+ if (cmd_source == src_command)
+ {
+ if (cl_pmodel.integer == i)
+ return;
+ Cvar_SetValue ("_cl_pmodel", i);
+ if (cls.state == ca_connected)
+ Cmd_ForwardToServer ();
+ return;
+ }
+
+ host_client->pmodel = i;
+ if ((val = GETEDICTFIELDVALUE(sv_player, eval_pmodel)))
+ val->_float = i;
+}
+
//===========================================================================
*/
void Host_Spawn_f (void)
{
- int i;
- client_t *client;
- edict_t *ent;
+ int i;
+ client_t *client;
+ edict_t *ent;
func_t RestoreGame;
mfunction_t *f;
}
// LordHavoc: moved this above the QC calls at FrikaC's request
-// send all current names, colors, and frag counts
+ // send all current names, colors, and frag counts
SZ_Clear (&host_client->message);
-// run the entrance script
+ ent = sv_player;
+
+ // run the entrance script
if (sv.loadgame)
{
// loaded games are fully initialized already
}
else
{
- eval_t *val;
- // set up the edict
- ent = host_client->edict;
-
- memset (ent->v, 0, progs->entityfields * 4);
- ent->v->colormap = NUM_FOR_EDICT(ent);
- ent->v->team = (host_client->colors & 15) + 1;
- ent->v->netname = PR_SetString(host_client->name);
- if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_pmodel)))
- val->_float = host_client->pmodel;
-
// copy spawn parms out of the client_t
-
for (i=0 ; i< NUM_SPAWN_PARMS ; i++)
(&pr_global_struct->parm1)[i] = host_client->spawn_parms[i];
// call the spawn function
-
pr_global_struct->time = sv.time;
pr_global_struct->self = EDICT_TO_PROG(sv_player);
PR_ExecuteProgram (pr_global_struct->ClientConnect, "QC function ClientConnect is missing");
}
-// send time of update
+ // send time of update
MSG_WriteByte (&host_client->message, svc_time);
MSG_WriteFloat (&host_client->message, sv.time);
{
MSG_WriteByte (&host_client->message, svc_updatename);
MSG_WriteByte (&host_client->message, i);
- MSG_WriteString (&host_client->message, client->name);
+ MSG_WriteString (&host_client->message, client->old_name);
MSG_WriteByte (&host_client->message, svc_updatefrags);
MSG_WriteByte (&host_client->message, i);
MSG_WriteShort (&host_client->message, client->old_frags);
MSG_WriteByte (&host_client->message, svc_updatecolors);
MSG_WriteByte (&host_client->message, i);
- MSG_WriteByte (&host_client->message, client->colors);
+ MSG_WriteByte (&host_client->message, client->old_colors);
}
-// send all current light styles
+ // send all current light styles
for (i=0 ; i<MAX_LIGHTSTYLES ; i++)
{
MSG_WriteByte (&host_client->message, svc_lightstyle);
MSG_WriteString (&host_client->message, sv.lightstyles[i]);
}
-//
-// send some stats
-//
+ // send some stats
MSG_WriteByte (&host_client->message, svc_updatestat);
MSG_WriteByte (&host_client->message, STAT_TOTALSECRETS);
MSG_WriteLong (&host_client->message, pr_global_struct->total_secrets);
MSG_WriteByte (&host_client->message, STAT_MONSTERS);
MSG_WriteLong (&host_client->message, pr_global_struct->killed_monsters);
-// send a fixangle
-// Never send a roll angle, because savegames can catch the server
-// in a state where it is expecting the client to correct the angle
-// and it won't happen if the game was just loaded, so you wind up
-// with a permanent head tilt
- ent = EDICT_NUM( 1 + (host_client - svs.clients) );
+ // send a fixangle
+ // Never send a roll angle, because savegames can catch the server
+ // in a state where it is expecting the client to correct the angle
+ // and it won't happen if the game was just loaded, so you wind up
+ // with a permanent head tilt
MSG_WriteByte (&host_client->message, svc_setangle);
for (i=0 ; i < 2 ; i++)
MSG_WriteAngle (&host_client->message, ent->v->angles[i] );
SV_ClientPrintf ("Kicked by %s: %s\n", who, message);
else
SV_ClientPrintf ("Kicked by %s\n", who);
- SV_DropClient (false);
+ SV_DropClient (false); // kicked
}
host_client = save;
Con_Printf ("Max %i demos in demoloop\n", MAX_DEMOS);
c = MAX_DEMOS;
}
- Con_Printf ("%i demo(s) in loop\n", c);
+ Con_DPrintf ("%i demo(s) in loop\n", c);
for (i=1 ; i<c+1 ; i++)
strncpy (cls.demos[i-1], Cmd_Argv(i), sizeof(cls.demos[0])-1);
+ // LordHavoc: clear the remaining slots
+ for (;i <= MAX_DEMOS;i++)
+ cls.demos[i-1][0] = 0;
+
if (!sv.active && cls.demonum != -1 && !cls.demoplayback)
{
cls.demonum = 0;
Host_PerformLoadGame(sv_loadgame);
else if (sv_spawnmap[0])
SV_SpawnServer(sv_spawnmap);
- if (sv.active && cls.state == ca_disconnected)
- Cmd_ExecuteString ("connect local", src_command);
sv_loadgame[0] = 0;
sv_spawnmap[0] = 0;
+ if (sv.active && cls.state == ca_disconnected)
+ Cmd_ExecuteString ("connect local", src_command);
}
//=============================================================================
Cmd_AddCommand ("changelevel", Host_Changelevel_f);
Cmd_AddCommand ("connect", Host_Connect_f);
Cmd_AddCommand ("reconnect", Host_Reconnect_f);
- Cmd_AddCommand ("name", Host_Name_f);
Cmd_AddCommand ("version", Host_Version_f);
Cmd_AddCommand ("say", Host_Say_f);
Cmd_AddCommand ("say_team", Host_Say_Team_f);
Cmd_AddCommand ("tell", Host_Tell_f);
- Cmd_AddCommand ("color", Host_Color_f);
Cmd_AddCommand ("kill", Host_Kill_f);
Cmd_AddCommand ("pause", Host_Pause_f);
- Cmd_AddCommand ("spawn", Host_Spawn_f);
- Cmd_AddCommand ("begin", Host_Begin_f);
- Cmd_AddCommand ("prespawn", Host_PreSpawn_f);
Cmd_AddCommand ("kick", Host_Kick_f);
Cmd_AddCommand ("ping", Host_Ping_f);
Cmd_AddCommand ("load", Host_Loadgame_f);
Cmd_AddCommand ("viewframe", Host_Viewframe_f);
Cmd_AddCommand ("viewnext", Host_Viewnext_f);
Cmd_AddCommand ("viewprev", Host_Viewprev_f);
+
+ Cvar_RegisterVariable (&cl_name);
+ Cmd_AddCommand ("name", Host_Name_f);
+ Cvar_RegisterVariable (&cl_color);
+ Cmd_AddCommand ("color", Host_Color_f);
+ if (gamemode == GAME_NEHAHRA)
+ {
+ Cvar_RegisterVariable (&cl_pmodel);
+ Cmd_AddCommand ("pmodel", Host_PModel_f);
+ }
+ Cmd_AddCommand ("prespawn", Host_PreSpawn_f);
+ Cmd_AddCommand ("spawn", Host_Spawn_f);
+ Cmd_AddCommand ("begin", Host_Begin_f);
}