void Client::readServerPacket(ENetEvent& event, uint32_t tick) { std::shared_ptr<ReadPacket> packet = getReadPacket(event.packet); Serial::Error::Error err = Serial::Error::Success; switch (packet->type) { case PacketType::NewClient: packet->reader.handleInt32(FAWorld::World::get()->getCurrentPlayer()->mId); break; case PacketType::Level: receiveLevel(packet); break; case PacketType::Sprite: err = readSpriteResponse(packet); break; case PacketType::GameUpdateMessage: handleGameUpdateMessage(packet, tick); break; default: assert(false && "BAD PACKET TYPE RECEIVED"); } if (err != Serial::Error::Success) { std::cerr << "Serialisation read error " << Serial::Error::getName(err) << std::endl; exit(1); } }
void NetManager::readServerPacket(ENetEvent& event) { if(event.packet->flags & ENET_PACKET_FLAG_RELIABLE) { size_t position = 0; if(mClientRecievedId == false) { mClientRecievedId = true; size_t playerId; readFromPacket(event.packet, position, playerId); FAWorld::World::get()->getCurrentPlayer()->mId = playerId; return; } int32_t typeHeader; readFromPacket(event.packet, position, typeHeader); switch(typeHeader) { case ReliableMessageKind::Level: { readLevel(event.packet, position); FAWorld::World::get()->setLevel(0); break; } case ReliableMessageKind::Sprite: { readSpriteResponse(event.packet, position); break; } } } else { FAWorld::World& world = *FAWorld::World::get(); size_t position = 0; ServerPacketHeader header; readFromPacket(event.packet, position, header); if(header.tick > mLastServerTickProcessed) { for(size_t i = 0; i < header.numPlayers; i++) { int32_t classId; int32_t actorId; readFromPacket(event.packet, position, classId); readFromPacket(event.packet, position, actorId); FAWorld::Actor* actor = world.getActorById(actorId); if(actor == NULL) { actor = dynamic_cast<FAWorld::Actor*>(FAWorld::NetObject::construct(classId)); actor->mId = actorId; } actor->readFrom(event.packet, position); } } } }