changeset 6847:506a6e1063f4 draft

(svn r10087) -Fix [FS#834]: multiple subsequent "give money" actions could result in duplicate messages that money has been transfered when it only happened once.
author rubidium <rubidium@openttd.org>
date Sun, 10 Jun 2007 21:34:45 +0000
parents a5bd2c7b1159
children 2dcc88253d83
files src/callback_table.cpp src/main_gui.cpp
diffstat 2 files changed, 19 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/callback_table.cpp
+++ b/src/callback_table.cpp
@@ -33,6 +33,7 @@
 CommandCallback CcPlaceSign;
 CommandCallback CcTerraform;
 CommandCallback CcBuildTown;
+CommandCallback CcGiveMoney;
 
 /* rail_gui.cpp */
 CommandCallback CcPlaySound1E;
@@ -87,7 +88,8 @@
 	/* 0x17 */ CcCloneShip,
 	/* 0x18 */ CcCloneTrain,
 	/* 0x19 */ CcAI,
-	/* 0x1A */ CcCloneVehicle
+	/* 0x1A */ CcCloneVehicle,
+	/* 0x1B */ CcGiveMoney,
 };
 
 const int _callback_table_count = lengthof(_callback_table);
--- a/src/main_gui.cpp
+++ b/src/main_gui.cpp
@@ -58,6 +58,21 @@
 extern bool GenerateTowns();
 
 
+void CcGiveMoney(bool success, TileIndex tile, uint32 p1, uint32 p2)
+{
+	if (!success) return;
+
+	char msg[20];
+	/* Inform the player of this action */
+	snprintf(msg, sizeof(msg), "%d", p1);
+
+	if (!_network_server) {
+		SEND_COMMAND(PACKET_CLIENT_CHAT)(NETWORK_ACTION_GIVE_MONEY, DESTTYPE_TEAM, p2, msg);
+	} else {
+		NetworkServer_HandleChat(NETWORK_ACTION_GIVE_MONEY, DESTTYPE_TEAM, p2, msg, NETWORK_SERVER_INDEX);
+	}
+}
+
 void HandleOnEditText(const char *str)
 {
 	int id = _rename_id;
@@ -75,22 +90,11 @@
 	case 3: { // Give money, you can only give money in excess of loan
 		const Player *p = GetPlayer(_current_player);
 		int32 money = min(p->money64 - p->current_loan, atoi(str) / _currency->rate);
-		char msg[20];
 
 		money = clamp(money, 0, 20000000); // Clamp between 20 million and 0
 
 		/* Give 'id' the money, and substract it from ourself */
-		int32 ret = DoCommandP(0, money, id, NULL, CMD_GIVE_MONEY | CMD_MSG(STR_INSUFFICIENT_FUNDS));
-		if (CmdFailed(ret) || ret == 0) break; // We either did something wrong, or we don't have any money anymore
-
-		/* Inform the player of this action */
-		snprintf(msg, sizeof(msg), "%d", money);
-
-		if (!_network_server) {
-			SEND_COMMAND(PACKET_CLIENT_CHAT)(NETWORK_ACTION_GIVE_MONEY, DESTTYPE_TEAM, id, msg);
-		} else {
-			NetworkServer_HandleChat(NETWORK_ACTION_GIVE_MONEY, DESTTYPE_TEAM, id, msg, NETWORK_SERVER_INDEX);
-		}
+		DoCommandP(0, money, id, CcGiveMoney, CMD_GIVE_MONEY | CMD_MSG(STR_INSUFFICIENT_FUNDS));
 	} break;
 #endif /* ENABLE_NETWORK */
 		default: NOT_REACHED();