From 125b3d5f4e87dd9ffc7fa326cb4878d6aeca7ba1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 21 Apr 2017 07:51:17 -0700 Subject: [PATCH] ignore old identity packets --- assignment-client/src/avatars/AvatarMixer.cpp | 5 +++-- libraries/avatars/src/AvatarData.cpp | 15 +++++++++++++-- libraries/avatars/src/AvatarData.h | 6 ++++-- libraries/avatars/src/AvatarHashMap.cpp | 5 +++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index f3da74ce5e..6e163e6d0b 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -404,10 +404,11 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes // parse the identity packet and update the change timestamp if appropriate AvatarData::Identity identity; - AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); + quint64 messageNumber; + AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber); bool identityChanged = false; bool displayNameChanged = false; - avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged); + avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged, messageNumber); if (identityChanged) { QMutexLocker nodeDataLocker(&nodeData->getMutex()); nodeData->flagIdentityChange(); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index b95387a456..d06fdf502b 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1453,12 +1453,15 @@ QStringList AvatarData::getJointNames() const { return _jointNames; } -void AvatarData::parseAvatarIdentityPacket(const QByteArray& data, Identity& identityOut) { +void AvatarData::parseAvatarIdentityPacket(QSharedPointer message, Identity& identityOut, quint64& messageNumberOut) { + const QByteArray& data = message->getMessage(); + messageNumberOut = message->getMessageNumber(); QDataStream packetStream(data); packetStream >> identityOut.uuid >> identityOut.skeletonModelURL >> identityOut.attachmentData >> identityOut.displayName >> identityOut.sessionDisplayName >> identityOut.avatarEntityData; qDebug() << __FUNCTION__ + << "messageNumberOut:" << messageNumberOut << "identityOut.uuid:" << identityOut.uuid << "identityOut.skeletonModelURL:" << identityOut.skeletonModelURL << "identityOut.displayName:" << identityOut.displayName @@ -1473,7 +1476,15 @@ QUrl AvatarData::cannonicalSkeletonModelURL(const QUrl& emptyURL) const { return _skeletonModelURL.scheme() == "file" ? emptyURL : _skeletonModelURL; } -void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged) { +void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, quint64 messageNumber) { + qDebug() << __FUNCTION__ << "messageNumber:" << messageNumber << "_lastIdentityPacketMessageNumber:" << _lastIdentityPacketMessageNumber; + + if (messageNumber < _lastIdentityPacketMessageNumber) { + qDebug() << "ignoring late identity packet for avatar " << getSessionUUID(); + return; + } + + _lastIdentityPacketMessageNumber = messageNumber; if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { qDebug() << __FUNCTION__ << "about to call setSkeletonModelURL(identity.skeletonModelURL);... identity.skeletonModelURL:" << identity.skeletonModelURL; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 8319eb5249..0eb22fd938 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -532,11 +532,11 @@ public: AvatarEntityMap avatarEntityData; }; - static void parseAvatarIdentityPacket(const QByteArray& data, Identity& identityOut); + static void parseAvatarIdentityPacket(QSharedPointer message, Identity& identityOut, quint64& messageNumberOut); // identityChanged returns true if identity has changed, false otherwise. // displayNameChanged returns true if displayName has changed, false otherwise. - void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged); + void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, quint64 messageNumber); QByteArray identityByteArray() const; @@ -778,6 +778,8 @@ protected: quint64 _audioLoudnessChanged { 0 }; float _audioAverageLoudness { 0.0f }; + quint64 _lastIdentityPacketMessageNumber { 0 }; + private: friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar); static QUrl _defaultFullAvatarModelUrl; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 46a3a67976..f371159e6e 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -131,7 +131,8 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer << "messageNumber:" << message->getMessageNumber(); AvatarData::Identity identity; - AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); + quint64 messageNumber; + AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber); // make sure this isn't for an ignored avatar auto nodeList = DependencyManager::get(); @@ -152,7 +153,7 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer auto avatar = newOrExistingAvatar(identity.uuid, sendingNode); bool identityChanged = false; bool displayNameChanged = false; - avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged); + avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged, messageNumber); } }