|
@@ -188,14 +188,15 @@ DEF_CONSOLE_CMD(ConSave)
|
|
|
|
|
|
snprintf(buf, lengthof(buf), "%s%s%s.sav", _path.save_dir, PATHSEP, argv[1]);
|
|
|
IConsolePrint(_icolour_def, "Saving map...");
|
|
|
|
|
|
if (SaveOrLoad(buf, SL_SAVE) != SL_OK) {
|
|
|
IConsolePrint(_icolour_err, "SaveMap failed");
|
|
|
} else
|
|
|
} else {
|
|
|
IConsolePrintF(_icolour_def, "Map sucessfully saved to %s", buf);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -244,14 +245,15 @@ DEF_CONSOLE_CMD(ConLoad)
|
|
|
|
|
|
ttd_strlcpy(_file_to_saveload.name, FiosBrowseTo(item), sizeof(_file_to_saveload.name));
|
|
|
ttd_strlcpy(_file_to_saveload.title, item->title, sizeof(_file_to_saveload.title));
|
|
|
} break;
|
|
|
default: IConsolePrintF(_icolour_err, "%s: Not a savegame.", file);
|
|
|
}
|
|
|
} else
|
|
|
} else {
|
|
|
IConsolePrintF(_icolour_err, "%s: No such file or directory.", file);
|
|
|
}
|
|
|
|
|
|
FiosFreeSavegameList();
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -269,14 +271,15 @@ DEF_CONSOLE_CMD(ConRemove)
|
|
|
|
|
|
file = argv[1];
|
|
|
item = GetFiosItem(file);
|
|
|
if (item != NULL) {
|
|
|
if (!FiosDelete(item->name))
|
|
|
IConsolePrintF(_icolour_err, "%s: Failed to delete file", file);
|
|
|
} else
|
|
|
} else {
|
|
|
IConsolePrintF(_icolour_err, "%s: No such file or directory.", file);
|
|
|
}
|
|
|
|
|
|
FiosFreeSavegameList();
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -320,14 +323,15 @@ DEF_CONSOLE_CMD(ConChangeDirectory)
|
|
|
switch (item->type) {
|
|
|
case FIOS_TYPE_DIR: case FIOS_TYPE_DRIVE: case FIOS_TYPE_PARENT:
|
|
|
FiosBrowseTo(item);
|
|
|
break;
|
|
|
default: IConsolePrintF(_icolour_err, "%s: Not a directory.", file);
|
|
|
}
|
|
|
} else
|
|
|
} else {
|
|
|
IConsolePrintF(_icolour_err, "%s: No such file or directory.", file);
|
|
|
}
|
|
|
|
|
|
FiosFreeSavegameList();
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_CMD(ConPrintWorkingDirectory)
|
|
@@ -405,14 +409,15 @@ DEF_CONSOLE_CMD(ConBan)
|
|
|
}
|
|
|
|
|
|
if (ci != NULL) {
|
|
|
banip = inet_ntoa(*(struct in_addr *)&ci->client_ip);
|
|
|
SEND_COMMAND(PACKET_SERVER_ERROR)(NetworkFindClientStateFromIndex(index), NETWORK_ERROR_KICKED);
|
|
|
IConsolePrint(_icolour_def, "Client banned");
|
|
|
} else
|
|
|
} else {
|
|
|
IConsolePrint(_icolour_def, "Client not online, banned IP");
|
|
|
}
|
|
|
|
|
|
/* Add user to ban-list */
|
|
|
for (index = 0; index < lengthof(_network_ban_list); index++) {
|
|
|
if (_network_ban_list[index] == NULL) {
|
|
|
_network_ban_list[index] = strdup(banip);
|
|
|
break;
|
|
@@ -478,14 +483,15 @@ DEF_CONSOLE_CMD(ConPauseGame)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (_pause == 0) {
|
|
|
DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
|
|
|
IConsolePrint(_icolour_def, "Game paused.");
|
|
|
} else
|
|
|
} else {
|
|
|
IConsolePrint(_icolour_def, "Game is already paused.");
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_CMD(ConUnPauseGame)
|
|
|
{
|
|
@@ -494,14 +500,15 @@ DEF_CONSOLE_CMD(ConUnPauseGame)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (_pause != 0) {
|
|
|
DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
|
|
|
IConsolePrint(_icolour_def, "Game unpaused.");
|
|
|
} else
|
|
|
} else {
|
|
|
IConsolePrint(_icolour_def, "Game is already unpaused.");
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_CMD(ConRcon)
|
|
|
{
|
|
@@ -516,26 +523,35 @@ DEF_CONSOLE_CMD(ConRcon)
|
|
|
SEND_COMMAND(PACKET_CLIENT_RCON)(argv[1], argv[2]);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_CMD(ConStatus)
|
|
|
{
|
|
|
static const char *stat_str[] = {"inactive", "authorized", "waiting", "loading map", "map done", "ready", "active"};
|
|
|
const char *status;
|
|
|
static const char* const stat_str[] = {
|
|
|
"inactive",
|
|
|
"authorized",
|
|
|
"waiting",
|
|
|
"loading map",
|
|
|
"map done",
|
|
|
"ready",
|
|
|
"active"
|
|
|
};
|
|
|
|
|
|
const NetworkClientState *cs;
|
|
|
|
|
|
if (argc == 0) {
|
|
|
IConsoleHelp("List the status of all clients connected to the server. Usage 'status'");
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
FOR_ALL_CLIENTS(cs) {
|
|
|
int lag = NetworkCalculateLag(cs);
|
|
|
const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
|
|
const char* status;
|
|
|
|
|
|
status = (cs->status <= STATUS_ACTIVE) ? stat_str[cs->status] : "unknown";
|
|
|
status = (cs->status <= lengthof(stat_str) ? stat_str[cs->status] : "unknown");
|
|
|
IConsolePrintF(8, "Client #%1d name: '%s' status: '%s' frame-lag: %3d company: %1d IP: %s unique-id: '%s'",
|
|
|
cs->index, ci->client_name, status, lag, ci->client_playas, GetPlayerIP(ci), ci->unique_id);
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -555,33 +571,36 @@ DEF_CONSOLE_CMD(ConServerInfo)
|
|
|
IConsolePrintF(_icolour_def, "Current/maximum companies: %2d/%2d", ActivePlayerCount(), gi->companies_max);
|
|
|
IConsolePrintF(_icolour_def, "Current/maximum spectators: %2d/%2d", NetworkSpectatorCount(), gi->spectators_max);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_HOOK(ConHookValidateMaxClientsCount) {
|
|
|
DEF_CONSOLE_HOOK(ConHookValidateMaxClientsCount)
|
|
|
{
|
|
|
/* XXX - hardcoded, string limiation -- TrueLight
|
|
|
* XXX - also see network.c:NetworkStartup ~1356 */
|
|
|
if (_network_game_info.clients_max > 10) {
|
|
|
_network_game_info.clients_max = 10;
|
|
|
IConsoleError("Maximum clients out of bounds, truncating to limit.");
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_HOOK(ConHookValidateMaxCompaniesCount) {
|
|
|
DEF_CONSOLE_HOOK(ConHookValidateMaxCompaniesCount)
|
|
|
{
|
|
|
if (_network_game_info.companies_max > MAX_PLAYERS) {
|
|
|
_network_game_info.companies_max = MAX_PLAYERS;
|
|
|
IConsoleError("Maximum companies out of bounds, truncating to limit.");
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_HOOK(ConHookValidateMaxSpectatorsCount) {
|
|
|
DEF_CONSOLE_HOOK(ConHookValidateMaxSpectatorsCount)
|
|
|
{
|
|
|
/* XXX @see ConHookValidateMaxClientsCount */
|
|
|
if (_network_game_info.spectators_max > 10) {
|
|
|
_network_game_info.spectators_max = 10;
|
|
|
IConsoleError("Maximum spectators out of bounds, truncating to limit.");
|
|
|
}
|
|
|
|
|
@@ -618,14 +637,15 @@ DEF_CONSOLE_CMD(ConKick)
|
|
|
IConsoleError("Invalid client");
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (ci != NULL) {
|
|
|
SEND_COMMAND(PACKET_SERVER_ERROR)(NetworkFindClientStateFromIndex(index), NETWORK_ERROR_KICKED);
|
|
|
} else
|
|
|
} else {
|
|
|
IConsoleError("Client not found");
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_CMD(ConResetCompany)
|
|
|
{
|
|
@@ -971,13 +991,15 @@ DEF_CONSOLE_CMD(ConDebugLevel)
|
|
|
}
|
|
|
|
|
|
if (argc > 2) return false;
|
|
|
|
|
|
if (argc == 1) {
|
|
|
IConsolePrintF(_icolour_def, "Current debug-level: '%s'", GetDebugString());
|
|
|
} else SetDebugString(argv[1]);
|
|
|
} else {
|
|
|
SetDebugString(argv[1]);
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_CMD(ConExit)
|
|
|
{
|
|
@@ -1123,14 +1145,15 @@ DEF_CONSOLE_CMD(ConSay)
|
|
|
}
|
|
|
|
|
|
if (argc != 2) return false;
|
|
|
|
|
|
if (!_network_server) {
|
|
|
SEND_COMMAND(PACKET_CLIENT_CHAT)(NETWORK_ACTION_CHAT, DESTTYPE_BROADCAST, 0 /* param does not matter */, argv[1]);
|
|
|
} else
|
|
|
} else {
|
|
|
NetworkServer_HandleChat(NETWORK_ACTION_CHAT, DESTTYPE_BROADCAST, 0, argv[1], NETWORK_SERVER_INDEX);
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_CMD(ConPlayers)
|
|
|
{
|
|
@@ -1173,14 +1196,15 @@ DEF_CONSOLE_CMD(ConSayPlayer)
|
|
|
IConsolePrintF(_icolour_def, "Unknown player. Player range is between 1 and %d.", MAX_PLAYERS);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (!_network_server) {
|
|
|
SEND_COMMAND(PACKET_CLIENT_CHAT)(NETWORK_ACTION_CHAT_PLAYER, DESTTYPE_PLAYER, atoi(argv[1]), argv[2]);
|
|
|
} else
|
|
|
} else {
|
|
|
NetworkServer_HandleChat(NETWORK_ACTION_CHAT_PLAYER, DESTTYPE_PLAYER, atoi(argv[1]), argv[2], NETWORK_SERVER_INDEX);
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_CMD(ConSayClient)
|
|
|
{
|
|
@@ -1191,14 +1215,15 @@ DEF_CONSOLE_CMD(ConSayClient)
|
|
|
}
|
|
|
|
|
|
if (argc != 3) return false;
|
|
|
|
|
|
if (!_network_server) {
|
|
|
SEND_COMMAND(PACKET_CLIENT_CHAT)(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, atoi(argv[1]), argv[2]);
|
|
|
} else
|
|
|
} else {
|
|
|
NetworkServer_HandleChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, atoi(argv[1]), argv[2], NETWORK_SERVER_INDEX);
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
DEF_CONSOLE_HOOK(ConHookServerPW)
|
|
|
{
|
|
@@ -1311,14 +1336,15 @@ DEF_CONSOLE_CMD(ConPatch)
|
|
|
}
|
|
|
|
|
|
if (argc == 1 || argc > 3) return false;
|
|
|
|
|
|
if (argc == 2) {
|
|
|
IConsoleGetPatchSetting(argv[1]);
|
|
|
} else
|
|
|
} else {
|
|
|
IConsoleSetPatchSetting(argv[1], argv[2]);
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
#endif /* ENABLE_NETWORK */
|
|
|
|
|
|
DEF_CONSOLE_CMD(ConListDumpVariables)
|