X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=host_cmd.c;h=3e74ef72c526d120b9640cdd8deac2b21262eda5;hb=db5f3e863cc3bd5595e8b87400dcddd2525a8eea;hp=6ef5247ef74a8a5a9c7c85d1e11d3e9210aa034d;hpb=8cdf09b2c1c4713344cdcb19f5e89f9426b8e7cf;p=xonotic%2Fdarkplaces.git diff --git a/host_cmd.c b/host_cmd.c index 6ef5247e..3e74ef72 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -21,9 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" int current_skill; -char sv_spawnmap[MAX_QPATH]; -char sv_loadgame[MAX_OSPATH]; - cvar_t sv_cheats = {0, "sv_cheats", "0"}; qboolean allowcheats = false; @@ -69,16 +66,16 @@ void Host_Status_f (void) else print = SV_ClientPrintf; - for (players = 0, j = 0;j < MAX_SCOREBOARD;j++) - if (svs.connectedclients[j]) + 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); print ("map: %s\n", sv.name); - print ("players: %i active (%i max)\n\n", players, min(sv_maxplayers.integer, MAX_SCOREBOARD)); - for (j = 0;j < MAX_SCOREBOARD;j++) + print ("players: %i active (%i max)\n\n", players, svs.maxclients); + for (j = 0, client = svs.clients;j < svs.maxclients;j++, client++) { - if (!(client = svs.connectedclients[j])) + if (!client->active) continue; seconds = (int)(realtime - client->netconnection->connecttime); minutes = seconds / 60; @@ -241,9 +238,9 @@ void Host_Ping_f (void) } SV_ClientPrintf ("Client ping times:\n"); - for (i = 0;i < MAX_SCOREBOARD;i++) + for (i = 0, client = svs.clients;i < svs.maxclients;i++, client++) { - if (!(client = svs.connectedclients[i])) + if (!client->active) continue; total = 0; for (j=0 ; j : continue game on a new level\n"); @@ -310,9 +312,11 @@ void Host_Changelevel_f (void) return; } SV_SaveSpawnparms (); - strcpy (sv_spawnmap, Cmd_Argv(1)); - if (host_initialized) - Host_PerformSpawnServerAndLoadGame(); + allowcheats = sv_cheats.integer != 0; + strcpy(level, Cmd_Argv(1)); + SV_SpawnServer(level); + if (sv.active && cls.state == ca_disconnected) + CL_EstablishConnection("local:1"); } /* @@ -324,14 +328,18 @@ Restarts the current server for a dead player */ void Host_Restart_f (void) { + char mapname[MAX_QPATH]; + if (cls.demoplayback || !sv.active) return; if (cmd_source != src_command) return; - strcpy (sv_spawnmap, sv.name); - if (host_initialized) - Host_PerformSpawnServerAndLoadGame(); + allowcheats = sv_cheats.integer != 0; + strcpy(mapname, sv.name); + SV_SpawnServer(mapname); + if (sv.active && cls.state == ca_disconnected) + CL_EstablishConnection("local:1"); } /* @@ -411,7 +419,7 @@ void Host_Savegame_f (void) if (cmd_source != src_command) return; - if (!sv.active) + if (cls.state != ca_connected || !sv.active) { Con_Printf ("Not playing a local game.\n"); return; @@ -423,16 +431,16 @@ void Host_Savegame_f (void) return; } - for (i = 0;i < MAX_SCOREBOARD;i++) + for (i = 0;i < svs.maxclients;i++) { - if (svs.connectedclients[i]) + if (svs.clients[i].active) { if (i > 0) { Con_Printf("Can't save multiplayer games.\n"); return; } - if (svs.connectedclients[i]->edict->v->deadflag) + if (svs.clients[i].edict->v->deadflag) { Con_Printf("Can't savegame with a dead player\n"); return; @@ -452,9 +460,8 @@ void Host_Savegame_f (void) return; } - strncpy (name, Cmd_Argv(1), sizeof (name) - 1); - name[sizeof (name) - 1] = '\0'; - FS_DefaultExtension (name, ".sav"); + strlcpy (name, Cmd_Argv(1), sizeof (name)); + FS_DefaultExtension (name, ".sav", sizeof (name)); Con_Printf ("Saving game to %s...\n", name); f = FS_Open (name, "w", false); @@ -468,7 +475,7 @@ void Host_Savegame_f (void) Host_SavegameComment (comment); FS_Printf (f, "%s\n", comment); for (i=0 ; ispawn_parms[i]); + FS_Printf (f, "%f\n", svs.clients[0].spawn_parms[i]); FS_Printf (f, "%d\n", current_skill); FS_Printf (f, "%s\n", sv.name); FS_Printf (f, "%f\n",sv.time); @@ -503,25 +510,9 @@ Host_Loadgame_f =============== */ void Host_Loadgame_f (void) -{ - if (cmd_source != src_command) - return; - - if (Cmd_Argc() != 2) - { - Con_Printf ("load : load a game\n"); - return; - } - - strcpy (sv_loadgame, Cmd_Argv(1)); - FS_DefaultExtension (sv_loadgame, ".sav"); - - Con_Printf ("Loading game from %s...\n", sv_loadgame); -} - -void Host_PerformLoadGame(char *name) { qfile_t *f; + char filename[MAX_QPATH]; char mapname[MAX_QPATH]; float time, tfloat; char buf[32768]; @@ -533,9 +524,23 @@ void Host_PerformLoadGame(char *name) int version; float spawn_parms[NUM_SPAWN_PARMS]; + if (cmd_source != src_command) + return; + + if (Cmd_Argc() != 2) + { + Con_Printf ("load : load a game\n"); + return; + } + + strcpy (filename, Cmd_Argv(1)); + FS_DefaultExtension (filename, ".sav", sizeof (filename)); + + Con_Printf ("Loading game from %s...\n", filename); + cls.demonum = -1; // stop demo loop in case this fails - f = FS_Open (name, "r", false); + f = FS_Open (filename, "r", false); if (!f) { Con_Printf ("ERROR: couldn't open.\n"); @@ -649,11 +654,11 @@ void Host_PerformLoadGame(char *name) FS_Close (f); for (i = 0;i < NUM_SPAWN_PARMS;i++) - svs.connectedclients[0]->spawn_parms[i] = spawn_parms[i]; + svs.clients[0].spawn_parms[i] = spawn_parms[i]; // 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"); + CL_EstablishConnection("local:1"); } //============================================================================ @@ -675,10 +680,9 @@ void Host_Name_f (void) } if (Cmd_Argc () == 2) - strncpy(newName, Cmd_Argv(1), sizeof(host_client->name) - 1); + strlcpy (newName, Cmd_Argv(1), sizeof (newName)); else - strncpy(newName, Cmd_Args(), sizeof(host_client->name) - 1); - newName[sizeof(host_client->name) - 1] = 0; + strlcpy (newName, Cmd_Args(), sizeof (newName)); if (cmd_source == src_command) { @@ -768,8 +772,8 @@ void Host_Say(qboolean teamonly) text[j++] = '\n'; text[j++] = 0; - for (j = 0;j < MAX_SCOREBOARD;j++) - if ((host_client = svs.connectedclients[j]) && host_client->spawned && (!teamplay.integer || host_client->edict->v->team == save->edict->v->team)) + for (j = 0, host_client = svs.clients;j < svs.maxclients;j++, host_client++) + if (host_client->spawned && (!teamplay.integer || host_client->edict->v->team == save->edict->v->team)) SV_ClientPrintf("%s", text); host_client = save; @@ -845,8 +849,8 @@ void Host_Tell_f(void) text[j++] = 0; save = host_client; - for (j = 0;j < MAX_SCOREBOARD;j++) - if ((host_client = svs.connectedclients[j]) && host_client->spawned && !strcasecmp(host_client->name, Cmd_Argv(1))) + 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_ClientPrintf("%s", text); host_client = save; } @@ -926,6 +930,37 @@ void Host_Color_f(void) } } +cvar_t cl_rate = {CVAR_SAVE, "_cl_rate", "10000"}; +cvar_t sv_maxrate = {CVAR_SAVE | CVAR_NOTIFY, "sv_maxrate", "10000"}; +void Host_Rate_f(void) +{ + int rate, maxrate; + + if (Cmd_Argc() != 2) + { + Con_Printf ("\"rate\" is \"%i\"\n", cl_rate.integer); + Con_Printf ("rate <500-25000>\n"); + return; + } + + rate = atoi(Cmd_Argv(1)); + + if (cmd_source == src_command) + { + Cvar_SetValue ("_cl_rate", bound(NET_MINRATE, rate, NET_MAXRATE)); + if (cls.state == ca_connected) + Cmd_ForwardToServer (); + return; + } + + maxrate = bound(NET_MINRATE, sv_maxrate.integer, NET_MAXRATE); + if (sv_maxrate.integer != maxrate) + Cvar_SetValueQuick(&sv_maxrate, maxrate); + + if (LHNETADDRESS_GetAddressType(&host_client->netconnection->peeraddress) != LHNETADDRESSTYPE_LOOP) + host_client->netconnection->rate = bound(NET_MINRATE, rate, maxrate); +} + /* ================== Host_Kill_f @@ -1115,9 +1150,9 @@ void Host_Spawn_f (void) MSG_WriteByte (&host_client->message, svc_time); MSG_WriteFloat (&host_client->message, sv.time); - for (i = 0;i < MAX_SCOREBOARD;i++) + for (i = 0, client = svs.clients;i < svs.maxclients;i++, client++) { - if (!(client = svs.connectedclients[i])) + if (!client->active) continue; MSG_WriteByte (&host_client->message, svc_updatename); MSG_WriteByte (&host_client->message, i); @@ -1214,22 +1249,22 @@ void Host_Kick_f (void) if (Cmd_Argc() > 2 && strcmp(Cmd_Argv(1), "#") == 0) { i = atof(Cmd_Argv(2)) - 1; - if (i < 0 || i >= MAX_SCOREBOARD || !(host_client = svs.connectedclients[i])) + if (i < 0 || i >= svs.maxclients || !(host_client = svs.clients + i)->active) return; byNumber = true; } else { - for (i = 0;i < MAX_SCOREBOARD;i++) + for (i = 0, host_client = svs.clients;i < svs.maxclients;i++, host_client++) { - if (!(host_client = svs.connectedclients[i])) + if (!host_client->active) continue; if (strcasecmp(host_client->name, Cmd_Argv(1)) == 0) break; } } - if (i < MAX_SCOREBOARD) + if (i < svs.maxclients) { if (cmd_source == src_command) { @@ -1574,7 +1609,7 @@ void Host_Startdemos_f (void) if (cls.state == ca_dedicated || COM_CheckParm("-listen")) { - if (!sv.active && !sv_spawnmap[0]) + if (!sv.active) { if (gamemode == GAME_TRANSFUSION) Cbuf_AddText ("map bb1\n"); @@ -1593,7 +1628,7 @@ void Host_Startdemos_f (void) Con_DPrintf ("%i demo(s) in loop\n", c); for (i=1 ; i