summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-02-27 10:50:41 +0100
committerPatric Stout <github@truebrain.nl>2021-02-28 12:27:04 +0100
commit8d199b1bbc2f7f0db98b47b709b75ff97b23e730 (patch)
tree29c578948f8d26f0a1d34e7cb4f641b5fb0c80a2 /src/network
parent3677418225c069b7b6b16f3d0855a772f0e47c0a (diff)
downloadopenttd-8d199b1bbc2f7f0db98b47b709b75ff97b23e730.tar.xz
Fix: [Network] send map to next client if current client disconnects
Also terminate creating of the savegame, as the client is gone, there really is no need for that anymore.
Diffstat (limited to 'src/network')
-rw-r--r--src/network/network_server.cpp59
-rw-r--r--src/network/network_server.h2
2 files changed, 40 insertions, 21 deletions
diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp
index 9a0c6a3bb..bef5a5350 100644
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -281,6 +281,16 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
}
}
+ /* If we were transfering a map to this client, stop the savegame creation
+ * process and queue the next client to receive the map. */
+ if (this->status == STATUS_MAP) {
+ /* Ensure the saving of the game is stopped too. */
+ this->savegame->Destroy();
+ this->savegame = nullptr;
+
+ this->CheckNextClientToSendMap(this);
+ }
+
NetworkAdminClientError(this->client_id, NETWORK_ERROR_CONNECTION_LOST);
DEBUG(net, 1, "Closed client connection %d", this->client_id);
@@ -565,6 +575,33 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait()
return NETWORK_RECV_STATUS_OKAY;
}
+void ServerNetworkGameSocketHandler::CheckNextClientToSendMap(NetworkClientSocket *ignore_cs)
+{
+ /* Find the best candidate for joining, i.e. the first joiner. */
+ NetworkClientSocket *best = nullptr;
+ for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
+ if (ignore_cs == new_cs) continue;
+
+ if (new_cs->status == STATUS_MAP_WAIT) {
+ if (best == nullptr || best->GetInfo()->join_date > new_cs->GetInfo()->join_date || (best->GetInfo()->join_date == new_cs->GetInfo()->join_date && best->client_id > new_cs->client_id)) {
+ best = new_cs;
+ }
+ }
+ }
+
+ /* Is there someone else to join? */
+ if (best != nullptr) {
+ /* Let the first start joining. */
+ best->status = STATUS_AUTHORIZED;
+ best->SendMap();
+
+ /* And update the rest. */
+ for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
+ if (new_cs->status == STATUS_MAP_WAIT) new_cs->SendWait();
+ }
+ }
+}
+
/** This sends the map to the client */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
{
@@ -620,27 +657,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
* to send it is ready (maybe that happens like never ;)) */
this->status = STATUS_DONE_MAP;
- /* Find the best candidate for joining, i.e. the first joiner. */
- NetworkClientSocket *best = nullptr;
- for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
- if (new_cs->status == STATUS_MAP_WAIT) {
- if (best == nullptr || best->GetInfo()->join_date > new_cs->GetInfo()->join_date || (best->GetInfo()->join_date == new_cs->GetInfo()->join_date && best->client_id > new_cs->client_id)) {
- best = new_cs;
- }
- }
- }
-
- /* Is there someone else to join? */
- if (best != nullptr) {
- /* Let the first start joining. */
- best->status = STATUS_AUTHORIZED;
- best->SendMap();
-
- /* And update the rest. */
- for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
- if (new_cs->status == STATUS_MAP_WAIT) new_cs->SendWait();
- }
- }
+ this->CheckNextClientToSendMap();
}
switch (this->SendPackets()) {
diff --git a/src/network/network_server.h b/src/network/network_server.h
index 3dfcf5594..4e099a7fa 100644
--- a/src/network/network_server.h
+++ b/src/network/network_server.h
@@ -80,6 +80,8 @@ public:
NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override;
void GetClientName(char *client_name, const char *last) const;
+ void CheckNextClientToSendMap(NetworkClientSocket *ignore_cs = nullptr);
+
NetworkRecvStatus SendMap();
NetworkRecvStatus SendErrorQuit(ClientID client_id, NetworkErrorCode errorno);
NetworkRecvStatus SendQuit(ClientID client_id);