#include #include #include #include #ifdef _WIN32 #include #else #include #endif #include "version.h" #include "c_consol.h" #include "c_cmds.h" #include "c_dispch.h" #include "i_system.h" #include "doomstat.h" #include "dstrings.h" #include "s_sound.h" #include "g_game.h" #include "d_items.h" #include "p_inter.h" #include "z_zone.h" #include "w_wad.h" #include "g_level.h" extern FILE *Logfile; cvar_t *sv_cheats; static void cmd_toggleconsole (player_t *plyr, int argc, char **argv) { C_ToggleConsole(); } struct CmdDispatcher CmdList[] = { { "playdemo", Cmd_PlayDemo }, { "timedemo", Cmd_TimeDemo }, { "error", Cmd_Error }, { "endgame", Cmd_Endgame }, { "mem", Cmd_Mem }, { "pings", Cmd_Pings }, { "skins", Cmd_Skins }, { "turn180", Cmd_Turn180 }, { "puke", Cmd_Puke }, { "spynext", Cmd_SpyNext }, { "spyprev", Cmd_SpyPrev }, { "messagemode", Cmd_MessageMode }, { "say", Cmd_Say }, { "messagemode2", Cmd_MessageMode2 }, { "say_team", Cmd_Say_Team }, { "limits", Cmd_Limits }, { "screenshot", Cmd_Screenshot }, { "vid_setmode", Cmd_Vid_SetMode }, { "togglemap", Cmd_Togglemap }, { "echo", Cmd_Echo }, { "clear", Cmd_Clear }, { "toggleconsole", cmd_toggleconsole }, { "centerview", Cmd_CenterView }, { "pause", Cmd_Pause }, { "setcolor", Cmd_SetColor }, { "kill", Cmd_Kill }, { "sizedown", Cmd_Sizedown }, { "sizeup", Cmd_Sizeup }, { "impulse", Cmd_Impulse }, { "weapnext", Cmd_WeapNext }, { "weapprev", Cmd_WeapPrev }, { "alias", Cmd_Alias }, { "cmdlist", Cmd_Cmdlist }, { "unbind", Cmd_Unbind }, { "unbindall", Cmd_Unbindall }, { "undoublebind", Cmd_UnDoubleBind }, { "doublebind", Cmd_DoubleBind }, { "bind", Cmd_Bind }, { "binddefaults", Cmd_BindDefaults }, { "dumpheap", Cmd_DumpHeap }, { "exec", Cmd_Exec }, { "gameversion", Cmd_Gameversion }, { "get", Cmd_Get }, { "toggle", Cmd_Toggle }, { "cvarlist", Cmd_CvarList }, { "give", Cmd_Give }, { "chase", Cmd_Chase }, { "god", Cmd_God }, { "history", Cmd_History }, { "idclev", Cmd_idclev }, { "changemap", Cmd_ChangeMap }, { "map", Cmd_Map }, { "idclip", Cmd_Noclip }, { "iddqd", Cmd_God }, { "changemus", Cmd_ChangeMus }, { "idmus", Cmd_idmus }, { "idspispopd", Cmd_Noclip }, { "key", Cmd_Key }, { "logfile", Cmd_Logfile }, { "noclip", Cmd_Noclip }, { "notarget", Cmd_Notarget }, { "quit", Cmd_Quit }, { "set", Cmd_Set }, { "menu_main", Cmd_Menu_Main }, { "menu_load", Cmd_Menu_Load }, { "menu_save", Cmd_Menu_Save }, { "menu_help", Cmd_Menu_Help }, { "quicksave", Cmd_Quicksave }, { "quickload", Cmd_Quickload }, { "menu_endgame", Cmd_Menu_Endgame }, { "menu_quit", Cmd_Menu_Quit }, { "menu_game", Cmd_Menu_Game }, { "menu_options", Cmd_Menu_Options }, { "menu_display", Cmd_Menu_Display }, { "menu_keys", Cmd_Menu_Keys }, { "menu_player", Cmd_Menu_Player }, { "menu_video", Cmd_Menu_Video }, { "menu_gameplay", Cmd_Menu_Gameplay }, { "bumpgamma", Cmd_Bumpgamma }, { "togglemessages", Cmd_ToggleMessages }, { "stop", Cmd_Stop }, { "soundlist", Cmd_Soundlist }, { "soundlinks", Cmd_Soundlinks }, { "dir", Cmd_Dir }, { NULL } }; void C_InstallCommands (void) { C_RegisterCommands (CmdList); } BOOL CheckCheatmode (void) { if (((gameskill->value == sk_nightmare) || netgame) && (sv_cheats->value == 0.0)) { Printf (PRINT_HIGH, "You must run the server with '+set cheats 1' to enable this command.\n"); return true; } else { return false; } } void Cmd_Quit (player_t *plyr, int argc, char **argv) { exit (0); } void Cmd_ChangeMus (player_t *plyr, int argc, char **argv) { if (argc > 1) { S_ChangeMusic (argv[1], 1); } } /* ================== Cmd_God Sets client to godmode argv(0) god ================== */ void Cmd_God (player_t *plyr, int argc, char **argv) { if (CheckCheatmode ()) return; Net_WriteByte (DEM_GENERICCHEAT); if (*argv[0] == 'i') Net_WriteByte (CHT_IDDQD); else Net_WriteByte (CHT_GOD); } void Cmd_Notarget (player_t *plyr, int argc, char **argv) { if (CheckCheatmode ()) return; Net_WriteByte (DEM_GENERICCHEAT); Net_WriteByte (CHT_NOTARGET); } /* ================== Cmd_Noclip argv(0) noclip ================== */ void Cmd_Noclip (player_t *plyr, int argc, char **argv) { if (CheckCheatmode ()) return; Net_WriteByte (DEM_GENERICCHEAT); Net_WriteByte (CHT_NOCLIP); } extern cvar_t *chasedemo; void Cmd_Chase (player_t *plyr, int argc, char **argv) { if (demoplayback) { int i; if (chasedemo->value) { SetCVarFloat (chasedemo, 0); for (i = 0; i < MAXPLAYERS; i++) players[i].cheats &= ~CF_CHASECAM; } else { SetCVarFloat (chasedemo, 1); for (i = 0; i < MAXPLAYERS; i++) players[i].cheats |= CF_CHASECAM; } } else { if (CheckCheatmode ()) return; Net_WriteByte (DEM_GENERICCHEAT); Net_WriteByte (CHT_CHASECAM); } } void Cmd_idclev (player_t *plyr, int argc, char **argv) { if (CheckCheatmode ()) return; if ((argc > 1) && (*(argv[1] + 2) == 0) && *(argv[1] + 1) && *argv[1]) { int epsd, map; char *buf = argv[1]; buf[0] -= '0'; buf[1] -= '0'; if (gamemode == commercial) { epsd = 1; map = buf[0]*10 + buf[1]; } else { epsd = buf[0]; map = buf[1]; } // Catch invalid maps. if (epsd < 1) return; if (map < 1) return; if ((gamemode == retail) && ((epsd > 4) || (map > 9))) return; if ((gamemode == registered) && ((epsd > 3) || (map > 9))) return; if ((gamemode == shareware) && ((epsd > 1) || (map > 9))) return; if ((gamemode == commercial) && (( epsd > 1) || (map > 34))) return; // So be it. Printf (PRINT_HIGH, "%s\n", STSTR_CLEV); G_DeferedInitNew (CalcMapName (epsd, map)); } } void Cmd_ChangeMap (player_t *plyr, int argc, char **argv) { if (plyr != players && netgame) { Printf (PRINT_HIGH, "Only player 1 can change the map.\n"); return; } if (argc > 1) { if (W_CheckNumForName (argv[1]) == -1) { Printf (PRINT_HIGH, "No map %s\n", argv[1]); } else { Net_WriteByte (DEM_CHANGEMAP); Net_WriteString (argv[1]); } } } void Cmd_idmus (player_t *plyr, int argc, char **argv) { level_info_t *info; char *map; int l; if (argc > 1) { if (gamemode == commercial) { l = atoi (argv[1]); if (l <= 99) map = CalcMapName (0, l); else { Printf (PRINT_HIGH, "%s\n", STSTR_NOMUS); return; } } else { map = CalcMapName (argv[1][0] - '0', argv[1][1] - '0'); } if ( (info = FindLevelInfo (map)) ) { if (info->music[0]) { S_ChangeMusic (info->music, 1); Printf (PRINT_HIGH, "%s\n", STSTR_MUS); } } else Printf (PRINT_HIGH, "%s\n", STSTR_NOMUS); } } void Cmd_Give (player_t *plyr, int argc, char **argv) { char *name; if (CheckCheatmode ()) return; if (argc < 2) return; if ( (name = BuildString (argc - 1, argv + 1)) ) { Net_WriteByte (DEM_GIVECHEAT); Net_WriteString (name); free (name); } } void Cmd_Gameversion (player_t *plyr, int argc, char **argv) { Printf (PRINT_HIGH, "%d.%d : " __DATE__ "\n", VERSION / 100, VERSION % 100); } void Cmd_Exec (player_t *plyr, int argc, char **argv) { FILE *f; char cmd[4096], *end, *comment; if (argc < 2) return; if ( (f = fopen (argv[1], "r")) ) { while (fgets (cmd, 256, f)) { // Comments begin with // comment = strstr (cmd, "//"); if (comment) *comment = 0; end = cmd + strlen (cmd) - 1; if (*end == '\n') *end = 0; AddCommandString (cmd); } if (!feof (f)) Printf (PRINT_HIGH, "Error parsing \"%s\"\n", argv[1]); fclose (f); } else Printf (PRINT_HIGH, "Could not open \"%s\"\n", argv[1]); } void Cmd_DumpHeap (player_t *plyr, int argc, char **argv) { int lo = PU_STATIC, hi = PU_CACHE; if (argc >= 2) { lo = atoi (argv[1]); if (argc >= 3) { hi = atoi (argv[2]); } } Z_DumpHeap (lo, hi); } void Cmd_Logfile (player_t *plyr, int argc, char **argv) { time_t clock; char *timestr; time (&clock); timestr = asctime (localtime (&clock)); if (Logfile) { Printf (PRINT_HIGH, "Log stopped: %s\n", timestr); fclose (Logfile); Logfile = NULL; } if (argc >= 2) { if ( (Logfile = fopen (argv[1], "w")) ) { Printf (PRINT_HIGH, "Log started: %s\n", timestr); } else { Printf (PRINT_HIGH, "Could not start log\n"); } } } void Cmd_Limits (player_t *plyr, int argc, char **argv) { extern int MaxDeathmatchStarts; extern int MaxSpecialCross; extern int MaxDrawSegs; extern int MaxSegs; extern int MaxVisSprites; extern int maxopenings; Printf (PRINT_HIGH, "Note that the following values are\n" "dynamic and will increase as needed.\n\n"); Printf (PRINT_HIGH, "MaxDeathmatchStarts: %u\n", MaxDeathmatchStarts); Printf (PRINT_HIGH, "MaxDrawSegs: %u\n", MaxDrawSegs); Printf (PRINT_HIGH, "MaxSegs: %u\n", MaxSegs); Printf (PRINT_HIGH, "MaxSpecialCross: %u\n", MaxSpecialCross); Printf (PRINT_HIGH, "MaxVisSprites: %u\n", MaxVisSprites); Printf (PRINT_HIGH, "MaxOpeninings: %u\n", maxopenings); } BOOL P_StartScript (void *who, void *where, int script, char *map, int lineSide, int arg0, int arg1, int arg2, int always); void Cmd_Puke (player_t *plyr, int argc, char **argv) { if (argc < 2 || argc > 5) { Printf (PRINT_HIGH, " puke