aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/ServerConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/ServerConnection.cpp')
-rw-r--r--Minecraft.Client/ServerConnection.cpp38
1 files changed, 26 insertions, 12 deletions
diff --git a/Minecraft.Client/ServerConnection.cpp b/Minecraft.Client/ServerConnection.cpp
index 07616aa4..0f96e032 100644
--- a/Minecraft.Client/ServerConnection.cpp
+++ b/Minecraft.Client/ServerConnection.cpp
@@ -46,19 +46,30 @@ void ServerConnection::handleConnection(shared_ptr<PendingConnection> uc)
void ServerConnection::stop()
{
+ std::vector<shared_ptr<PendingConnection> > pendingSnapshot;
EnterCriticalSection(&pending_cs);
- for (unsigned int i = 0; i < pending.size(); i++)
- {
- shared_ptr<PendingConnection> uc = pending[i];
- uc->connection->close(DisconnectPacket::eDisconnect_Closed);
- }
+ pendingSnapshot = pending;
LeaveCriticalSection(&pending_cs);
- for (unsigned int i = 0; i < players.size(); i++)
+ for (unsigned int i = 0; i < pendingSnapshot.size(); i++)
{
- shared_ptr<PlayerConnection> player = players[i];
- player->connection->close(DisconnectPacket::eDisconnect_Closed);
- }
+ shared_ptr<PendingConnection> uc = pendingSnapshot[i];
+ if (uc != NULL && !uc->done)
+ {
+ uc->disconnect(DisconnectPacket::eDisconnect_Closed);
+ }
+ }
+
+ // Snapshot to avoid iterator invalidation if disconnect modifies the vector.
+ std::vector<shared_ptr<PlayerConnection> > playerSnapshot = players;
+ for (unsigned int i = 0; i < playerSnapshot.size(); i++)
+ {
+ shared_ptr<PlayerConnection> player = playerSnapshot[i];
+ if (player != NULL && !player->done)
+ {
+ player->disconnect(DisconnectPacket::eDisconnect_Quitting);
+ }
+ }
}
void ServerConnection::tick()
@@ -78,7 +89,7 @@ void ServerConnection::tick()
// uc.disconnect("Internal server error");
// logger.log(Level.WARNING, "Failed to handle packet: " + e, e);
// }
- if(uc->connection != NULL) uc->connection->flush();
+ if(uc->connection != nullptr) uc->connection->flush();
}
}
@@ -107,7 +118,10 @@ void ServerConnection::tick()
players.erase(players.begin()+i);
i--;
}
- player->connection->flush();
+ else
+ {
+ player->connection->flush();
+ }
}
}
@@ -167,7 +181,7 @@ void ServerConnection::handleServerSettingsChanged(shared_ptr<ServerSettingsChan
{
for(unsigned int i = 0; i < pMinecraft->levels.length; ++i)
{
- if( pMinecraft->levels[i] != NULL )
+ if( pMinecraft->levels[i] != nullptr )
{
app.DebugPrintf("ClientConnection::handleServerSettingsChanged - Difficulty = %d",packet->data);
pMinecraft->levels[i]->difficulty = packet->data;