changeset 18967:564906300417 draft

(svn r23822) -Fix-ish: when replaying make sure companies get created even if their creating client doesn't exist during the replay
author rubidium <rubidium@openttd.org>
date Tue, 17 Jan 2012 21:13:02 +0000
parents e23cdc70d5aa
children 4b9bcd5070ef
files src/company_cmd.cpp src/network/network_internal.h
diffstat 2 files changed, 32 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/company_cmd.cpp
+++ b/src/company_cmd.cpp
@@ -810,7 +810,13 @@
 			/* Has the network client a correct ClientIndex? */
 			if (!(flags & DC_EXEC)) return CommandCost();
 			NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id);
+#ifndef DEBUG_DUMP_COMMANDS
+			/* When replaying the client ID is not a valid client; there
+			 * are actually no clients at all. However, the company has to
+			 * be created, otherwise we cannot rerun the game properly.
+			 * So only allow a NULL client info in that case. */
 			if (ci == NULL) return CommandCost();
+#endif /* NOT DEBUG_DUMP_COMMANDS */
 
 			/* Delete multiplayer progress bar */
 			DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
@@ -842,13 +848,17 @@
 			}
 
 			if (_network_server) {
-				ci->client_playas = c->index;
-				NetworkUpdateClientInfo(ci->client_id);
+				if (ci != NULL) {
+					/* ci is only NULL when replaying.
+					 * When replaying no client is actually in need of an update. */
+					ci->client_playas = c->index;
+					NetworkUpdateClientInfo(ci->client_id);
+				}
 
-				if (Company::IsValidID(ci->client_playas)) {
+				if (Company::IsValidID(c->index)) {
 					_network_company_states[c->index].months_empty = 0;
 					_network_company_states[c->index].password[0] = '\0';
-					NetworkServerUpdateCompanyPassworded(ci->client_playas, false);
+					NetworkServerUpdateCompanyPassworded(c->index, false);
 
 					/* XXX - When a client joins, we automatically set its name to the
 					 * client's name (for some reason). As it stands now only the server
@@ -861,12 +871,24 @@
 					 * TODO: Perhaps this could be improved by when the client is ready
 					 * with joining to let it send itself the command, and not the server?
 					 * For example in network_client.c:534? */
-					NetworkSendCommand(0, 0, 0, CMD_RENAME_PRESIDENT, NULL, ci->client_name, ci->client_playas);
+					if (ci != NULL) {
+						/* ci is only NULL when replaying.
+						 * When replaying, the command to rename the president will
+						 * automatically be ran, so this is not even needed to get
+						 * the exact same state. */
+						NetworkSendCommand(0, 0, 0, CMD_RENAME_PRESIDENT, NULL, ci->client_name, c->index);
+					}
 				}
 
 				/* Announce new company on network. */
 				NetworkAdminCompanyInfo(c, true);
-				NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, ci->client_playas + 1);
+
+				if (ci != NULL) {
+					/* ci is only NULL when replaying.
+					 * When replaying, the message that someone started a new company
+					 * is not interesting at all. */
+					NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, c->index + 1);
+				}
 			}
 #endif /* ENABLE_NETWORK */
 			break;
--- a/src/network/network_internal.h
+++ b/src/network/network_internal.h
@@ -43,6 +43,10 @@
  * Used to load the desync debug logs, i.e. for reproducing a desync.
  * There's basically no need to ever enable this, unless you really know what
  * you are doing, i.e. debugging a desync.
+ *
+ * NOTE: Define DEBUG_DUMP_COMMANDS in network.h or globally, else it does not
+ *       have enough effects. For example CmdCompanyCtrl needs it to be able
+ *       to create companies when there are not clients on this server.
  */
 #ifdef DEBUG_DUMP_COMMANDS
 extern bool _ddc_fastforward;