void Server::startGame() { output.removeMessage(Interface::WAITING_FOR_OPPONENT); resetScore(); // it could be we are serving at this moment output.removeMessage(Interface::YOU_SERVE); player[0]->detachBall(0.0); // create new players delete player[0]; delete player[1]; player.clear(); for (std::map<grapple_user, Peer>::iterator i = peer.begin(); i != peer.end(); ++i) { Side side = (i->first == localid ? FRONT : BACK); i->second.player = new Player(this, i->second.name, side, field.getLength()/2.0f); player.push_back(i->second.player); i->second.player->run(); } // now we are up & .. state = RUNNING; sendSimplePacket(READY); // reset ball in a cool way output.addMessage(Interface::FLASH_GAME_STARTED); ballouttimer = addTimer(10, BALLOUT, this); // tell pause state if (paused) sendSimplePacket(PAUSE_REQUEST); else sendSimplePacket(RESUME_REQUEST); // tell our initial position Vec2f pos = peer[localid].player->getPosition(); Buffer sbuf(PADDLEPOSITION); sbuf.pushId(localid); sbuf.pushDouble(pos.y); sbuf.pushDouble(pos.x); sendPacket(sbuf, false); }
void Framework::togglePause(bool pause, bool external) { PacketType t; if ((((external)&&(pause))||((!external)&&(paused == 0)))&&(state != CONNECTING)) { paused = SDL_GetTicks() - lasttime; SDL_ShowCursor(1); SDL_WM_GrabInput(SDL_GRAB_OFF); output.togglePaused(true); t = PAUSE_REQUEST; } else { lasttime = SDL_GetTicks() + paused; paused = 0; if (state != CONNECTING) { SDL_ShowCursor(0); SDL_WM_GrabInput(SDL_GRAB_ON); } output.togglePaused(false); t = RESUME_REQUEST; } if (!external) sendSimplePacket(t); }
NetworkServer::AutoPacket NetworkServer::processPacket(const Packet& raw) { unsigned char kind = packetKind(raw); // User packets if (kind >= ID_NOT_INTERNAL) { AutoPacket packet(_manager.create(kind)); if (packet.get()) { return packet; } packetHeader(std::cout, raw); std::cout << "Unknown user packet detected: " << int(kind) << std::endl; return AutoPacket(new TamperPacket); } switch (kind) { // A client just connected for the first time case ID_NEW_INCOMING_CONNECTION: { // TODO: Timeout for no login return AutoPacket(); } // A client is asking to login/register case ID_ACCOUNT_LOGIN: { const User *user = createUser(raw); unsigned char sendKind = ID_ACCOUNT_FAILURE; AutoPacket packet; if (user) { sendKind = ID_ACCOUNT_SUCCESS; packet.reset(new ConnectionPacket()); } NetworkParams params(sendKind, HIGH_PRIORITY); sendSimplePacket(*_peer, params, raw.systemAddress); return packet; } // A client has disconnected case ID_DISCONNECTION_NOTIFICATION: case ID_CONNECTION_LOST: { User *user = findUser(raw.systemAddress); if (!user) { return AutoPacket(); } assert(!_queuedUser); _queuedUser = user; std::string reason; switch (kind) { case ID_DISCONNECTION_NOTIFICATION: reason = "The client closed the connection."; break; default: reason = "The connection to the client was lost."; } return AutoPacket(new DisconnectionPacket(reason)); } // A packet was tampered with in transit case ID_MODIFIED_PACKET: return AutoPacket(new TamperPacket()); // Some other packet we don't care about default: packetHeader(std::cout, raw); std::cout << "Unused system packet ignored: " << int(kind) << std::endl; return AutoPacket(); } }