diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 9b5c4d4f30..4e8f8b932d 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -53,6 +53,7 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket"); + packetReceiver.registerListener(PacketType::AvatarIdentityRequest, this, "handleAvatarIdentityRequestPacket"); packetReceiver.registerListenerForTypes({ PacketType::ReplicatedAvatarIdentity, @@ -602,6 +603,36 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes _handleAvatarIdentityPacketElapsedTime += (end - start); } +void AvatarMixer::handleAvatarIdentityRequestPacket(QSharedPointer message, SharedNodePointer senderNode) { + if (message->getSize() < NUM_BYTES_RFC4122_UUID) { + qCDebug(avatars) << "Malformed AvatarIdentityRequest received from" << message->getSenderSockAddr().toString(); + return; + } + + QUuid avatarID(QUuid::fromRfc4122(message->getMessage()) ); + if (!avatarID.isNull()) { + auto nodeList = DependencyManager::get(); + + nodeList->eachNode([&](SharedNodePointer node) { + QMutexLocker lock(&node->getMutex()); + if (node->getType() == NodeType::Agent && node->getLinkedData()) { + AvatarMixerClientData* avatarClientData = dynamic_cast(node->getLinkedData()); + if (avatarClientData) { + const AvatarData& avatarData = avatarClientData->getAvatar(); + if (avatarData.getID() == avatarID) { + QByteArray serializedAvatar = avatarData.identityByteArray(); + auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); + identityPackets->write(serializedAvatar); + nodeList->sendPacketList(std::move(identityPackets), *senderNode); + } + } + } + } + ); + + } +} + void AvatarMixer::handleKillAvatarPacket(QSharedPointer message, SharedNodePointer node) { auto start = usecTimestampNow(); handleAvatarKilled(node); diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 9ef5903eec..c27ca33729 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -54,6 +54,7 @@ private slots: void handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode); void handleReplicatedPacket(QSharedPointer message); void handleReplicatedBulkAvatarPacket(QSharedPointer message); + void handleAvatarIdentityRequestPacket(QSharedPointer message, SharedNodePointer senderNode); void domainSettingsRequestComplete(); void handlePacketVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID); void start(); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index c342ecffc5..02d59674d6 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -93,7 +93,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::AvatarQuery: return static_cast(AvatarQueryVersion::ConicalFrustums); default: - return 21; + return 22; } } diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 64054fd080..0f30ba402c 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -61,6 +61,7 @@ public: AssignmentClientStatus, NoisyMute, AvatarIdentity, + AvatarIdentityRequest, NodeIgnoreRequest, DomainConnectRequest, DomainServerRequireDTLS,