コード例 #1
0
ファイル: Server.cpp プロジェクト: SharkDX/PenguinBasket
void Server::ProcessPacket(ENetPacket* packet, ENetPeer* peer)
{
	//TOOD Need to change it to a more effienct method like in the client.
	//TODO Maybe move the server related logic to handle here before assign the packets to the client?

	unsigned char header = packet->data[0];
	Client* client = (Client*)peer->data;
	DataBuffer dataBuffer = DataBuffer(((char*)packet->data + 1), packet->dataLength - 1);

	switch (header)
	{
		case PACKET_HAND_SHAKE:
		{
			int protocolVersion = 0;
			memcpy(&protocolVersion, &packet->data[1], sizeof(int));
			client->QueueIncomingPacket(std::shared_ptr<Packet>(new PacketHandshake(protocolVersion, (short)client->GetPlayerID())));
			break;
		}
		case PACKET_PING:
		{
			client->SendPacket(std::shared_ptr<Packet>(new PacketPing()));
			break;
		}
		case PACKET_PLAYER_POSITION:
		{
			short playerID = 0;
			memcpy(&playerID, &packet->data[1], sizeof(short));

			float posX = 0;
			memcpy(&posX, &packet->data[3], sizeof(float));

			float posY = 0;
			memcpy(&posY, &packet->data[7], sizeof(float));

			float velX = 0;
			memcpy(&velX, &packet->data[11], sizeof(float));

			float velY = 0;
			memcpy(&velY, &packet->data[15], sizeof(float));

			//Logger::Print("%d, %f, %f", playerID, posX, posY);
			client->QueueIncomingPacket(std::make_shared<PacketPlayerPosition>(playerID, posX, posY, velX, velY));
			break;
		}
		case PACKET_CREATE_BLOCK:
		{
			char blockID = dataBuffer.ReadChar();
			short chunkPos = dataBuffer.ReadShort(); //TODO Use that when the engine will run on chunks
			short posX = dataBuffer.ReadShort();
			short posY = dataBuffer.ReadShort();
			client->QueueIncomingPacket(std::make_shared<PacketCreateBlock>(blockID, chunkPos, posX, posY));
			break;
		}
		case PACKET_DESTROY_BLOCK:
		{
			short chunkPos = dataBuffer.ReadShort(); //TODO Use that when the engine will run on chunks
			short posX = dataBuffer.ReadShort();
			short posY = dataBuffer.ReadShort();
			client->QueueIncomingPacket(std::make_shared<PacketDestroyBlock>(chunkPos, posX, posY));
			break;
		}
	}
}