diff options
-rw-r--r-- | lang/english.txt | 2 | ||||
-rw-r--r-- | network_client.c | 2 | ||||
-rw-r--r-- | network_data.h | 1 | ||||
-rw-r--r-- | network_server.c | 33 |
4 files changed, 28 insertions, 10 deletions
diff --git a/lang/english.txt b/lang/english.txt index 74d0fe97d..2c33409f9 100644 --- a/lang/english.txt +++ b/lang/english.txt @@ -1336,6 +1336,7 @@ STR_NETWORK_ERR_WRONG_REVISION :{WHITE} The revision of this client does not STR_NETWORK_ERR_WRONG_PASSWORD :{WHITE} Wrong password STR_NETWORK_ERR_SERVER_FULL :{WHITE} The server is full STR_NETWORK_ERR_KICKED :{WHITE} You were kicked out of the game +STR_NETWORK_ERR_CHEATER :{WHITE} Cheating is not allowed on this server STR_NETWORK_ERR_LEFT :has left the game ############ Leave those lines in this order!! @@ -1351,6 +1352,7 @@ STR_NETWORK_ERR_CLIENT_NAME_IN_USE :name already in use STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD :wrong game-password STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH :wrong player-id in DoCommand STR_NETWORK_ERR_CLIENT_KICKED :kicked by server +STR_NETWORK_ERR_CLIENT_CHEATER :was trying to use a cheat ############ End of leave-in-this-order STR_NETWORK_CLIENT_JOINED :has joined the game STR_NETWORK_GIVE_MONEY :gave your company some money ({CURRENCY}) diff --git a/network_client.c b/network_client.c index e5a4d600d..49e9a215f 100644 --- a/network_client.c +++ b/network_client.c @@ -377,6 +377,8 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR) _switch_mode_errorstr = STR_NETWORK_ERR_WRONG_PASSWORD; } else if (error == NETWORK_ERROR_KICKED) { _switch_mode_errorstr = STR_NETWORK_ERR_KICKED; + } else if (error == NETWORK_ERROR_CHEATER) { + _switch_mode_errorstr = STR_NETWORK_ERR_CHEATER; } DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0); diff --git a/network_data.h b/network_data.h index 6839cfecd..e68e61d3a 100644 --- a/network_data.h +++ b/network_data.h @@ -87,6 +87,7 @@ typedef enum { NETWORK_ERROR_WRONG_PASSWORD, NETWORK_ERROR_PLAYER_MISMATCH, // Happens in CLIENT_COMMAND NETWORK_ERROR_KICKED, + NETWORK_ERROR_CHEATER, } NetworkErrorCode; // Actions that can be used for NetworkTextMessage diff --git a/network_server.c b/network_server.c index 59665cfa9..a42d7b5c8 100644 --- a/network_server.c +++ b/network_server.c @@ -785,16 +785,29 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND) SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_PLAYER_MISMATCH); return; } - if (cp->cmd == CMD_PLAYER_CTRL) { - if (cp->p1 == 0) - // UGLY! p2 is mis-used to get the client-id in CmdPlayerCtrl - cp->p2 = cs - _clients; - else { - /* We do NOT allow any client to send any PLAYER_CTRL packet.. - (they can delete random players with it if they like */ - SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_PLAYER_MISMATCH); - return; - } + switch (cp->cmd) { + /* Player_ctrl is not always allowed */ + case CMD_PLAYER_CTRL: + { + /* cp->p1 == 0, is allowed */ + if (cp->p1 == 0) { + // UGLY! p2 is mis-used to get the client-id in CmdPlayerCtrl + cp->p2 = cs - _clients; + } else { + /* The rest are cheats */ + SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_CHEATER); + return; + } + } break; + + /* Don't allow those commands if server == advertising (considered cheating) */ + case CMD_MONEY_CHEAT: + { + if (_network_advertise) { + SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_CHEATER); + return; + } + } break; } |