X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=host_cmd.c;h=528af90a599c6503c00eec09d7532ebde48feac9;hb=b713e67e8039d1f29af68360bdae011bd722c578;hp=7c02d6ce5bd1a4f3ff1a6577584522e3d26c7a35;hpb=a0338ffd578afdaf693aee96bc6f948afb5b1844;p=xonotic%2Fdarkplaces.git diff --git a/host_cmd.c b/host_cmd.c index 7c02d6ce..528af90a 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -24,6 +24,9 @@ int current_skill; char sv_spawnmap[MAX_QPATH]; char sv_loadgame[MAX_OSPATH]; +cvar_t sv_cheats = {0, "sv_cheats", "0"}; +qboolean allowcheats = false; + mfunction_t *ED_FindFunction (char *name); /* @@ -66,16 +69,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; @@ -109,9 +112,15 @@ void Host_God_f (void) return; } - if (pr_global_struct->deathmatch || !sv_player) + if (!sv_player) return; + if (!allowcheats) + { + SV_ClientPrintf("No cheats allowed, use sv_cheats 1 and restart level to enable.\n"); + return; + } + sv_player->v->flags = (int)sv_player->v->flags ^ FL_GODMODE; if (!((int)sv_player->v->flags & FL_GODMODE) ) SV_ClientPrintf ("godmode OFF\n"); @@ -127,8 +136,14 @@ void Host_Notarget_f (void) return; } - if (pr_global_struct->deathmatch || !sv_player) + if (!sv_player) + return; + + if (!allowcheats) + { + SV_ClientPrintf("No cheats allowed, use sv_cheats 1 and restart level to enable.\n"); return; + } sv_player->v->flags = (int)sv_player->v->flags ^ FL_NOTARGET; if (!((int)sv_player->v->flags & FL_NOTARGET) ) @@ -147,9 +162,15 @@ void Host_Noclip_f (void) return; } - if (pr_global_struct->deathmatch || !sv_player) + if (!sv_player) return; + if (!allowcheats) + { + SV_ClientPrintf("No cheats allowed, use sv_cheats 1 and restart level to enable.\n"); + return; + } + if (sv_player->v->movetype != MOVETYPE_NOCLIP) { noclip_anglehack = true; @@ -179,9 +200,15 @@ void Host_Fly_f (void) return; } - if (pr_global_struct->deathmatch || !sv_player) + if (!sv_player) return; + if (!allowcheats) + { + SV_ClientPrintf("No cheats allowed, use sv_cheats 1 and restart level to enable.\n"); + return; + } + if (sv_player->v->movetype != MOVETYPE_FLY) { sv_player->v->movetype = MOVETYPE_FLY; @@ -214,9 +241,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 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; @@ -419,9 +452,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); @@ -435,7 +467,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); @@ -481,7 +513,7 @@ void Host_Loadgame_f (void) } strcpy (sv_loadgame, Cmd_Argv(1)); - FS_DefaultExtension (sv_loadgame, ".sav"); + FS_DefaultExtension (sv_loadgame, ".sav", sizeof (sv_loadgame)); Con_Printf ("Loading game from %s...\n", sv_loadgame); } @@ -537,6 +569,7 @@ void Host_PerformLoadGame(char *name) str = FS_Getline (f); sscanf (str, "%f\n",&time); + allowcheats = sv_cheats.integer != 0; SV_SpawnServer (mapname); if (!sv.active) { @@ -615,7 +648,7 @@ 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)) @@ -641,10 +674,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) { @@ -734,8 +766,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; @@ -811,8 +843,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; } @@ -1081,9 +1113,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); @@ -1172,15 +1204,7 @@ void Host_Kick_f (void) int i; qboolean byNumber = false; - if (cmd_source == src_command) - { - if (!sv.active) - { - Cmd_ForwardToServer (); - return; - } - } - else if (pr_global_struct->deathmatch) + if (cmd_source != src_command || !sv.active) return; save = host_client; @@ -1188,22 +1212,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) { @@ -1268,9 +1292,15 @@ void Host_Give_f (void) return; } - if (pr_global_struct->deathmatch || !sv_player) + if (!sv_player) return; + if (!allowcheats) + { + SV_ClientPrintf("No cheats allowed, use sv_cheats 1 and restart level to enable.\n"); + return; + } + t = Cmd_Argv(1); v = atoi (Cmd_Argv(2)); @@ -1540,7 +1570,7 @@ void Host_Startdemos_f (void) { int i, c; - if (cls.state == ca_dedicated || sv_maxplayers.integer > 1) + if (cls.state == ca_dedicated || COM_CheckParm("-listen")) { if (!sv.active && !sv_spawnmap[0]) { @@ -1561,7 +1591,7 @@ void Host_Startdemos_f (void) Con_DPrintf ("%i demo(s) in loop\n", c); for (i=1 ; i