bool Server::update() { if (grapple_server_messages_waiting(m_server)) { grapple_message *message = grapple_server_message_pull(m_server); switch (message->type) { case GRAPPLE_MSG_NEW_USER: //Your code to handle this message std::cout << "new user!\n"; break; case GRAPPLE_MSG_USER_NAME: //Your code to handle this message std::cout << "user name!\n"; break; case GRAPPLE_MSG_USER_MSG: { grapple_user origin = message->USER_MSG.id; Message m( message->USER_MSG.data, message->USER_MSG.length ); if( m_message_callbacks.find( m.id() ) != m_message_callbacks.end() ) { // callback MessageCallback t = m_message_callbacks[m.id()];//( &m ); (this->*t)( origin, &m ); } else std::cerr << "Server::update: unable to handle message " << m.id() << std::endl; }break; case GRAPPLE_MSG_USER_DISCONNECTED: //Your code to handle this message std::cout << "user disconnected!\n"; break; } grapple_message_dispose(message); } return false; }
void Server::doNetworking() { grapple_message *message; while (grapple_server_messages_waiting(server)) { message = grapple_server_message_pull(server); switch (message->type) { case GRAPPLE_MSG_NEW_USER: peer[message->NEW_USER.id] = Peer(grapple_server_client_address_get(server, message->NEW_USER.id)); std::cerr << "client connected from " << peer[message->NEW_USER.id].name << std::endl; break; case GRAPPLE_MSG_USER_NAME: peer[message->USER_NAME.id].name = message->USER_NAME.name; break; case GRAPPLE_MSG_USER_MSG: { grapple_user id = message->USER_MSG.id; Buffer buf((char*)message->USER_MSG.data, message->USER_MSG.length); switch (buf.getType()) { case READY: peer[id].ready = true; if (peer.size() > 1) { bool ready = true; for (std::map<grapple_user, Peer>::iterator i = peer.begin(); i != peer.end(); ++i) { if (!(*i).second.ready) { ready = false; break; } } if (ready) startGame(); } break; case PADDLEMOVE: { unsigned int time = buf.popInt(); peer[id].player->move(buf.popDouble(), buf.popDouble(), time); Vec2f pos = peer[id].player->getPosition(); Buffer sbuf(PADDLEPOSITION); sbuf.pushId(id); sbuf.pushDouble(pos.y); sbuf.pushDouble(pos.x); sendPacket(sbuf, false); } break; case SERVE_BALL: peer[id].player->detachBall(ballspeed); break; case PAUSE_REQUEST: togglePause(true, true); std::cout << "Player " << peer[id].name << " paused the game." << std::endl; break; case RESUME_REQUEST: togglePause(false, true); std::cout << "Player " << peer[id].name << " resumed the game." << std::endl; break; } break; } case GRAPPLE_MSG_USER_DISCONNECTED: std::cout << "Player " << peer[message->USER_DISCONNECTED.id].name << " disconnected!" << std::endl; shutdown(); break; } grapple_message_dispose(message); } while (grapple_client_messages_waiting(loopback)) { message=grapple_client_message_pull(loopback); switch (message->type) { case GRAPPLE_MSG_NEW_USER_ME: { localid = message->NEW_USER.id; peer[localid].player = new Player(this, peer[localid].name, FRONT, field.getLength()/2.0f); player.push_back(peer[localid].player); peer[localid].player->attachBall(&ball[0]); output.addMessage(Interface::YOU_SERVE); peer[localid].ready = true; state = WAITING; } break; } grapple_message_dispose(message); } }