darkvater@222: /* -------------------- dont cross this line --------------------- */ darkvater@222: #include "stdafx.h" darkvater@222: #include "ttd.h" darkvater@222: #include "console.h" tron@1299: #include "debug.h" darkvater@222: #include "engine.h" darkvater@222: #include "functions.h" tron@1317: #include "string.h" darkvater@222: #include "variables.h" truelight@543: #include "network_data.h" truelight@543: #include "network_client.h" truelight@543: #include "network_server.h" truelight@766: #include "network_udp.h" truelight@543: #include "command.h" truelight@623: #include "settings.h" truelight@885: #include "hal.h" /* for file list */ darkvater@222: darkvater@247: darkvater@247: // ** scriptfile handling ** // darkvater@247: static FILE * _script_file; darkvater@247: static bool _script_running; darkvater@247: darkvater@222: // ** console command / variable defines ** // darkvater@247: darkvater@289: #define DEF_CONSOLE_CMD(yyyy) static _iconsole_var * yyyy(byte argc, char* argv[], byte argt[]) darkvater@222: #define DEF_CONSOLE_CMD_HOOK(yyyy) static bool yyyy(_iconsole_cmd * hookcmd) darkvater@222: #define DEF_CONSOLE_VAR_HOOK(yyyy) static bool yyyy(_iconsole_var * hookvar) darkvater@222: darkvater@247: darkvater@247: // ** supporting functions ** // darkvater@247: darkvater@289: static uint32 GetArgumentInteger(const char* arg) darkvater@222: { darkvater@289: uint32 result; darkvater@289: sscanf(arg, "%u", &result); darkvater@222: darkvater@222: if (result == 0 && arg[0] == '0' && arg[1] == 'x') darkvater@289: sscanf(arg, "%x", &result); darkvater@222: darkvater@222: return result; darkvater@222: } darkvater@222: darkvater@222: /* **************************** */ darkvater@222: /* variable and command hooks */ darkvater@222: /* **************************** */ darkvater@222: truelight@543: #ifdef ENABLE_NETWORK truelight@543: darkvater@222: DEF_CONSOLE_CMD_HOOK(ConCmdHookNoNetwork) darkvater@222: { darkvater@222: if (_networking) { darkvater@301: IConsoleError("This command is forbidden in multiplayer."); darkvater@222: return false; darkvater@289: } darkvater@222: return true; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_VAR_HOOK(ConVarHookNoNetClient) darkvater@222: { truelight@554: if (!_network_available) { truelight@554: IConsoleError("You can not use this command because there is no network available."); truelight@554: return false; truelight@554: } truelight@543: if (!_network_server) { darkvater@301: IConsoleError("This variable only makes sense for a network server."); darkvater@222: return false; darkvater@289: } darkvater@222: return true; darkvater@222: } darkvater@222: truelight@543: DEF_CONSOLE_CMD_HOOK(ConCmdHookNoNetClient) truelight@543: { truelight@554: if (!_network_available) { truelight@554: IConsoleError("You can not use this command because there is no network available."); truelight@554: return false; truelight@554: } truelight@554: if (!_network_server) { truelight@543: IConsoleError("This command is only available for a network server."); truelight@543: return false; truelight@543: } truelight@543: return true; truelight@543: } truelight@543: truelight@543: DEF_CONSOLE_CMD_HOOK(ConCmdHookNoNetServer) truelight@543: { truelight@554: if (!_network_available) { truelight@554: IConsoleError("You can not use this command because there is no network available."); truelight@554: return false; truelight@554: } truelight@554: if (_network_server) { truelight@554: IConsoleError("You can not use this command because you are a network-server."); truelight@543: return false; truelight@543: } truelight@543: return true; truelight@543: } truelight@543: truelight@543: DEF_CONSOLE_CMD_HOOK(ConCmdHookNeedNetwork) truelight@543: { truelight@554: if (!_network_available) { truelight@554: IConsoleError("You can not use this command because there is no network available."); truelight@554: return false; truelight@554: } truelight@543: if (!_networking) { truelight@543: IConsoleError("Not connected. Multiplayer only command."); truelight@543: return false; truelight@543: } truelight@543: return true; truelight@543: } truelight@543: truelight@543: #endif /* ENABLE_NETWORK */ truelight@543: darkvater@222: /* **************************** */ darkvater@222: /* reset commands */ darkvater@222: /* **************************** */ darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConResetEngines) darkvater@222: { darkvater@222: StartupEngines(); darkvater@222: return 0; darkvater@222: } darkvater@222: darkvater@289: #ifdef _DEBUG darkvater@222: DEF_CONSOLE_CMD(ConResetTile) darkvater@222: { darkvater@222: if (argc == 2) { darkvater@222: TileIndex tile = (TileIndex)GetArgumentInteger(argv[1]); darkvater@222: DoClearSquare(tile); darkvater@222: } darkvater@222: darkvater@222: return 0; darkvater@222: } darkvater@289: #endif darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConScrollToTile) darkvater@222: { darkvater@222: if (argc == 2) { darkvater@222: TileIndex tile = (TileIndex)GetArgumentInteger(argv[1]); darkvater@222: ScrollMainWindowToTile(tile); darkvater@222: } darkvater@222: darkvater@222: return 0; darkvater@222: } darkvater@222: truelight@885: extern bool SafeSaveOrLoad(const char *filename, int mode, int newgm); tron@1093: extern void BuildFileList(void); truelight@885: extern void SetFiosType(const byte fiostype); truelight@885: Darkvater@1565: /* Save the map to current dir */ Darkvater@1565: static void SaveMap(const char *filename) Darkvater@1565: { Darkvater@1565: char buf[200]; Darkvater@1565: Darkvater@1565: snprintf(buf, sizeof(buf), "%s%s%s.sav", _path.save_dir, PATHSEP, filename); Darkvater@1565: IConsolePrint(_iconsole_color_default, "Saving map..."); Darkvater@1565: Darkvater@1565: if (SaveOrLoad(buf, SL_SAVE) != SL_OK) { Darkvater@1565: IConsolePrint(_iconsole_color_error, "SaveMap failed"); Darkvater@1565: } else Darkvater@1565: IConsolePrintF(_iconsole_color_default, "Map sucessfully saved to %s", buf); Darkvater@1565: } Darkvater@1565: Darkvater@1565: /* Save the map to a file */ Darkvater@1565: DEF_CONSOLE_CMD(ConSave) Darkvater@1565: { Darkvater@1565: /* We need 1 argument */ Darkvater@1565: if (argc == 2) { Darkvater@1565: /* Save the map */ Darkvater@1565: SaveMap(argv[1]); Darkvater@1565: return NULL; Darkvater@1565: } Darkvater@1565: Darkvater@1565: /* Give usage */ Darkvater@1565: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: save "); Darkvater@1565: return NULL; Darkvater@1565: } Darkvater@1565: truelight@885: /* Load a file-number from current dir */ truelight@885: static void LoadMap(uint no) truelight@885: { truelight@885: /* Build file list */ truelight@885: BuildFileList(); truelight@885: truelight@885: /* Check if in range */ darkvater@887: if (no != 0 && no <= (uint)_fios_num) { truelight@885: const FiosItem *item = &_fios_list[no - 1]; truelight@885: darkvater@932: if (item->type == FIOS_TYPE_FILE) { darkvater@932: /* Load the file */ darkvater@932: _switch_mode = SM_LOAD; darkvater@932: SetFiosType(item->type); darkvater@932: strcpy(_file_to_saveload.name, FiosBrowseTo(item)); truelight@885: darkvater@932: IConsolePrint(_iconsole_color_default, "Loading map..."); darkvater@932: } else darkvater@932: IConsolePrint(_iconsole_color_error, "That is not a map."); darkvater@932: darkvater@932: } else /* Show usages */ darkvater@932: IConsolePrint(_iconsole_color_error, "Unknown map. Use 'list_files' and 'goto_dir' to find the numbers of the savegame."); truelight@885: truelight@885: /* Free the file-list */ truelight@885: FiosFreeSavegameList(); truelight@885: } truelight@885: truelight@885: /* Load a file from a map */ truelight@885: DEF_CONSOLE_CMD(ConLoad) truelight@885: { truelight@885: /* We need 1 argument */ truelight@885: if (argc == 2) { truelight@885: /* Load the map */ truelight@885: LoadMap(atoi(argv[1])); truelight@885: return NULL; truelight@885: } truelight@885: truelight@885: /* Give usage */ truelight@885: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: load "); truelight@885: return NULL; truelight@885: } truelight@885: truelight@885: /* List all the files in the current dir via console */ truelight@885: DEF_CONSOLE_CMD(ConListFiles) truelight@885: { truelight@885: const FiosItem *item; truelight@885: int pos = 0; truelight@885: truelight@885: /* Build the file-list */ truelight@885: BuildFileList(); truelight@885: truelight@885: /* As long as we have files */ truelight@885: while (pos < _fios_num) { truelight@885: item = _fios_list + pos; truelight@885: pos++; truelight@885: /* Show them */ truelight@885: IConsolePrintF(_iconsole_color_default, "%d) %s", pos, item->title[0] ? item->title : item->name); truelight@885: } truelight@885: truelight@885: /* Destroy the file list */ truelight@885: FiosFreeSavegameList(); truelight@885: truelight@885: return NULL; truelight@885: } truelight@885: darkvater@932: /* Get an Specific file */ darkvater@932: DEF_CONSOLE_CMD(ConScanFiles) darkvater@932: { darkvater@932: const FiosItem *item; darkvater@932: int pos = 0; darkvater@932: _iconsole_var* result; darkvater@932: darkvater@932: darkvater@932: result = IConsoleVarAlloc(ICONSOLE_VAR_STRING); tron@1019: darkvater@932: if (argc <= 1) { darkvater@932: IConsoleVarSetString(result, "0"); darkvater@932: return result; // return an zero darkvater@932: } darkvater@932: darkvater@932: /* Build the file-list */ darkvater@932: BuildFileList(); darkvater@932: darkvater@932: /* As long as we have files */ darkvater@932: while (pos < _fios_num) { darkvater@932: item = _fios_list + pos; tron@1019: pos++; darkvater@932: if (strcmp(argv[1], "..") == 0) { darkvater@932: if (item->type == FIOS_TYPE_PARENT) { darkvater@932: // huh we are searching for the parent directory darkvater@932: char buffer[10]; dominik@934: sprintf(buffer, "%d", pos); darkvater@932: IConsoleVarSetString(result, buffer); darkvater@932: return result; darkvater@932: } tron@1019: } else darkvater@932: // file records ? darkvater@932: if (item->type == FIOS_TYPE_FILE) { darkvater@932: if (strcmp(argv[1], item->name) == 0) { darkvater@932: char buffer[10]; dominik@934: sprintf(buffer, "%d", pos); darkvater@932: IConsoleVarSetString(result, buffer); darkvater@932: return result; tron@1019: } darkvater@932: } darkvater@932: } darkvater@932: darkvater@932: /* Destroy the file list */ darkvater@932: FiosFreeSavegameList(); darkvater@932: darkvater@932: return NULL; darkvater@932: } darkvater@932: truelight@885: /* Change the dir via console */ truelight@885: DEF_CONSOLE_CMD(ConGotoDir) truelight@885: { truelight@885: char *file; truelight@885: int no; truelight@885: truelight@885: /* We need 1 argument */ truelight@885: if (argc != 2) { dominik@1138: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: goto_dir "); truelight@885: return NULL; truelight@885: } truelight@885: truelight@885: no = atoi(argv[1]); truelight@885: truelight@885: /* Make the file list */ truelight@885: BuildFileList(); truelight@885: truelight@885: /* Check if we are in range */ truelight@885: if (no != 0 && no <= _fios_num) { truelight@885: const FiosItem *item = &_fios_list[no - 1]; truelight@885: /* Only DIR and PARENT we do allow here */ truelight@885: if (item->type == FIOS_TYPE_DIR || item->type == FIOS_TYPE_PARENT) { truelight@885: /* Goto the map */ truelight@885: file = FiosBrowseTo(item); truelight@885: FiosFreeSavegameList(); truelight@885: return NULL; truelight@885: } truelight@885: } truelight@885: truelight@885: /* Report error */ truelight@885: IConsolePrint(_iconsole_color_default, "That number is no directory."); truelight@885: FiosFreeSavegameList(); truelight@885: truelight@885: return NULL; truelight@885: } truelight@885: truelight@543: darkvater@222: // ********************************* // darkvater@222: // * Network Core Console Commands * // darkvater@222: // ********************************* // darkvater@222: #ifdef ENABLE_NETWORK darkvater@222: truelight@841: DEF_CONSOLE_CMD(ConBan) truelight@841: { truelight@841: NetworkClientInfo *ci; truelight@841: truelight@841: if (argc == 2) { truelight@841: uint32 index = atoi(argv[1]); darkvater@1089: if (index == NETWORK_SERVER_INDEX) { truelight@841: IConsolePrint(_iconsole_color_default, "Silly boy, you can not ban yourself!"); truelight@841: return NULL; truelight@841: } truelight@841: if (index == 0) { truelight@841: IConsoleError("Invalid Client-ID"); truelight@841: return NULL; truelight@841: } truelight@841: truelight@841: ci = NetworkFindClientInfoFromIndex(index); truelight@841: truelight@841: if (ci != NULL) { truelight@841: uint i; truelight@841: /* Add user to ban-list */ truelight@841: for (i = 0; i < lengthof(_network_ban_list); i++) { truelight@841: if (_network_ban_list[i] == NULL || _network_ban_list[i][0] == '\0') { truelight@841: _network_ban_list[i] = strdup(inet_ntoa(*(struct in_addr *)&ci->client_ip)); truelight@841: break; truelight@841: } truelight@841: } truelight@841: truelight@841: SEND_COMMAND(PACKET_SERVER_ERROR)(NetworkFindClientStateFromIndex(index), NETWORK_ERROR_KICKED); truelight@841: return NULL; truelight@841: } else { truelight@841: IConsoleError("Client-ID not found"); truelight@841: return NULL; truelight@841: } truelight@841: } truelight@841: truelight@841: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: ban . For client-ids, see 'clients'."); truelight@841: truelight@841: return NULL; truelight@841: } truelight@841: truelight@841: DEF_CONSOLE_CMD(ConUnBan) truelight@841: { truelight@841: if (argc == 2) { truelight@841: uint i; truelight@841: for (i = 0; i < lengthof(_network_ban_list); i++) { truelight@841: if (_network_ban_list[i] == NULL || _network_ban_list[i][0] == '\0') truelight@841: continue; truelight@841: truelight@841: if (strncmp(_network_ban_list[i], argv[1], strlen(_network_ban_list[i])) == 0) { truelight@841: _network_ban_list[i][0] = '\0'; truelight@841: IConsolePrint(_iconsole_color_default, "IP unbanned."); truelight@841: return NULL; truelight@841: } truelight@841: } truelight@841: truelight@841: IConsolePrint(_iconsole_color_default, "IP not in ban-list."); truelight@841: truelight@841: return NULL; truelight@841: } truelight@841: truelight@841: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: unban ."); truelight@841: truelight@841: return NULL; truelight@841: } truelight@841: truelight@841: DEF_CONSOLE_CMD(ConBanList) truelight@841: { truelight@841: uint i; truelight@841: truelight@841: IConsolePrint(_iconsole_color_default, "Banlist: "); truelight@841: truelight@841: for (i = 0; i < lengthof(_network_ban_list); i++) { truelight@841: if (_network_ban_list[i] == NULL || _network_ban_list[i][0] == '\0') truelight@841: continue; truelight@841: truelight@841: IConsolePrintF(_iconsole_color_default, " %d) %s", i + 1, _network_ban_list[i]); truelight@841: } truelight@841: truelight@841: return NULL; truelight@841: } truelight@841: darkvater@1147: DEF_CONSOLE_CMD(ConPauseGame) darkvater@1147: { darkvater@1147: if (_pause == 0) { darkvater@1147: DoCommandP(0, 1, 0, NULL, CMD_PAUSE); darkvater@1147: IConsolePrint(_iconsole_color_default, "Game paused."); darkvater@1147: } else darkvater@1147: IConsolePrint(_iconsole_color_default, "Game is already paused."); darkvater@1147: darkvater@1147: return NULL; darkvater@1147: } darkvater@1147: darkvater@1147: DEF_CONSOLE_CMD(ConUnPauseGame) darkvater@1147: { darkvater@1147: if (_pause != 0) { darkvater@1147: DoCommandP(0, 0, 0, NULL, CMD_PAUSE); darkvater@1147: IConsolePrint(_iconsole_color_default, "Game unpaused."); darkvater@1147: } else darkvater@1147: IConsolePrint(_iconsole_color_default, "Game is already unpaused."); darkvater@1147: darkvater@1147: return NULL; darkvater@1147: } darkvater@1147: truelight@1026: DEF_CONSOLE_CMD(ConRcon) truelight@1026: { truelight@1026: if (argc < 3) { truelight@1026: IConsolePrint(_iconsole_color_default, "Usage: rcon "); truelight@1026: return NULL; truelight@1026: } truelight@1026: truelight@1026: SEND_COMMAND(PACKET_CLIENT_RCON)(argv[1], argv[2]); truelight@1026: truelight@1026: return NULL; truelight@1026: } truelight@1026: truelight@543: DEF_CONSOLE_CMD(ConStatus) truelight@543: { truelight@543: const char *status; truelight@543: int lag; truelight@716: const NetworkClientState *cs; truelight@543: const NetworkClientInfo *ci; truelight@543: FOR_ALL_CLIENTS(cs) { truelight@543: lag = NetworkCalculateLag(cs); truelight@543: ci = DEREF_CLIENT_INFO(cs); truelight@543: truelight@543: switch (cs->status) { truelight@543: case STATUS_INACTIVE: truelight@543: status = "inactive"; truelight@543: break; truelight@543: case STATUS_AUTH: truelight@543: status = "authorized"; truelight@543: break; truelight@543: case STATUS_MAP: truelight@543: status = "loading map"; truelight@543: break; truelight@543: case STATUS_DONE_MAP: truelight@543: status = "done map"; truelight@543: break; truelight@543: case STATUS_PRE_ACTIVE: truelight@543: status = "ready"; truelight@543: break; truelight@543: case STATUS_ACTIVE: truelight@543: status = "active"; truelight@543: break; truelight@543: default: truelight@543: status = "unknown"; truelight@543: break; truelight@543: } truelight@602: IConsolePrintF(8, "Client #%d/%s status: %s frame-lag: %d play-as: %d unique-id: %s", truelight@602: cs->index, ci->client_name, status, lag, ci->client_playas, ci->unique_id); truelight@543: } truelight@543: truelight@543: return NULL; truelight@543: } truelight@543: truelight@543: DEF_CONSOLE_CMD(ConKick) truelight@543: { truelight@543: NetworkClientInfo *ci; truelight@543: truelight@543: if (argc == 2) { truelight@543: uint32 index = atoi(argv[1]); truelight@1026: if (index == NETWORK_SERVER_INDEX) { truelight@543: IConsolePrint(_iconsole_color_default, "Silly boy, you can not kick yourself!"); truelight@543: return NULL; truelight@543: } truelight@543: if (index == 0) { truelight@543: IConsoleError("Invalid Client-ID"); truelight@543: return NULL; truelight@543: } truelight@543: truelight@543: ci = NetworkFindClientInfoFromIndex(index); truelight@543: truelight@543: if (ci != NULL) { truelight@543: SEND_COMMAND(PACKET_SERVER_ERROR)(NetworkFindClientStateFromIndex(index), NETWORK_ERROR_KICKED); truelight@543: return NULL; truelight@543: } else { truelight@543: IConsoleError("Client-ID not found"); truelight@543: return NULL; truelight@543: } truelight@543: } truelight@543: truelight@543: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: kick . For client-ids, see 'clients'."); truelight@543: truelight@543: return NULL; truelight@543: } truelight@543: truelight@688: DEF_CONSOLE_CMD(ConResetCompany) truelight@688: { truelight@688: Player *p; truelight@716: NetworkClientState *cs; truelight@688: NetworkClientInfo *ci; truelight@688: truelight@688: if (argc == 2) { dominik@1130: byte index = atoi(argv[1]); truelight@688: truelight@688: /* Check valid range */ truelight@688: if (index < 1 || index > MAX_PLAYERS) { truelight@688: IConsolePrintF(_iconsole_color_error, "Company does not exist. Company-ID must be between 1 and %d.", MAX_PLAYERS); truelight@688: return NULL; truelight@688: } truelight@688: truelight@688: /* Check if company does exist */ truelight@688: index--; truelight@688: p = DEREF_PLAYER(index); truelight@688: if (!p->is_active) { truelight@688: IConsolePrintF(_iconsole_color_error, "Company does not exist."); truelight@688: return NULL; truelight@688: } truelight@688: truelight@688: if (p->is_ai) { truelight@688: IConsolePrintF(_iconsole_color_error, "Company is owned by an AI."); truelight@688: return NULL; truelight@688: } truelight@688: truelight@688: /* Check if the company has active players */ truelight@688: FOR_ALL_CLIENTS(cs) { truelight@688: ci = DEREF_CLIENT_INFO(cs); truelight@688: if (ci->client_playas-1 == index) { truelight@688: IConsolePrintF(_iconsole_color_error, "Cannot remove company: a client is connected to that company."); truelight@688: return NULL; truelight@688: } truelight@688: } truelight@688: ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX); truelight@688: if (ci->client_playas-1 == index) { truelight@688: IConsolePrintF(_iconsole_color_error, "Cannot remove company: a client is connected to that company."); truelight@688: return NULL; truelight@688: } truelight@688: truelight@688: /* It is safe to remove this company */ truelight@688: DoCommandP(0, 2, index, NULL, CMD_PLAYER_CTRL); truelight@688: IConsolePrint(_iconsole_color_default, "Company deleted."); truelight@688: return NULL; truelight@688: } truelight@688: truelight@688: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: reset_company ."); truelight@688: truelight@688: return NULL; truelight@688: } truelight@688: truelight@543: DEF_CONSOLE_CMD(ConNetworkClients) truelight@543: { truelight@543: NetworkClientInfo *ci; truelight@543: for (ci = _network_client_info; ci != &_network_client_info[MAX_CLIENT_INFO]; ci++) { truelight@543: if (ci->client_index != NETWORK_EMPTY_INDEX) { truelight@543: IConsolePrintF(8,"Client #%d name: %s play-as: %d", ci->client_index, ci->client_name, ci->client_playas); truelight@543: } truelight@543: } truelight@543: truelight@543: return NULL; truelight@543: } truelight@543: darkvater@222: DEF_CONSOLE_CMD(ConNetworkConnect) darkvater@222: { darkvater@289: char* ip; tron@1329: const char *port = NULL; tron@1329: const char *player = NULL; darkvater@222: uint16 rport; darkvater@222: darkvater@222: if (argc<2) return NULL; darkvater@222: truelight@543: if (_networking) { truelight@543: // We are in network-mode, first close it! truelight@543: NetworkDisconnect(); truelight@543: } truelight@543: darkvater@228: ip = argv[1]; truelight@543: rport = NETWORK_DEFAULT_PORT; darkvater@222: darkvater@228: ParseConnectionString(&player, &port, ip); darkvater@222: darkvater@289: IConsolePrintF(_iconsole_color_default, "Connecting to %s...", ip); truelight@543: if (player != NULL) { darkvater@222: _network_playas = atoi(player); darkvater@289: IConsolePrintF(_iconsole_color_default, " player-no: %s", player); darkvater@222: } truelight@543: if (port != NULL) { darkvater@222: rport = atoi(port); darkvater@289: IConsolePrintF(_iconsole_color_default, " port: %s", port); darkvater@222: } darkvater@222: truelight@543: NetworkClientConnectGame(ip, rport); darkvater@222: darkvater@222: return NULL; darkvater@222: } darkvater@222: truelight@543: #endif /* ENABLE_NETWORK */ darkvater@222: darkvater@247: /* ******************************** */ darkvater@247: /* script file console commands */ darkvater@247: /* ******************************** */ darkvater@247: darkvater@247: DEF_CONSOLE_CMD(ConExec) darkvater@247: { darkvater@247: char cmd[1024]; darkvater@247: tron@1383: if (argc < 2) return NULL; darkvater@247: truelight@543: _script_file = fopen(argv[1], "r"); darkvater@247: darkvater@247: if (_script_file == NULL) { tron@1383: if (argc <= 2 || atoi(argv[2]) != 0) IConsoleError("script file not found"); darkvater@247: return NULL; tron@1383: } darkvater@247: darkvater@247: _script_running = true; darkvater@247: tron@1382: while (_script_running && fgets(cmd, sizeof(cmd), _script_file) != NULL) { tron@1379: IConsoleCmdExec(cmd); tron@1382: } tron@1382: tron@1382: if (ferror(_script_file)) { tron@1382: IConsoleError("Encountered errror while trying to read from script file"); darkvater@247: } darkvater@247: darkvater@247: _script_running = false; darkvater@247: fclose(_script_file); darkvater@247: return NULL; darkvater@247: } darkvater@247: darkvater@247: DEF_CONSOLE_CMD(ConReturn) darkvater@247: { darkvater@247: _script_running = false; darkvater@247: return NULL; darkvater@247: } darkvater@247: darkvater@222: /* **************************** */ darkvater@222: /* default console commands */ darkvater@222: /* **************************** */ darkvater@1046: extern bool CloseConsoleLogIfActive(void); darkvater@1023: darkvater@1023: DEF_CONSOLE_CMD(ConScript) darkvater@1023: { darkvater@1023: extern FILE* _iconsole_output_file; darkvater@1023: if (!CloseConsoleLogIfActive()) { darkvater@289: if (argc < 2) return NULL; darkvater@1023: IConsolePrintF(_iconsole_color_default, "file output started to: %s", argv[1]); darkvater@289: _iconsole_output_file = fopen(argv[1], "ab"); darkvater@247: if (_iconsole_output_file == NULL) IConsoleError("could not open file"); darkvater@247: } darkvater@1023: darkvater@247: return NULL; darkvater@247: } darkvater@247: darkvater@247: darkvater@222: DEF_CONSOLE_CMD(ConEcho) darkvater@222: { darkvater@289: if (argc < 2) return NULL; darkvater@222: IConsolePrint(_iconsole_color_default, argv[1]); darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConEchoC) darkvater@222: { darkvater@289: if (argc < 3) return NULL; darkvater@222: IConsolePrint(atoi(argv[1]), argv[2]); darkvater@222: return NULL; darkvater@222: } darkvater@222: truelight@543: extern void SwitchMode(int new_mode); truelight@543: truelight@543: DEF_CONSOLE_CMD(ConNewGame) truelight@543: { truelight@543: _docommand_recursive = 0; truelight@543: truelight@543: _random_seeds[0][0] = Random(); truelight@543: _random_seeds[0][1] = InteractiveRandom(); truelight@543: truelight@543: SwitchMode(SM_NEWGAME); truelight@543: return NULL; truelight@543: } truelight@543: darkvater@222: DEF_CONSOLE_CMD(ConPrintF) darkvater@222: { darkvater@289: if (argc < 3) return NULL; darkvater@289: IConsolePrintF(_iconsole_color_default, argv[1] , argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18], argv[19]); /* XXX ugh... */ darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConPrintFC) darkvater@222: { darkvater@289: if (argc < 3) return NULL; darkvater@289: IConsolePrintF(atoi(argv[1]), argv[2] , argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18], argv[19]); /* XXX ugh... */ darkvater@222: return NULL; darkvater@222: } darkvater@222: truelight@634: DEF_CONSOLE_CMD(ConAlias) truelight@634: { dominik@644: _iconsole_alias* alias; dominik@644: truelight@634: if (argc < 3) return NULL; dominik@644: dominik@644: alias = IConsoleAliasGet(argv[1]); dominik@644: if (alias == NULL) { dominik@644: IConsoleAliasRegister(argv[1],argv[2]); dominik@644: } else { dominik@644: free(alias->cmdline); dominik@644: alias->cmdline = strdup(argv[2]); dominik@644: } truelight@634: return NULL; truelight@634: } truelight@634: darkvater@222: DEF_CONSOLE_CMD(ConScreenShot) darkvater@222: { darkvater@289: if (argc < 2) { darkvater@289: _make_screenshot = 1; darkvater@222: } else { darkvater@289: if (strcmp(argv[1], "big") == 0) darkvater@222: _make_screenshot=2; darkvater@289: if (strcmp(argv[1], "no_con") == 0) { darkvater@222: IConsoleClose(); darkvater@289: _make_screenshot = 1; darkvater@222: } darkvater@289: } darkvater@222: return NULL; darkvater@222: } darkvater@222: signde@229: DEF_CONSOLE_CMD(ConInfoVar) darkvater@222: { darkvater@289: if (argc < 2) return NULL; darkvater@289: if (argt[1] != ICONSOLE_VAR_REFERENCE) { signde@232: IConsoleError("first argument has to be a variable reference"); darkvater@289: } else { darkvater@289: _iconsole_var* item; darkvater@289: item = (_iconsole_var*)argv[1]; darkvater@289: IConsolePrintF(_iconsole_color_default, "var_name: %s", item->name); darkvater@289: IConsolePrintF(_iconsole_color_default, "var_type: %i", item->type); darkvater@289: IConsolePrintF(_iconsole_color_default, "var_addr: %i", item->data.addr); darkvater@289: if (item->_malloc) darkvater@289: IConsolePrintF(_iconsole_color_default, "var_malloc: internal"); darkvater@289: else darkvater@289: IConsolePrintF(_iconsole_color_default, "var_malloc: external"); darkvater@247: if (item->hook_access) IConsoleWarning("var_access hooked"); darkvater@247: if (item->hook_before_change) IConsoleWarning("var_before_change hooked"); signde@229: if (item->hook_after_change) IConsoleWarning("var_after_change hooked"); darkvater@289: } darkvater@222: return NULL; darkvater@247: } darkvater@247: darkvater@247: darkvater@247: DEF_CONSOLE_CMD(ConInfoCmd) darkvater@247: { darkvater@289: if (argc < 2) return NULL; darkvater@289: if (argt[1] != ICONSOLE_VAR_UNKNOWN) { darkvater@247: IConsoleError("first argument has to be a command name"); darkvater@289: } else { darkvater@289: _iconsole_cmd* item; darkvater@247: item = IConsoleCmdGet(argv[1]); darkvater@289: if (item == NULL) { darkvater@247: IConsoleError("the given command was not found"); darkvater@247: return NULL; darkvater@247: } darkvater@289: IConsolePrintF(_iconsole_color_default, "cmd_name: %s", item->name); darkvater@289: IConsolePrintF(_iconsole_color_default, "cmd_addr: %i", item->addr); darkvater@247: if (item->hook_access) IConsoleWarning("cmd_access hooked"); darkvater@247: if (item->hook_before_exec) IConsoleWarning("cmd_before_exec hooked"); darkvater@247: if (item->hook_after_exec) IConsoleWarning("cmd_after_exec hooked"); darkvater@289: } darkvater@247: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConDebugLevel) darkvater@222: { darkvater@289: if (argc < 2) return NULL; darkvater@222: SetDebugString(argv[1]); darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConExit) darkvater@222: { darkvater@222: _exit_game = true; darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConHelp) darkvater@222: { darkvater@289: IConsolePrint(13, " -- console help -- "); darkvater@289: IConsolePrint( 1, " variables: [command to list them: list_vars]"); truelight@543: IConsolePrint( 1, " temp_string = \"my little \""); darkvater@289: IConsolePrint( 1, ""); darkvater@289: IConsolePrint( 1, " commands: [command to list them: list_cmds]"); darkvater@289: IConsolePrint( 1, " [command] [\"string argument with spaces\"] [argument 2] ..."); truelight@543: IConsolePrint( 1, " printf \"%s world\" temp_string"); darkvater@289: IConsolePrint( 1, ""); darkvater@289: IConsolePrint( 1, " command/variable returning a value into an variable:"); truelight@543: IConsolePrint( 1, " temp_uint16 << random"); truelight@543: IConsolePrint( 1, " temp_uint16 << temp_uint16_2"); darkvater@289: IConsolePrint( 1, ""); darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConRandom) darkvater@222: { darkvater@289: _iconsole_var* result; darkvater@222: result = IConsoleVarAlloc(ICONSOLE_VAR_UINT16); darkvater@289: IConsoleVarSetValue(result, rand()); darkvater@222: return result; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConListCommands) darkvater@222: { darkvater@289: const _iconsole_cmd* item; darkvater@289: size_t l = 0; darkvater@222: darkvater@289: if (argv[1] != NULL) l = strlen(argv[1]); darkvater@222: darkvater@289: for (item = _iconsole_cmds; item != NULL; item = item->_next) darkvater@289: if (argv[1] == NULL || strncmp(item->name, argv[1], l) == 0) darkvater@289: IConsolePrintF(_iconsole_color_default, "%s", item->name); darkvater@222: darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConListVariables) darkvater@222: { darkvater@289: const _iconsole_var* item; darkvater@289: size_t l = 0; darkvater@222: darkvater@289: if (argv[1] != NULL) l = strlen(argv[1]); darkvater@222: darkvater@289: for (item = _iconsole_vars; item != NULL; item = item->_next) darkvater@289: if (argv[1] == NULL || strncmp(item->name, argv[1], l) == 0) darkvater@289: IConsolePrintF(_iconsole_color_default, "%s", item->name); darkvater@222: darkvater@222: return NULL; darkvater@222: } darkvater@222: truelight@634: DEF_CONSOLE_CMD(ConListAliases) truelight@634: { truelight@634: const _iconsole_alias* item; truelight@634: size_t l = 0; truelight@634: truelight@634: if (argv[1] != NULL) l = strlen(argv[1]); truelight@634: truelight@634: for (item = _iconsole_aliases; item != NULL; item = item->_next) truelight@634: if (argv[1] == NULL || strncmp(item->name, argv[1], l) == 0) truelight@634: IConsolePrintF(_iconsole_color_default, "%s => %s", item->name, item->cmdline); truelight@634: truelight@634: return NULL; truelight@634: } truelight@634: darkvater@222: DEF_CONSOLE_CMD(ConListDumpVariables) darkvater@222: { darkvater@289: const _iconsole_var* item; darkvater@289: size_t l = 0; darkvater@222: darkvater@289: if (argv[1] != NULL) l = strlen(argv[1]); darkvater@222: darkvater@289: for (item = _iconsole_vars; item != NULL; item = item->_next) darkvater@289: if (argv[1] == NULL || strncmp(item->name, argv[1], l) == 0) darkvater@289: IConsoleVarDump(item, NULL); darkvater@222: darkvater@222: return NULL; darkvater@222: } darkvater@222: truelight@543: #ifdef ENABLE_NETWORK truelight@543: truelight@543: DEF_CONSOLE_CMD(ConSay) truelight@543: { truelight@543: if (argc == 2) { truelight@543: if (!_network_server) truelight@543: SEND_COMMAND(PACKET_CLIENT_CHAT)(NETWORK_ACTION_CHAT, DESTTYPE_BROADCAST, 0 /* param does not matter */, argv[1]); truelight@543: else truelight@543: NetworkServer_HandleChat(NETWORK_ACTION_CHAT, DESTTYPE_BROADCAST, 0, argv[1], NETWORK_SERVER_INDEX); truelight@543: } else truelight@543: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: say \"\""); truelight@543: return NULL; truelight@543: } truelight@543: truelight@543: DEF_CONSOLE_CMD(ConSayPlayer) truelight@543: { truelight@543: if (argc == 3) { truelight@543: if (atoi(argv[1]) < 1 || atoi(argv[1]) > MAX_PLAYERS) { truelight@543: IConsolePrintF(_iconsole_color_default, "Unknown player. Player range is between 1 and %d.", MAX_PLAYERS); truelight@543: return NULL; truelight@543: } truelight@543: truelight@543: if (!_network_server) truelight@543: SEND_COMMAND(PACKET_CLIENT_CHAT)(NETWORK_ACTION_CHAT_PLAYER, DESTTYPE_PLAYER, atoi(argv[1]), argv[2]); truelight@543: else truelight@543: NetworkServer_HandleChat(NETWORK_ACTION_CHAT_PLAYER, DESTTYPE_PLAYER, atoi(argv[1]), argv[2], NETWORK_SERVER_INDEX); truelight@543: } else truelight@543: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: say_player \"\""); truelight@543: return NULL; truelight@543: } truelight@543: truelight@543: DEF_CONSOLE_CMD(ConSayClient) truelight@543: { truelight@543: if (argc == 3) { truelight@543: if (!_network_server) truelight@543: SEND_COMMAND(PACKET_CLIENT_CHAT)(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, atoi(argv[1]), argv[2]); truelight@543: else truelight@543: NetworkServer_HandleChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, atoi(argv[1]), argv[2], NETWORK_SERVER_INDEX); truelight@543: } else truelight@543: IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: say_client \"\""); truelight@543: return NULL; truelight@543: } truelight@543: truelight@623: #endif /* ENABLE_NETWORK */ truelight@543: truelight@623: /* **************************** */ truelight@623: /* the "set" command */ truelight@623: /* **************************** */ truelight@543: truelight@627: extern void ConsoleSetPatchSetting(char *name, char *value); truelight@627: extern void ConsoleGetPatchSetting(char *name); truelight@627: truelight@623: DEF_CONSOLE_CMD(ConSet) { truelight@623: if (argc < 2) { truelight@623: IConsolePrint(_iconsole_color_warning, "Unknonw usage. Usage: set [setting] [value]."); truelight@623: return NULL; truelight@623: } truelight@623: truelight@623: #ifdef ENABLE_NETWORK truelight@623: truelight@623: // setting the server password truelight@623: if ((strcmp(argv[1],"server_pw") == 0) || (strcmp(argv[1],"server_password") == 0)) { truelight@627: if (!_network_server) { truelight@627: IConsolePrintF(_iconsole_color_error, "You are not the server"); truelight@623: return NULL; truelight@623: } truelight@623: if (argc == 3) { truelight@623: // Change server password truelight@665: if (strncmp(argv[2], "*", NETWORK_PASSWORD_LENGTH) == 0) { truelight@1026: _network_server_password[0] = '\0'; truelight@623: _network_game_info.use_password = 0; truelight@623: } else { truelight@1026: ttd_strlcpy(_network_server_password, argv[2], sizeof(_network_server_password)); truelight@623: _network_game_info.use_password = 1; truelight@543: } truelight@1026: IConsolePrintF(_iconsole_color_warning, "Game-password changed to '%s'", _network_server_password); truelight@1026: ttd_strlcpy(_network_game_info.server_password, _network_server_password, sizeof(_network_game_info.server_password)); truelight@623: } else { truelight@623: IConsolePrintF(_iconsole_color_default, "Current game-password is set to '%s'", _network_game_info.server_password); truelight@623: IConsolePrint(_iconsole_color_warning, "Usage: set server_pw \"\". Use * as to set no password."); truelight@543: } truelight@623: return NULL; truelight@543: } truelight@543: truelight@1026: // setting the rcon password truelight@1026: if ((strcmp(argv[1], "rcon_pw") == 0) || (strcmp(argv[1], "rcon_password") == 0)) { truelight@1026: if (!_network_server) { truelight@1026: IConsolePrintF(_iconsole_color_error, "You are not the server"); truelight@1026: return NULL; truelight@1026: } truelight@1026: if (argc == 3) { truelight@1026: // Change server password truelight@1026: if (strncmp(argv[2], "*", NETWORK_PASSWORD_LENGTH) == 0) { truelight@1026: _network_rcon_password[0] = '\0'; truelight@1026: } else { truelight@1026: ttd_strlcpy(_network_rcon_password, argv[2], sizeof(_network_rcon_password)); truelight@1026: } truelight@1026: IConsolePrintF(_iconsole_color_warning, "Rcon-password changed to '%s'", _network_rcon_password); truelight@1026: ttd_strlcpy(_network_game_info.rcon_password, _network_rcon_password, sizeof(_network_game_info.rcon_password)); truelight@1026: } else { truelight@1026: IConsolePrintF(_iconsole_color_default, "Current rcon-password is set to '%s'", _network_game_info.rcon_password); truelight@1026: IConsolePrint(_iconsole_color_warning, "Usage: set rcon_pw \"\". Use * as to disable rcon."); truelight@1026: } truelight@1026: return NULL; truelight@1026: } truelight@1026: truelight@623: // setting the company password truelight@623: if ((strcmp(argv[1],"company_pw") == 0) || (strcmp(argv[1],"company_password") == 0)) { truelight@623: if (!_networking) { truelight@623: IConsolePrintF(_iconsole_color_error,"No network game running"); truelight@623: return NULL; truelight@623: } truelight@623: if (_local_player >= MAX_PLAYERS) { truelight@623: IConsolePrintF(_iconsole_color_default, "You have to own a company to make use of this command."); truelight@623: return NULL; truelight@623: } truelight@623: if (argc == 3) { darkvater@773: NetworkChangeCompanyPassword(argv[2]); truelight@623: } else { darkvater@773: IConsolePrint(_iconsole_color_default, "'set company_pw' sets a password for your company, so no-one without the correct password can join."); truelight@623: IConsolePrint(_iconsole_color_warning, "Usage: set company_pw \"\". Use * as to set no password."); truelight@623: } truelight@623: return NULL; truelight@623: } truelight@623: truelight@623: // setting the player name truelight@623: if (strcmp(argv[1],"name") == 0) { truelight@623: NetworkClientInfo *ci; truelight@623: truelight@623: if (!_networking) { truelight@623: IConsolePrintF(_iconsole_color_error,"No network game running"); truelight@623: return NULL; truelight@623: } truelight@623: truelight@623: ci = NetworkFindClientInfoFromIndex(_network_own_client_index); truelight@623: truelight@623: if (argc == 3 && ci != NULL) { Darkvater@1393: // Don't change the name if it is the same as the old name Darkvater@1395: if (strcmp(ci->client_name, argv[2]) != 0) { Darkvater@1393: if (!_network_server) { Darkvater@1393: SEND_COMMAND(PACKET_CLIENT_SET_NAME)(argv[2]); Darkvater@1393: } else { Darkvater@1393: if (NetworkFindName(argv[2])) { Darkvater@1393: NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, 1, false, ci->client_name, argv[2]); Darkvater@1393: ttd_strlcpy(ci->client_name, argv[2], sizeof(ci->client_name)); Darkvater@1393: NetworkUpdateClientInfo(NETWORK_SERVER_INDEX); Darkvater@1393: } truelight@623: } Darkvater@1393: /* Also keep track of the new name on the client itself */ Darkvater@1393: ttd_strlcpy(_network_player_name, argv[2], sizeof(_network_player_name)); truelight@623: } truelight@623: } else { truelight@623: IConsolePrint(_iconsole_color_default, "With 'set name' you can change your network-player name."); truelight@623: IConsolePrint(_iconsole_color_warning, "Usage: set name \"\"."); truelight@623: } truelight@623: return NULL; truelight@623: } truelight@623: truelight@623: // setting the server name truelight@623: if (strcmp(argv[1],"server_name") == 0) { truelight@627: if (!_network_server) { truelight@627: IConsolePrintF(_iconsole_color_error, "You are not the server"); truelight@623: return NULL; truelight@623: } truelight@623: if (argc == 3) { truelight@693: ttd_strlcpy(_network_server_name, argv[2], sizeof(_network_server_name)); truelight@623: IConsolePrintF(_iconsole_color_warning, "Server-name changed to '%s'", _network_server_name); truelight@665: ttd_strlcpy(_network_game_info.server_name, _network_server_name, sizeof(_network_game_info.server_name)); truelight@623: } else { truelight@623: IConsolePrintF(_iconsole_color_default, "Current server-name is '%s'", _network_server_name); truelight@623: IConsolePrint(_iconsole_color_warning, "Usage: set server_name \"\"."); truelight@623: } truelight@623: return NULL; truelight@623: } truelight@623: truelight@629: // setting the server port truelight@629: if (strcmp(argv[1],"server_port") == 0) { truelight@627: if (argc == 3 && atoi(argv[2]) != 0) { truelight@627: _network_server_port = atoi(argv[2]); truelight@627: IConsolePrintF(_iconsole_color_warning, "Server-port changed to '%d'", _network_server_port); truelight@627: IConsolePrintF(_iconsole_color_warning, "Changes will take effect the next time you start a server."); truelight@627: } else { truelight@627: IConsolePrintF(_iconsole_color_default, "Current server-port is '%d'", _network_server_port); truelight@627: IConsolePrint(_iconsole_color_warning, "Usage: set server_port ."); truelight@627: } truelight@627: return NULL; truelight@627: } truelight@627: truelight@629: // setting the server ip truelight@629: if (strcmp(argv[1],"server_bind_ip") == 0 || strcmp(argv[1],"server_ip_bind") == 0 || truelight@629: strcmp(argv[1],"server_ip") == 0 || strcmp(argv[1],"server_bind") == 0) { truelight@629: if (argc == 3) { truelight@629: _network_server_bind_ip = inet_addr(argv[2]); truelight@629: snprintf(_network_server_bind_ip_host, sizeof(_network_server_bind_ip_host), "%s", inet_ntoa(*(struct in_addr *)&_network_server_bind_ip)); truelight@629: IConsolePrintF(_iconsole_color_warning, "Server-bind-ip changed to '%s'", _network_server_bind_ip_host); truelight@629: IConsolePrintF(_iconsole_color_warning, "Changes will take effect the next time you start a server."); truelight@629: } else { truelight@629: IConsolePrintF(_iconsole_color_default, "Current server-bind-ip is '%s'", _network_server_bind_ip_host); truelight@629: IConsolePrint(_iconsole_color_warning, "Usage: set server_bind_ip ."); truelight@629: } truelight@629: return NULL; truelight@629: } truelight@629: truelight@678: // setting the server advertising on/off truelight@678: if (strcmp(argv[1],"server_advertise") == 0) { truelight@688: if (!_network_server) { truelight@688: IConsolePrintF(_iconsole_color_error, "You are not the server"); truelight@688: return NULL; truelight@688: } truelight@678: if (argc == 3) { truelight@678: if (strcmp(argv[2], "on") == 0 || atoi(argv[2]) == 1) truelight@678: _network_advertise = true; truelight@765: else { truelight@765: NetworkUDPRemoveAdvertise(); truelight@678: _network_advertise = false; truelight@765: } truelight@678: IConsolePrintF(_iconsole_color_warning, "Server-advertise changed to '%s'", (_network_advertise)?"on":"off"); truelight@678: } else { truelight@678: IConsolePrintF(_iconsole_color_default, "Current server-advertise is '%s'", (_network_advertise)?"on":"off"); truelight@678: IConsolePrint(_iconsole_color_warning, "Usage: set server_advertise on/off."); truelight@678: } truelight@678: return NULL; truelight@678: } truelight@678: truelight@690: // setting the server autoclean on/off truelight@690: if (strcmp(argv[1],"autoclean_companies") == 0) { truelight@690: if (!_network_server) { truelight@690: IConsolePrintF(_iconsole_color_error, "You are not the server"); truelight@690: return NULL; truelight@690: } truelight@690: if (argc == 3) { truelight@690: if (strcmp(argv[2], "on") == 0 || atoi(argv[2]) == 1) truelight@690: _network_autoclean_companies = true; truelight@690: else truelight@690: _network_autoclean_companies = false; truelight@690: IConsolePrintF(_iconsole_color_warning, "Autoclean-companies changed to '%s'", (_network_autoclean_companies)?"on":"off"); truelight@690: } else { truelight@690: IConsolePrintF(_iconsole_color_default, "Current autoclean-companies is '%s'", (_network_autoclean_companies)?"on":"off"); truelight@690: IConsolePrint(_iconsole_color_warning, "Usage: set autoclean_companies on/off."); truelight@690: } truelight@690: return NULL; truelight@690: } truelight@690: truelight@690: // setting the server autoclean protected truelight@690: if (strcmp(argv[1],"autoclean_protected") == 0) { truelight@690: if (!_network_server) { truelight@690: IConsolePrintF(_iconsole_color_error, "You are not the server"); truelight@690: return NULL; truelight@690: } truelight@690: if (argc == 3) { truelight@690: _network_autoclean_protected = atoi(argv[2]); truelight@690: IConsolePrintF(_iconsole_color_warning, "Autoclean-protected changed to '%d'", _network_autoclean_protected); truelight@690: } else { truelight@690: IConsolePrintF(_iconsole_color_default, "Current autoclean-protected is '%d'", _network_autoclean_protected); truelight@690: IConsolePrint(_iconsole_color_warning, "Usage: set autoclean_protected ."); truelight@690: } truelight@690: return NULL; truelight@690: } truelight@690: truelight@690: // setting the server autoclean protected truelight@690: if (strcmp(argv[1],"autoclean_unprotected") == 0) { truelight@690: if (!_network_server) { truelight@690: IConsolePrintF(_iconsole_color_error, "You are not the server"); truelight@690: return NULL; truelight@690: } truelight@690: if (argc == 3) { truelight@690: _network_autoclean_unprotected = atoi(argv[2]); truelight@690: IConsolePrintF(_iconsole_color_warning, "Autoclean-unprotected changed to '%d'", _network_autoclean_unprotected); truelight@690: } else { truelight@690: IConsolePrintF(_iconsole_color_default, "Current autoclean-unprotected is '%d'", _network_autoclean_unprotected); truelight@690: IConsolePrint(_iconsole_color_warning, "Usage: set autoclean_unprotected ."); truelight@690: } truelight@690: return NULL; truelight@690: } truelight@690: truelight@785: // setting the server auto restart date truelight@785: if (strcmp(argv[1],"restart_game_date") == 0) { truelight@785: if (!_network_server) { truelight@785: IConsolePrintF(_iconsole_color_error, "You are not the server"); truelight@785: return NULL; truelight@785: } truelight@785: if (argc == 3) { truelight@785: _network_restart_game_date = atoi(argv[2]); truelight@785: IConsolePrintF(_iconsole_color_warning, "Restart Game Date changed to '%d'", _network_restart_game_date); truelight@785: } else { truelight@785: IConsolePrintF(_iconsole_color_default, "Current Restart Game Date is '%d'", _network_restart_game_date); truelight@785: IConsolePrint(_iconsole_color_warning, "Usage: set restart_game_date . '0' means disabled."); truelight@785: IConsolePrint(_iconsole_color_warning, " Auto-restart the server when 1 jan of this year is reached (e.g.: 2030)."); truelight@785: } truelight@785: return NULL; truelight@785: } truelight@785: truelight@629: #endif /* ENABLE_NETWORK */ truelight@623: truelight@625: // Patch-options truelight@625: if (strcmp(argv[1],"patch") == 0) { truelight@625: if (_networking && !_network_server) { truelight@625: IConsolePrintF(_iconsole_color_error, "You are not the server"); truelight@625: return NULL; truelight@625: } truelight@625: if (argc == 3) truelight@625: ConsoleGetPatchSetting(argv[2]); truelight@625: else if (argc == 4) truelight@625: ConsoleSetPatchSetting(argv[2], argv[3]); truelight@625: else truelight@625: IConsolePrint(_iconsole_color_warning, "Usage: set patch []."); truelight@625: return NULL; truelight@625: } truelight@625: truelight@625: truelight@629: IConsolePrint(_iconsole_color_error, "Unknown setting"); truelight@629: IConsolePrint(_iconsole_color_error, "Known settings are:"); truelight@629: #ifdef ENABLE_NETWORK truelight@690: IConsolePrint(_iconsole_color_error, " - autoclean_companies on/off"); truelight@690: IConsolePrint(_iconsole_color_error, " - autoclean_protected "); truelight@690: IConsolePrint(_iconsole_color_error, " - autoclean_unprotected "); truelight@629: IConsolePrint(_iconsole_color_error, " - company_pw \"\""); truelight@629: IConsolePrint(_iconsole_color_error, " - name \"\""); truelight@1026: IConsolePrint(_iconsole_color_error, " - rcon_pw \"\""); truelight@690: IConsolePrint(_iconsole_color_error, " - server_name \"\""); truelight@690: IConsolePrint(_iconsole_color_error, " - server_advertise on/off"); truelight@690: IConsolePrint(_iconsole_color_error, " - server_bind_ip "); truelight@629: IConsolePrint(_iconsole_color_error, " - server_port "); truelight@690: IConsolePrint(_iconsole_color_error, " - server_pw \"\""); truelight@785: IConsolePrint(_iconsole_color_error, " - restart_game_date \"\""); truelight@629: #endif /* ENABLE_NETWORK */ truelight@629: IConsolePrint(_iconsole_color_error, " - patch []"); truelight@623: truelight@543: return NULL; truelight@543: } truelight@543: truelight@543: darkvater@222: #ifdef _DEBUG darkvater@222: /* ****************************************** */ darkvater@222: /* debug commands and variables */ darkvater@222: /* ****************************************** */ darkvater@222: tron@1095: static void IConsoleDebugLibRegister(void) darkvater@222: { truelight@554: // debugging variables and functions darkvater@289: extern bool _stdlib_con_developer; /* XXX extern in .c */ darkvater@247: darkvater@289: IConsoleVarRegister("con_developer", &_stdlib_con_developer, ICONSOLE_VAR_BOOLEAN); truelight@554: IConsoleVarMemRegister("temp_string2", ICONSOLE_VAR_STRING); darkvater@289: IConsoleVarMemRegister("temp_uint16_2", ICONSOLE_VAR_UINT16); darkvater@289: IConsoleCmdRegister("resettile", ConResetTile); truelight@634: IConsoleAliasRegister("dbg_echo","echo %A; echo %B"); truelight@634: IConsoleAliasRegister("dbg_echo2","echo %+"); darkvater@222: } darkvater@222: #endif darkvater@222: darkvater@222: /* ****************************************** */ darkvater@222: /* console command and variable registration */ darkvater@222: /* ****************************************** */ darkvater@222: truelight@543: void IConsoleStdLibRegister(void) darkvater@222: { darkvater@222: // stdlib darkvater@289: extern byte _stdlib_developer; /* XXX extern in .c */ darkvater@222: truelight@554: // default variables and functions darkvater@289: IConsoleCmdRegister("debug_level", ConDebugLevel); darkvater@289: IConsoleCmdRegister("dump_vars", ConListDumpVariables); darkvater@289: IConsoleCmdRegister("echo", ConEcho); darkvater@289: IConsoleCmdRegister("echoc", ConEchoC); darkvater@289: IConsoleCmdRegister("exec", ConExec); darkvater@289: IConsoleCmdRegister("exit", ConExit); darkvater@289: IConsoleCmdRegister("help", ConHelp); darkvater@289: IConsoleCmdRegister("info_cmd", ConInfoCmd); darkvater@289: IConsoleCmdRegister("info_var", ConInfoVar); darkvater@289: IConsoleCmdRegister("list_cmds", ConListCommands); darkvater@289: IConsoleCmdRegister("list_vars", ConListVariables); truelight@634: IConsoleCmdRegister("list_aliases", ConListAliases); truelight@543: IConsoleCmdRegister("newgame", ConNewGame); darkvater@289: IConsoleCmdRegister("printf", ConPrintF); darkvater@289: IConsoleCmdRegister("printfc", ConPrintFC); darkvater@289: IConsoleCmdRegister("quit", ConExit); darkvater@289: IConsoleCmdRegister("random", ConRandom); darkvater@289: IConsoleCmdRegister("resetengines", ConResetEngines); darkvater@289: IConsoleCmdRegister("return", ConReturn); truelight@554: IConsoleCmdRegister("screenshot", ConScreenShot); truelight@554: IConsoleCmdRegister("script", ConScript); truelight@554: IConsoleCmdRegister("scrollto", ConScrollToTile); truelight@623: IConsoleCmdRegister("set", ConSet); truelight@634: IConsoleCmdRegister("alias", ConAlias); truelight@885: IConsoleCmdRegister("load", ConLoad); Darkvater@1565: IConsoleCmdRegister("save", ConSave); truelight@885: IConsoleCmdRegister("list_files", ConListFiles); darkvater@932: IConsoleCmdRegister("scan_files", ConScanFiles); truelight@885: IConsoleCmdRegister("goto_dir", ConGotoDir); darkvater@932: IConsoleAliasRegister("new_game", "newgame"); darkvater@932: IConsoleAliasRegister("newmap", "newgame"); darkvater@932: IConsoleAliasRegister("new_map", "newgame"); darkvater@932: IConsoleAliasRegister("load_game", "temp_string << scan_files %!;load temp_string"); truelight@554: truelight@554: IConsoleVarRegister("developer", &_stdlib_developer, ICONSOLE_VAR_BYTE); truelight@554: darkvater@932: // temporary data containers for alias scripting darkvater@932: IConsoleVarMemRegister("temp_string", ICONSOLE_VAR_STRING); darkvater@932: IConsoleVarMemRegister("temp_bool", ICONSOLE_VAR_BOOLEAN); darkvater@932: IConsoleVarMemRegister("temp_int16", ICONSOLE_VAR_INT16); darkvater@932: IConsoleVarMemRegister("temp_int32", ICONSOLE_VAR_INT32); darkvater@932: IConsoleVarMemRegister("temp_pointer", ICONSOLE_VAR_POINTER); darkvater@932: IConsoleVarMemRegister("temp_uint16", ICONSOLE_VAR_UINT16); darkvater@932: IConsoleVarMemRegister("temp_uint32", ICONSOLE_VAR_UINT32); darkvater@932: darkvater@932: truelight@554: // networking variables and functions truelight@543: #ifdef ENABLE_NETWORK truelight@543: IConsoleCmdRegister("say", ConSay); truelight@543: IConsoleCmdHook("say", ICONSOLE_HOOK_ACCESS, ConCmdHookNeedNetwork); truelight@543: IConsoleCmdRegister("say_player", ConSayPlayer); truelight@543: IConsoleCmdHook("say_player", ICONSOLE_HOOK_ACCESS, ConCmdHookNeedNetwork); truelight@543: IConsoleCmdRegister("say_client", ConSayClient); truelight@543: IConsoleCmdHook("say_client", ICONSOLE_HOOK_ACCESS, ConCmdHookNeedNetwork); truelight@554: IConsoleCmdRegister("kick", ConKick); truelight@554: IConsoleCmdHook("kick", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); truelight@688: IConsoleCmdRegister("reset_company", ConResetCompany); truelight@688: IConsoleCmdHook("reset_company", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); truelight@554: IConsoleCmdRegister("connect", ConNetworkConnect); truelight@554: IConsoleCmdHook("connect", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetServer); truelight@554: IConsoleCmdRegister("clients", ConNetworkClients); truelight@543: IConsoleCmdRegister("status", ConStatus); truelight@543: IConsoleCmdHook("status", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); truelight@554: IConsoleCmdHook("resetengines", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetwork); truelight@554: truelight@1026: IConsoleCmdRegister("rcon", ConRcon); truelight@1026: IConsoleCmdHook("rcon", ICONSOLE_HOOK_ACCESS, ConCmdHookNeedNetwork); truelight@1026: truelight@841: IConsoleCmdRegister("ban", ConBan); truelight@841: IConsoleCmdHook("ban", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); truelight@841: IConsoleCmdRegister("unban", ConUnBan); truelight@841: IConsoleCmdHook("unban", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); truelight@841: IConsoleCmdRegister("banlist", ConBanList); truelight@841: IConsoleCmdHook("banlist", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); darkvater@1147: IConsoleCmdRegister("pause", ConPauseGame); darkvater@1147: IConsoleCmdHook("pause", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); darkvater@1147: IConsoleCmdRegister("unpause", ConUnPauseGame); darkvater@1147: IConsoleCmdHook("unpause", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); truelight@841: truelight@784: IConsoleAliasRegister("clean_company", "reset_company %A"); truelight@688: truelight@554: IConsoleVarRegister("net_frame_freq", &_network_frame_freq, ICONSOLE_VAR_UINT8); truelight@554: IConsoleVarHook("net_frame_freq", ICONSOLE_HOOK_ACCESS, ConVarHookNoNetClient); truelight@554: IConsoleVarRegister("net_sync_freq", &_network_sync_freq, ICONSOLE_VAR_UINT16); truelight@554: IConsoleVarHook("net_sync_freq", ICONSOLE_HOOK_ACCESS, ConVarHookNoNetClient); truelight@543: #endif /* ENABLE_NETWORK */ darkvater@222: truelight@554: // debugging stuff truelight@554: #ifdef _DEBUG truelight@554: IConsoleDebugLibRegister(); truelight@554: #endif darkvater@222: darkvater@222: } darkvater@289: /* -------------------- don't cross this line --------------------- */