示例#1
0
    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);
        }
    }
示例#2
0
    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);
                }
            }
        }
    }