From 3beceb4d7d9e99d01eb6c1f9cf64a77f37f795d4 Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Mon, 1 Mar 2021 22:03:02 +1300
Subject: [PATCH] Clear user's avatar entities if rez permissions change to
 "no"

---
 assignment-client/src/avatars/AvatarMixerSlave.cpp | 7 +++++++
 libraries/avatars/src/AvatarData.cpp               | 8 ++++++++
 libraries/avatars/src/AvatarData.h                 | 2 ++
 3 files changed, 17 insertions(+)

diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp
index 522f0bf163..b253aaf437 100644
--- a/assignment-client/src/avatars/AvatarMixerSlave.cpp
+++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp
@@ -432,6 +432,13 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
             }
         }
 
+        if (sendAvatar) {
+            if (!sourceAvatarNode->getCanRezAvatarEntities()) {
+                auto sourceAvatarNodeData = reinterpret_cast<AvatarMixerClientData*>(sourceAvatarNode->getLinkedData());
+                sourceAvatarNodeData->getAvatar().clearAvatarEntities();
+            }
+        }
+
         if (sendAvatar) {
             AvatarDataSequenceNumber lastSeqToReceiver = destinationNodeData->getLastBroadcastSequenceNumber(sourceAvatarNode->getLocalID());
             AvatarDataSequenceNumber lastSeqFromSender = sourceAvatarNodeData->getLastReceivedSequenceNumber();
diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp
index adb7222ee3..ea331137a7 100755
--- a/libraries/avatars/src/AvatarData.cpp
+++ b/libraries/avatars/src/AvatarData.cpp
@@ -3046,6 +3046,14 @@ void AvatarData::clearAvatarEntity(const QUuid& entityID, bool requiresRemovalFr
     }
 }
 
+void AvatarData::clearAvatarEntities() {
+    _avatarEntitiesLock.withReadLock([this] {
+        foreach(auto entityID, _packedAvatarEntityData.keys()) {
+            clearAvatarEntity(entityID);
+        }
+    });
+}
+
 AvatarEntityMap AvatarData::getAvatarEntityData() const {
     // overridden where needed
     // NOTE: the return value is expected to be a map of unfortunately-formatted-binary-blobs
diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h
index 2e25c9559c..758d90b4a6 100755
--- a/libraries/avatars/src/AvatarData.h
+++ b/libraries/avatars/src/AvatarData.h
@@ -1186,6 +1186,8 @@ public:
      * @deprecated This function is deprecated and will be removed.
      */
     Q_INVOKABLE virtual void clearAvatarEntity(const QUuid& entityID, bool requiresRemovalFromTree = true);
+    
+    void clearAvatarEntities();
 
     /**jsdoc
      * Enables blend shapes set using {@link Avatar.setBlendshape} or {@link MyAvatar.setBlendshape} to be transmitted to other