diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 015a4f26cf..717d969e02 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -370,6 +370,9 @@ void AvatarMixer::manageIdentityData(const SharedNodePointer& node) { MixerAvatar& avatar = nodeData->getAvatar(); bool sendIdentity = avatar.needsIdentityUpdate(); + if (sendIdentity) { + nodeData->flagIdentityChange(); + } if (nodeData->getAvatarSessionDisplayNameMustChange()) { const QString& existingBaseDisplayName = avatar.getSessionDisplayName(); if (!existingBaseDisplayName.isEmpty()) { diff --git a/assignment-client/src/avatars/MixerAvatar.cpp b/assignment-client/src/avatars/MixerAvatar.cpp index 6ef73b15e7..8075b523eb 100644 --- a/assignment-client/src/avatars/MixerAvatar.cpp +++ b/assignment-client/src/avatars/MixerAvatar.cpp @@ -27,24 +27,27 @@ #include "ClientTraitsHandler.h" #include "AvatarLogging.h" -const QString MixerAvatar::VERIFY_FAIL_MODEL { "qrc:/meshes/verifyFailed.fst" }; - void MixerAvatar::fetchAvatarFST() { _verifyState = nonCertified; + + _pendingEvent = false; + + QUrl avatarURL = getSkeletonModelURL(); + auto avatarString = avatarURL.toString(); + qCDebug(avatars) << "MixerAvatar::fetchAvatarFST: called with" << avatarString; + if (avatarURL.isEmpty() || avatarURL.isLocalFile() || avatarURL.scheme() == "qrc") { + // Not network FST. + return; + } _certificateIdFromURL.clear(); _certificateIdFromFST.clear(); _marketplaceIdFromURL.clear(); _marketplaceIdFromFST.clear(); auto resourceManager = DependencyManager::get(); - QUrl avatarURL = getSkeletonModelURL(); - if (avatarURL.isEmpty()) { - return; - } - //auto avatarURLString = avatarURL.toDisplayString(); // Match UUID + (optionally) URL cert static const QRegularExpression marketIdRegex{ - "^https://metaverse.highfidelity.com/api/v.+/commerce/entity_edition/([-0-9a-z]{36})(.*?certificate_id=([\\w/+%]+)|.*).*$" + "^https://.*?highfidelity\\.com/api/.*?/commerce/entity_edition/([-0-9a-z]{36})(.*?certificate_id=([\\w/+%]+)|.*).*$" }; auto marketIdMatch = marketIdRegex.match(avatarURL.toDisplayString()); if (marketIdMatch.hasMatch()) { @@ -58,18 +61,17 @@ void MixerAvatar::fetchAvatarFST() { ResourceRequest* fstRequest = resourceManager->createResourceRequest(this, avatarURL); if (fstRequest) { QMutexLocker certifyLocker(&_avatarCertifyLock); + qCDebug(avatars) << "Requesting FST at" << avatarURL; - if (_avatarRequest) { - _avatarRequest->deleteLater(); - } _avatarRequest = fstRequest; - connect(fstRequest, &ResourceRequest::finished, this, &MixerAvatar::fstRequestComplete); _verifyState = requestingFST; + connect(fstRequest, &ResourceRequest::finished, this, &MixerAvatar::fstRequestComplete); fstRequest->send(); } else { qCDebug(avatars) << "Couldn't create FST request for" << avatarURL; _verifyState = error; } + _needsIdentityUpdate = true; } void MixerAvatar::fstRequestComplete() { @@ -176,6 +178,7 @@ void MixerAvatar::ownerRequestComplete() { qCDebug(avatars) << "Owner lookup failed for" << getDisplayName() << ":" << jsonData.toObject()["message"].toString(); _verifyState = error; + _pendingEvent = false; } } networkReply->deleteLater(); @@ -263,6 +266,7 @@ void MixerAvatar::processCertifyEvents() { { if (_challengeResponse.length() < 8) { _verifyState = error; + _pendingEvent = false; break; } @@ -282,7 +286,6 @@ void MixerAvatar::processCertifyEvents() { _needsIdentityUpdate = true; if (_verifyState == verificationFailed) { qCDebug(avatars) << "Dynamic verification FAILED for " << getDisplayName() << getSessionUUID(); - setSkeletonModelURL(QUrl(VERIFY_FAIL_MODEL)); } else { qCDebug(avatars) << "Dynamic verification SUCCEEDED for " << getDisplayName() << getSessionUUID(); } @@ -324,7 +327,6 @@ void MixerAvatar::sendOwnerChallenge() { _challengeTimeout.setInterval(CHALLENGE_TIMEOUT_MS); _challengeTimeout.connect(&_challengeTimeout, &QTimer::timeout, [this]() { _verifyState = verificationFailed; - setSkeletonModelURL(QUrl(VERIFY_FAIL_MODEL)); _needsIdentityUpdate = true; }); } diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 0c8d48ceaf..cb14d7ef41 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -326,7 +326,8 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer bool displayNameChanged = false; // In this case, the "sendingNode" is the Avatar Mixer. avatar->processAvatarIdentity(avatarIdentityStream, identityChanged, displayNameChanged); - if (avatar->isCertifyFailed()) { + if (avatar->isCertifyFailed() && identityUUID != EMPTY) { + qCDebug(avatars) << "Avatar" << avatar->getSessionDisplayName() << "marked as VERIFY-FAILED"; avatar->setSkeletonModelURL(PathUtils::resourcesUrl(VERIFY_FAIL_MODEL)); } _replicas.processAvatarIdentity(identityUUID, message->getMessage(), identityChanged, displayNameChanged);