ignore old identity packets

This commit is contained in:
ZappoMan 2017-04-21 07:51:17 -07:00
parent c197979354
commit 125b3d5f4e
4 changed files with 23 additions and 8 deletions
assignment-client/src/avatars
libraries/avatars/src

View file

@ -404,10 +404,11 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> 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();

View file

@ -1453,12 +1453,15 @@ QStringList AvatarData::getJointNames() const {
return _jointNames;
}
void AvatarData::parseAvatarIdentityPacket(const QByteArray& data, Identity& identityOut) {
void AvatarData::parseAvatarIdentityPacket(QSharedPointer<ReceivedMessage> 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;

View file

@ -532,11 +532,11 @@ public:
AvatarEntityMap avatarEntityData;
};
static void parseAvatarIdentityPacket(const QByteArray& data, Identity& identityOut);
static void parseAvatarIdentityPacket(QSharedPointer<ReceivedMessage> 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;

View file

@ -131,7 +131,8 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer<ReceivedMessage>
<< "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<NodeList>();
@ -152,7 +153,7 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer<ReceivedMessage>
auto avatar = newOrExistingAvatar(identity.uuid, sendingNode);
bool identityChanged = false;
bool displayNameChanged = false;
avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged);
avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged, messageNumber);
}
}