Merge pull request #13809 from birarda/feat/reliable-avatar-kill

make avatar kill packets from mixer reliable
This commit is contained in:
John Conklin II 2018-08-15 10:00:22 -07:00 committed by GitHub
commit d1a80e57be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 7 deletions

View file

@ -447,18 +447,21 @@ void AvatarMixer::handleAvatarKilled(SharedNodePointer avatarNode) {
// send a kill packet for it to our other nodes // send a kill packet for it to our other nodes
nodeList->eachMatchingNode([&](const SharedNodePointer& node) { nodeList->eachMatchingNode([&](const SharedNodePointer& node) {
// we relay avatar kill packets to agents that are not upstream // we relay avatar kill packets to agents that are not upstream
// and downstream avatar mixers, if the node that was just killed was being replicated // and downstream avatar mixers, if the node that was just killed was being replicatedConnectedAgent
return (node->getType() == NodeType::Agent && !node->isUpstream()) || return node->getActiveSocket() &&
(avatarNode->isReplicated() && shouldReplicateTo(*avatarNode, *node)); ((node->getType() == NodeType::Agent && !node->isUpstream()) ||
(avatarNode->isReplicated() && shouldReplicateTo(*avatarNode, *node)));
}, [&](const SharedNodePointer& node) { }, [&](const SharedNodePointer& node) {
if (node->getType() == NodeType::Agent) { if (node->getType() == NodeType::Agent) {
if (!killPacket) { if (!killPacket) {
killPacket = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason)); killPacket = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason), true);
killPacket->write(avatarNode->getUUID().toRfc4122()); killPacket->write(avatarNode->getUUID().toRfc4122());
killPacket->writePrimitive(KillAvatarReason::AvatarDisconnected); killPacket->writePrimitive(KillAvatarReason::AvatarDisconnected);
} }
nodeList->sendUnreliablePacket(*killPacket, *node); auto killPacketCopy = NLPacket::createCopy(*killPacket);
nodeList->sendPacket(std::move(killPacketCopy), *node);
} else { } else {
// send a replicated kill packet to the downstream avatar mixer // send a replicated kill packet to the downstream avatar mixer
if (!replicatedKillPacket) { if (!replicatedKillPacket) {

View file

@ -108,7 +108,7 @@ uint16_t AvatarMixerClientData::getLastBroadcastSequenceNumber(const QUuid& node
void AvatarMixerClientData::ignoreOther(SharedNodePointer self, SharedNodePointer other) { void AvatarMixerClientData::ignoreOther(SharedNodePointer self, SharedNodePointer other) {
if (!isRadiusIgnoring(other->getUUID())) { if (!isRadiusIgnoring(other->getUUID())) {
addToRadiusIgnoringSet(other->getUUID()); addToRadiusIgnoringSet(other->getUUID());
auto killPacket = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason)); auto killPacket = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason), true);
killPacket->write(other->getUUID().toRfc4122()); killPacket->write(other->getUUID().toRfc4122());
if (self->isIgnoreRadiusEnabled()) { if (self->isIgnoreRadiusEnabled()) {
killPacket->writePrimitive(KillAvatarReason::TheirAvatarEnteredYourBubble); killPacket->writePrimitive(KillAvatarReason::TheirAvatarEnteredYourBubble);
@ -116,7 +116,7 @@ void AvatarMixerClientData::ignoreOther(SharedNodePointer self, SharedNodePointe
killPacket->writePrimitive(KillAvatarReason::YourAvatarEnteredTheirBubble); killPacket->writePrimitive(KillAvatarReason::YourAvatarEnteredTheirBubble);
} }
setLastBroadcastTime(other->getUUID(), 0); setLastBroadcastTime(other->getUUID(), 0);
DependencyManager::get<NodeList>()->sendUnreliablePacket(*killPacket, *self); DependencyManager::get<NodeList>()->sendPacket(std::move(killPacket), *self);
} }
} }