void ServerPacketHandlerSystem::handleLobby() { while( m_server->hasNewPackets() ) { Packet packet = m_server->popNewPacket(); char packetType; packetType = packet.getPacketType(); if(packetType == (char)PacketType::ChangeStatePacket){ ChangeStatePacket statePacket; statePacket.unpack(packet); if(statePacket.m_gameState == GameStates::INITGAME){ ChangeStatePacket newState; newState.m_serverState = ServerStates::LOADING; m_stateSystem->setQueuedState(ServerStates::LOADING); m_server->broadcastPacket(newState.pack()); } } else if(packetType == (char)PacketType::PlayerInfo){ PlayerInfo playerInfo; playerInfo.unpack(packet); PlayerSystem* playerSystem = static_cast<PlayerSystem*> (m_world->getSystem(SystemType::PlayerSystem)); vector<Entity*> connectedPlayers = playerSystem->getActiveEntities(); //Add the entity here to be used by other systems Entity* newPlayer = m_world->createEntity(); PlayerComponent* newComp = new PlayerComponent(); if( playerInfo.playerName == "brightestmind" && playerInfo.playerID == 0){ newComp->setAbsoluteScore(9001); } else if(playerInfo.playerName=="judas"){ newComp->setAbsoluteScore(-9001); } newComp->m_playerName = playerInfo.playerName; newComp->m_playerID = playerInfo.playerID; //connectedPlayers.size(); newComp->m_networkID = packet.getSenderId(); newPlayer->addComponent(newComp); m_world->addEntity(newPlayer); NewlyConnectedPlayerPacket connectedPlayer; connectedPlayer.playerName = newComp->m_playerName; connectedPlayer.playerID = newComp->m_playerID; connectedPlayer.score = newComp->getScore(); connectedPlayer.networkID = newComp->m_networkID; // Broadcast the player to all clients. m_server->broadcastPacket(connectedPlayer.pack()); for (unsigned int i = 0; i < connectedPlayers.size(); i++){ NewlyConnectedPlayerPacket alreadyConnectedPlayers; PlayerComponent* playerComp; playerComp = static_cast<PlayerComponent*> (connectedPlayers[i]->getComponent(ComponentType::PlayerComponent)); alreadyConnectedPlayers.playerID = playerComp->m_playerID; alreadyConnectedPlayers.playerName = playerComp->m_playerName; alreadyConnectedPlayers.networkID = playerComp->m_networkID; // Send all the existing players to the new client. m_server->unicastPacket(alreadyConnectedPlayers.pack(), newComp->m_networkID); //m_server->broadcastPacket(alreadyConnectedPlayers.pack()); } // Force all players to be set unready. memset(&m_lobbyPlayerReadyStates, 0, sizeof(m_lobbyPlayerReadyStates)); } else if(packetType == (char)PacketType::ClientDisconnect){ DisconnectPacket dcPacket; dcPacket.unpack(packet); // Remove client! PlayerSystem* playerSystem = static_cast<PlayerSystem*> (m_world->getSystem(SystemType::PlayerSystem)); playerSystem->deletePlayerEntity(dcPacket.playerID); // Broadcast the dc packet back to all clients, including the one who sent it. m_server->broadcastPacket(packet); // Force all players to be set unready. memset(&m_lobbyPlayerReadyStates, 0, sizeof(m_lobbyPlayerReadyStates)); m_world->getOutputLogger()->write(("Server detected a disconnect packet for player: " + toString(dcPacket.playerID) + "\n").c_str()); } else if(packetType == (char)PacketType::PlayerReadyPacket){ // Broadcast the ready packet back to all clients, including the one who sent it. m_server->broadcastPacket(packet); PlayerReadyPacket readyPacket; readyPacket.unpack(packet); m_lobbyPlayerReadyStates[readyPacket.playerId] = readyPacket.ready; // Check so that all players are ready! m_readyLobbyPlayers = 0; for (int i = 0; i < MAXPLAYERS; i++) { if (m_lobbyPlayerReadyStates[i]) m_readyLobbyPlayers++; } m_world->getOutputLogger()->write( ("Players ready: " + toString(m_readyLobbyPlayers) + "\n").c_str() ); PlayerSystem* playerSystem = static_cast<PlayerSystem*> (m_world->getSystem(SystemType::PlayerSystem)); if (m_readyLobbyPlayers >= playerSystem->getActiveEntities().size()) { ChangeStatePacket newState; newState.m_serverState = ServerStates::LOADING; m_stateSystem->setQueuedState(ServerStates::LOADING); m_server->broadcastPacket(newState.pack()); } } else if( packetType == (char)PacketType::Ping ) { // ========================================= // PINGPACKET // ========================================= PingPacket pingPacket; pingPacket.unpack( packet ); Packet response((char)PacketType::Pong); response << pingPacket.timeStamp; m_server->unicastPacket( response, packet.getSenderId() ); } else if( packetType == (char)PacketType::Pong) { // ========================================= // PONGPACKET // ========================================= //auto clientInfo = static_cast<ClientInfo*>(m_world->getEntityManager()->get) float totalElapsedTime = m_world->getElapsedTime(); float timeWhenSent; PongPacket pongPacket; pongPacket.unpack( packet ); timeWhenSent = pongPacket.timeStamp; /************************************************************************/ /* Convert from seconds to milliseconds. */ /************************************************************************/ float ping = (totalElapsedTime - timeWhenSent)*1000.0f; //m_clients[packet.getSenderId()] = info; auto playerSys = static_cast<PlayerSystem*>( m_world->getSystem(SystemType::PlayerSystem)); PlayerComponent* playerComp = playerSys->findPlayerComponentFromNetworkID(packet.getSenderId()); if (playerComp) playerComp->m_ping = ping; } else { printPacketTypeNotHandled("Lobby", (int)packetType); } } }