Changeset - r21467:8b87202cc00f
[Not reviewed]
master
0 4 0
rubidium - 11 years ago 2014-05-11 12:52:21
rubidium@openttd.org
(svn r26576) -Fix [FS#6003]: [Network] AIs would not reset certain network state information upon creation of their company
4 files changed with 34 insertions and 46 deletions:
0 comments (0 inline, 0 general)
src/company_cmd.cpp
Show inline comments
 
@@ -855,59 +855,19 @@ CommandCost CmdCompanyCtrl(TileIndex til
 
				MarkWholeScreenDirty();
 
			}
 

	
 
			if (_network_server) {
 
				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(c->index)) {
 
					_network_company_states[c->index].months_empty = 0;
 
					_network_company_states[c->index].password[0] = '\0';
 
					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
 
					 * knows the client's name, so it needs to send out a "broadcast" to
 
					 * do this. To achieve this we send a network command. However, it
 
					 * uses _local_company to execute the command as.  To prevent abuse
 
					 * (eg. only yourself can change your name/company), we 'cheat' by
 
					 * impersonation _local_company as the server. Not the best solution;
 
					 * but it works.
 
					 * 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? */
 
					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);
 

	
 
				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);
 
				}
 
			}
 
			NetworkServerNewCompany(c, ci);
 
#endif /* ENABLE_NETWORK */
 
			break;
 
		}
 

	
 
		case 1: // Make a new AI company
 
		case 1: { // Make a new AI company
 
			if (!(flags & DC_EXEC)) return CommandCost();
 

	
 
			if (company_id != INVALID_COMPANY && (company_id >= MAX_COMPANIES || Company::IsValidID(company_id))) return CMD_ERROR;
 
			DoStartupNewCompany(true, company_id);
 
			Company *c = DoStartupNewCompany(true, company_id);
 
			if (c != NULL) NetworkServerNewCompany(c, NULL);
 
			break;
 
		}
 

	
 
		case 2: { // Delete a company
 
			CompanyRemoveReason reason = (CompanyRemoveReason)GB(p2, 0, 2);
src/network/network_func.h
Show inline comments
 
@@ -71,7 +71,7 @@ void NetworkServerYearlyLoop();
 
void NetworkServerSendConfigUpdate();
 
void NetworkServerShowStatusToConsole();
 
bool NetworkServerStart();
 
void NetworkServerUpdateCompanyPassworded(CompanyID company_id, bool passworded);
 
void NetworkServerNewCompany(const Company *company, NetworkClientInfo *ci);
 
bool NetworkServerChangeClientName(ClientID client_id, const char *new_name);
 

	
 

	
src/network/network_server.cpp
Show inline comments
 
@@ -2173,4 +2173,31 @@ void NetworkPrintClients()
 
	}
 
}
 

	
 
/**
 
 * Perform all the server specific administration of a new company.
 
 * @param c  The newly created company; can't be NULL.
 
 * @param ci The client information of the client that made the company; can be NULL.
 
 */
 
void NetworkServerNewCompany(const Company *c, NetworkClientInfo *ci)
 
{
 
	assert(c != NULL);
 

	
 
	if (!_network_server) return;
 

	
 
	_network_company_states[c->index].months_empty = 0;
 
	_network_company_states[c->index].password[0] = '\0';
 
	NetworkServerUpdateCompanyPassworded(c->index, false);
 

	
 
	if (ci != NULL) {
 
		/* ci is NULL when replaying, or for AIs. In neither case there is a client. */
 
		ci->client_playas = c->index;
 
		NetworkUpdateClientInfo(ci->client_id);
 
		NetworkSendCommand(0, 0, 0, CMD_RENAME_PRESIDENT, NULL, ci->client_name, c->index);
 
		NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, c->index + 1);
 
	}
 

	
 
	/* Announce new company on network. */
 
	NetworkAdminCompanyInfo(c, true);
 
}
 

	
 
#endif /* ENABLE_NETWORK */
src/network/network_server.h
Show inline comments
 
@@ -123,6 +123,7 @@ public:
 

	
 
void NetworkServer_Tick(bool send_frame);
 
void NetworkServerSetCompanyPassword(CompanyID company_id, const char *password, bool already_hashed = true);
 
void NetworkServerUpdateCompanyPassworded(CompanyID company_id, bool passworded);
 

	
 
/**
 
 * Iterate over all the sockets from a given starting point.
0 comments (0 inline, 0 general)