mirror of https://github.com/OpenTTD/OpenTTD
(svn r26576) -Fix [FS#6003]: [Network] AIs would not reset certain network state information upon creation of their company
parent
a363b2c317
commit
4a52300838
|
@ -855,59 +855,19 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||||
MarkWholeScreenDirty();
|
MarkWholeScreenDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_network_server) {
|
NetworkServerNewCompany(c, ci);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* ENABLE_NETWORK */
|
#endif /* ENABLE_NETWORK */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 1: // Make a new AI company
|
case 1: { // Make a new AI company
|
||||||
if (!(flags & DC_EXEC)) return CommandCost();
|
if (!(flags & DC_EXEC)) return CommandCost();
|
||||||
|
|
||||||
if (company_id != INVALID_COMPANY && (company_id >= MAX_COMPANIES || Company::IsValidID(company_id))) return CMD_ERROR;
|
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;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 2: { // Delete a company
|
case 2: { // Delete a company
|
||||||
CompanyRemoveReason reason = (CompanyRemoveReason)GB(p2, 0, 2);
|
CompanyRemoveReason reason = (CompanyRemoveReason)GB(p2, 0, 2);
|
||||||
|
|
|
@ -71,7 +71,7 @@ void NetworkServerYearlyLoop();
|
||||||
void NetworkServerSendConfigUpdate();
|
void NetworkServerSendConfigUpdate();
|
||||||
void NetworkServerShowStatusToConsole();
|
void NetworkServerShowStatusToConsole();
|
||||||
bool NetworkServerStart();
|
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);
|
bool NetworkServerChangeClientName(ClientID client_id, const char *new_name);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
#endif /* ENABLE_NETWORK */
|
||||||
|
|
|
@ -123,6 +123,7 @@ public:
|
||||||
|
|
||||||
void NetworkServer_Tick(bool send_frame);
|
void NetworkServer_Tick(bool send_frame);
|
||||||
void NetworkServerSetCompanyPassword(CompanyID company_id, const char *password, bool already_hashed = true);
|
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.
|
* Iterate over all the sockets from a given starting point.
|
||||||
|
|
Loading…
Reference in New Issue