summaryrefslogtreecommitdiff
path: root/src/economy.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2011-02-05 10:38:31 +0000
committerrubidium <rubidium@openttd.org>2011-02-05 10:38:31 +0000
commit50d646ca7bdbd9e1150280f00bc2da218093c4f4 (patch)
tree7ca78fc5b6718ea1940eddff968438501f2a62eb /src/economy.cpp
parentbdf5a1c2f7077323c26e1c99a22dcc80a7b50245 (diff)
downloadopenttd-50d646ca7bdbd9e1150280f00bc2da218093c4f4.tar.xz
(svn r21970) -Fix [FS#4464]: Crash when a multiplayer company goes bankrupt with 'you' in it
Diffstat (limited to 'src/economy.cpp')
-rw-r--r--src/economy.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/economy.cpp b/src/economy.cpp
index a5f338825..2b09a8d26 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -285,13 +285,16 @@ int UpdateCompanyRatingAndValue(Company *c, bool update)
/* use INVALID_OWNER as new_owner to delete the company. */
void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
{
+ /* We need to set _current_company to old_owner before we try to move
+ * the client. This is needed as it needs to know whether "you" really
+ * are the current local company. */
+ Backup<CompanyByte> cur_company(_current_company, old_owner, FILE_LINE);
#ifdef ENABLE_NETWORK
/* In all cases, make spectators of clients connected to that company */
if (_networking) NetworkClientsToSpectators(old_owner);
#endif /* ENABLE_NETWORK */
Town *t;
- Backup<CompanyByte> cur_company(_current_company, old_owner, FILE_LINE);
assert(old_owner != new_owner);
@@ -520,8 +523,16 @@ static void CompanyCheckBankrupt(Company *c)
break;
}
- /* Actually remove the company. */
- DoCommand(0, 2 | (c->index << 16), 0, DC_EXEC, CMD_COMPANY_CTRL);
+ /* Actually remove the company, but not when we're a network client.
+ * In case of network clients we will be getting a command from the
+ * server. It is done in this way as we are called from the
+ * StateGameLoop which can't change the current company, and thus
+ * updating the local company triggers an assert later on. In the
+ * case of a network game the command will be processed at a time
+ * that changing the current company is okay. In case of single
+ * player we are sure (the above check) that we are not the local
+ * company and thus we won't be moved. */
+ if (!_networking || _network_server) DoCommandP(0, 2 | (c->index << 16), 0, CMD_COMPANY_CTRL);
break;
}
}