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; } } }