Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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();
	}
}