summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortruelight <truelight@openttd.org>2004-12-21 17:31:10 +0000
committertruelight <truelight@openttd.org>2004-12-21 17:31:10 +0000
commit19e384261584366cfc339a93eff96d7c411a6541 (patch)
tree3ac5effcddc64108d8ab997ed95c5f2a2f7d1bab
parent8ab0190c294b243b9544203a7cdaf6d3c40718d5 (diff)
downloadopenttd-19e384261584366cfc339a93eff96d7c411a6541.tar.xz
(svn r1204) -Add: [Network] Added some cheaters-protection (money-cheat mostly)
-rw-r--r--lang/english.txt2
-rw-r--r--network_client.c2
-rw-r--r--network_data.h1
-rw-r--r--network_server.c33
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;
}