mirror of
https://github.com/overte-org/overte.git
synced 2025-07-24 00:43:49 +02:00
AvatarMixer: Clients will show incompatible version dialog
For this to work, the server needs to send an empty AvatarIdentity packet back to the sender when it receives a packet mismatch error. This AvatarIdentity packet will be different then what the client expects and will trigger the incompatible version dialog. Previously, the avatar-mixer was just silently dropping incoming mismatched version packets. Causing the client to never get a response, and thus never showing the incompatible version dialog.
This commit is contained in:
parent
424517e3de
commit
b82356a249
6 changed files with 29 additions and 7 deletions
|
@ -45,6 +45,9 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) :
|
||||||
packetReceiver.registerListener(PacketType::AvatarData, this, "handleAvatarDataPacket");
|
packetReceiver.registerListener(PacketType::AvatarData, this, "handleAvatarDataPacket");
|
||||||
packetReceiver.registerListener(PacketType::AvatarIdentity, this, "handleAvatarIdentityPacket");
|
packetReceiver.registerListener(PacketType::AvatarIdentity, this, "handleAvatarIdentityPacket");
|
||||||
packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket");
|
packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket");
|
||||||
|
|
||||||
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &AvatarMixer::handlePacketVersionMismatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
AvatarMixer::~AvatarMixer() {
|
AvatarMixer::~AvatarMixer() {
|
||||||
|
@ -509,6 +512,19 @@ void AvatarMixer::domainSettingsRequestComplete() {
|
||||||
_broadcastThread.start();
|
_broadcastThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AvatarMixer::handlePacketVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID) {
|
||||||
|
// if this client is using packet versions we don't expect.
|
||||||
|
if ((type == PacketTypeEnum::Value::AvatarIdentity || type == PacketTypeEnum::Value::AvatarData) && !senderUUID.isNull()) {
|
||||||
|
// Echo an empty AvatarIdentity packet back to that client.
|
||||||
|
// This should trigger a version mismatch dialog on their side.
|
||||||
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
auto node = nodeList->nodeWithUUID(senderUUID);
|
||||||
|
if (node) {
|
||||||
|
auto poisonPacket = NLPacket::create(PacketType::AvatarIdentity, 0);
|
||||||
|
nodeList->sendPacket(std::move(poisonPacket), *node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AvatarMixer::parseDomainServerSettings(const QJsonObject& domainSettings) {
|
void AvatarMixer::parseDomainServerSettings(const QJsonObject& domainSettings) {
|
||||||
const QString AVATAR_MIXER_SETTINGS_KEY = "avatar_mixer";
|
const QString AVATAR_MIXER_SETTINGS_KEY = "avatar_mixer";
|
||||||
|
|
|
@ -38,6 +38,7 @@ private slots:
|
||||||
void handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
void handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
||||||
void handleKillAvatarPacket(QSharedPointer<ReceivedMessage> message);
|
void handleKillAvatarPacket(QSharedPointer<ReceivedMessage> message);
|
||||||
void domainSettingsRequestComplete();
|
void domainSettingsRequestComplete();
|
||||||
|
void handlePacketVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void broadcastAvatarData();
|
void broadcastAvatarData();
|
||||||
|
|
|
@ -176,9 +176,10 @@ bool LimitedNodeList::packetVersionMatch(const udt::Packet& packet) {
|
||||||
|
|
||||||
bool hasBeenOutput = false;
|
bool hasBeenOutput = false;
|
||||||
QString senderString;
|
QString senderString;
|
||||||
|
const HifiSockAddr& senderSockAddr = packet.getSenderSockAddr();
|
||||||
|
QUuid sourceID;
|
||||||
|
|
||||||
if (NON_SOURCED_PACKETS.contains(headerType)) {
|
if (NON_SOURCED_PACKETS.contains(headerType)) {
|
||||||
const HifiSockAddr& senderSockAddr = packet.getSenderSockAddr();
|
|
||||||
hasBeenOutput = versionDebugSuppressMap.contains(senderSockAddr, headerType);
|
hasBeenOutput = versionDebugSuppressMap.contains(senderSockAddr, headerType);
|
||||||
|
|
||||||
if (!hasBeenOutput) {
|
if (!hasBeenOutput) {
|
||||||
|
@ -186,7 +187,7 @@ bool LimitedNodeList::packetVersionMatch(const udt::Packet& packet) {
|
||||||
senderString = QString("%1:%2").arg(senderSockAddr.getAddress().toString()).arg(senderSockAddr.getPort());
|
senderString = QString("%1:%2").arg(senderSockAddr.getAddress().toString()).arg(senderSockAddr.getPort());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
QUuid sourceID = NLPacket::sourceIDInHeader(packet);
|
sourceID = NLPacket::sourceIDInHeader(packet);
|
||||||
|
|
||||||
hasBeenOutput = sourcedVersionDebugSuppressMap.contains(sourceID, headerType);
|
hasBeenOutput = sourcedVersionDebugSuppressMap.contains(sourceID, headerType);
|
||||||
|
|
||||||
|
@ -201,7 +202,7 @@ bool LimitedNodeList::packetVersionMatch(const udt::Packet& packet) {
|
||||||
<< senderString << "sent" << qPrintable(QString::number(headerVersion)) << "but"
|
<< senderString << "sent" << qPrintable(QString::number(headerVersion)) << "but"
|
||||||
<< qPrintable(QString::number(versionForPacketType(headerType))) << "expected.";
|
<< qPrintable(QString::number(versionForPacketType(headerType))) << "expected.";
|
||||||
|
|
||||||
emit packetVersionMismatch(headerType);
|
emit packetVersionMismatch(headerType, senderSockAddr, sourceID);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -236,7 +236,9 @@ public slots:
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void dataSent(quint8 channelType, int bytes);
|
void dataSent(quint8 channelType, int bytes);
|
||||||
void packetVersionMismatch(PacketType type);
|
|
||||||
|
// QUuid might be zero for non-sourced packet types.
|
||||||
|
void packetVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID);
|
||||||
|
|
||||||
void uuidChanged(const QUuid& ownerUUID, const QUuid& oldUUID);
|
void uuidChanged(const QUuid& ownerUUID, const QUuid& oldUUID);
|
||||||
void nodeAdded(SharedNodePointer);
|
void nodeAdded(SharedNodePointer);
|
||||||
|
|
|
@ -48,9 +48,11 @@ PacketVersion versionForPacketType(PacketType packetType) {
|
||||||
case PacketType::EntityEdit:
|
case PacketType::EntityEdit:
|
||||||
case PacketType::EntityData:
|
case PacketType::EntityData:
|
||||||
return VERSION_LIGHT_HAS_FALLOFF_RADIUS;
|
return VERSION_LIGHT_HAS_FALLOFF_RADIUS;
|
||||||
|
case PacketType::AvatarIdentity:
|
||||||
case PacketType::AvatarData:
|
case PacketType::AvatarData:
|
||||||
case PacketType::BulkAvatarData:
|
case PacketType::BulkAvatarData:
|
||||||
return static_cast<PacketVersion>(AvatarMixerPacketVersion::SoftAttachmentSupport);
|
case PacketType::KillAvatar:
|
||||||
|
return static_cast<PacketVersion>(AvatarMixerPacketVersion::AbsoluteSixByteRotations);
|
||||||
case PacketType::ICEServerHeartbeat:
|
case PacketType::ICEServerHeartbeat:
|
||||||
return 18; // ICE Server Heartbeat signing
|
return 18; // ICE Server Heartbeat signing
|
||||||
case PacketType::AssetGetInfo:
|
case PacketType::AssetGetInfo:
|
||||||
|
|
|
@ -175,7 +175,7 @@ const PacketVersion VERSION_LIGHT_HAS_FALLOFF_RADIUS = 57;
|
||||||
enum class AvatarMixerPacketVersion : PacketVersion {
|
enum class AvatarMixerPacketVersion : PacketVersion {
|
||||||
TranslationSupport = 17,
|
TranslationSupport = 17,
|
||||||
SoftAttachmentSupport,
|
SoftAttachmentSupport,
|
||||||
AbsoluteFortyEightBitRotations
|
AbsoluteSixByteRotations
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_PacketHeaders_h
|
#endif // hifi_PacketHeaders_h
|
||||||
|
|
Loading…
Reference in a new issue