void GameServer::handleDisconnections() { for (auto itr = mPeers.begin(); itr != mPeers.end(); ) { if ((*itr)->timedOut) { // Inform everyone of the disconnection, erase for (sf::Int32 identifier : (*itr)->aircraftIdentifiers) { sendToAll(sf::Packet() << static_cast<sf::Int32>(Server::PlayerDisconnect) << identifier); mAircraftInfo.erase(identifier); } mConnectedPlayers--; mAircraftCount -= (*itr)->aircraftIdentifiers.size(); itr = mPeers.erase(itr); // Go back to a listening state if needed if (mConnectedPlayers < mMaxConnectedPlayers) { mPeers.push_back(PeerPtr(new RemotePeer())); setListening(true); } broadcastMessage("An ally has disconnected."); } else { ++itr; } } }
void GameServer::handleIncomingConnections() { if (!mListeningState) return; if (mListenerSocket.accept(mPeers[mConnectedPlayers]->socket) == sf::TcpListener::Done) { // order the new client to spawn its own plane ( player 1 ) mAircraftInfo[mAircraftIdentifierCounter].position = sf::Vector2f(mBattleFieldRect.width / 2, mBattleFieldRect.top + mBattleFieldRect.height / 2); mAircraftInfo[mAircraftIdentifierCounter].hitpoints = 100; mAircraftInfo[mAircraftIdentifierCounter].missileAmmo = 2; sf::Packet packet; packet << static_cast<sf::Int32>(Server::SpawnSelf); packet << mAircraftIdentifierCounter; packet << mAircraftInfo[mAircraftIdentifierCounter].position.x; packet << mAircraftInfo[mAircraftIdentifierCounter].position.y; mPeers[mConnectedPlayers]->aircraftIdentifiers.push_back(mAircraftIdentifierCounter); broadcastMessage("New player!"); informWorldState(mPeers[mConnectedPlayers]->socket); notifyPlayerSpawn(mAircraftIdentifierCounter++); mPeers[mConnectedPlayers]->socket.send(packet); mPeers[mConnectedPlayers]->ready = true; mPeers[mConnectedPlayers]->lastPacketTime = now(); // prevent initial timeouts mAircraftCount++; mConnectedPlayers++; if (mConnectedPlayers >= mMaxConnectedPlayers) setListening(false); else // Add a new waiting peer mPeers.push_back(PeerPtr(new RemotePeer())); } }