diff --git a/console_cmds.c b/console_cmds.c index 1cb33ede12..3c2a8e0c9c 100644 --- a/console_cmds.c +++ b/console_cmds.c @@ -214,6 +214,59 @@ DEF_CONSOLE_CMD(ConKick) return NULL; } +DEF_CONSOLE_CMD(ConResetCompany) +{ + Player *p; + ClientState *cs; + NetworkClientInfo *ci; + + if (argc == 2) { + uint32 index = atoi(argv[1]); + + /* Check valid range */ + if (index < 1 || index > MAX_PLAYERS) { + IConsolePrintF(_iconsole_color_error, "Company does not exist. Company-ID must be between 1 and %d.", MAX_PLAYERS); + return NULL; + } + + /* Check if company does exist */ + index--; + p = DEREF_PLAYER(index); + if (!p->is_active) { + IConsolePrintF(_iconsole_color_error, "Company does not exist."); + return NULL; + } + + if (p->is_ai) { + IConsolePrintF(_iconsole_color_error, "Company is owned by an AI."); + return NULL; + } + + /* Check if the company has active players */ + FOR_ALL_CLIENTS(cs) { + ci = DEREF_CLIENT_INFO(cs); + if (ci->client_playas-1 == index) { + IConsolePrintF(_iconsole_color_error, "Cannot remove company: a client is connected to that company."); + return NULL; + } + } + ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX); + if (ci->client_playas-1 == index) { + IConsolePrintF(_iconsole_color_error, "Cannot remove company: a client is connected to that company."); + return NULL; + } + + /* It is safe to remove this company */ + DoCommandP(0, 2, index, NULL, CMD_PLAYER_CTRL); + IConsolePrint(_iconsole_color_default, "Company deleted."); + return NULL; + } + + IConsolePrint(_iconsole_color_default, "Unknown usage. Usage: reset_company ."); + + return NULL; +} + DEF_CONSOLE_CMD(ConNetworkClients) { NetworkClientInfo *ci; @@ -720,6 +773,10 @@ DEF_CONSOLE_CMD(ConSet) { // setting the server advertising on/off if (strcmp(argv[1],"server_advertise") == 0) { + if (!_network_server) { + IConsolePrintF(_iconsole_color_error, "You are not the server"); + return NULL; + } if (argc == 3) { if (strcmp(argv[2], "on") == 0 || atoi(argv[2]) == 1) _network_advertise = true; @@ -844,6 +901,8 @@ void IConsoleStdLibRegister(void) IConsoleCmdHook("say_client", ICONSOLE_HOOK_ACCESS, ConCmdHookNeedNetwork); IConsoleCmdRegister("kick", ConKick); IConsoleCmdHook("kick", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); + IConsoleCmdRegister("reset_company", ConResetCompany); + IConsoleCmdHook("reset_company", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); IConsoleCmdRegister("connect", ConNetworkConnect); IConsoleCmdHook("connect", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetServer); IConsoleCmdRegister("clients", ConNetworkClients); @@ -851,6 +910,8 @@ void IConsoleStdLibRegister(void) IConsoleCmdHook("status", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetClient); IConsoleCmdHook("resetengines", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetwork); + IConsoleAliasRegister("clean_company", "reset_company"); + IConsoleVarRegister("net_frame_freq", &_network_frame_freq, ICONSOLE_VAR_UINT8); IConsoleVarHook("net_frame_freq", ICONSOLE_HOOK_ACCESS, ConVarHookNoNetClient); IConsoleVarRegister("net_sync_freq", &_network_sync_freq, ICONSOLE_VAR_UINT16); diff --git a/players.c b/players.c index 2bddbecee0..377001ff3e 100644 --- a/players.c +++ b/players.c @@ -629,7 +629,7 @@ static void DeletePlayerStuff(int pi) // functionality. // 0 - make new player // 1 - make new AI player -// 2 - delete player (p1 >> 8) & 0xFF +// 2 - delete player (p2) // 3 - join player (p1 >> 8) & 0xFF with (p1 >> 16) & 0xFF int32 CmdPlayerCtrl(int x, int y, uint32 flags, uint32 p1, uint32 p2) { @@ -686,9 +686,23 @@ int32 CmdPlayerCtrl(int x, int y, uint32 flags, uint32 p1, uint32 p2) DoStartupNewPlayer(true); break; case 2: // delete player - pi = (byte)(p1 >> 8); - ChangeOwnershipOfPlayerItems(pi, 255); - DeletePlayerStuff(pi); + p = DEREF_PLAYER(p2); + + /* Only allow removal of HUMAN companies */ + if (IS_HUMAN_PLAYER(p2)) { + /* Delete any open window of the company */ + DeletePlayerWindows(p2); + + /* Show the bankrupt news */ + SetDParam(0, p->name_1); + SetDParam(1, p->name_2); + AddNewsItem( (StringID)(p2 + 16*3), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0); + + /* Remove the company */ + ChangeOwnershipOfPlayerItems(p2, 255); + p->money64 = p->player_money = 100000000; + p->is_active = false; + } break; case 3: // join player