From af4bc593076f00c57ee1683dd87af4e9c9661478 Mon Sep 17 00:00:00 2001
From: Thijs Wenker <me@thoys.nl>
Date: Thu, 14 Sep 2017 23:31:51 +0200
Subject: [PATCH] clone local avatar entities

---
 scripts/system/html/entityProperties.html    | 16 +++++---
 scripts/system/html/js/entityProperties.js   | 40 +++++++++++++-------
 scripts/system/libraries/cloneEntityUtils.js |  4 +-
 3 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html
index 42a938e78d..43cd281bbd 100644
--- a/scripts/system/html/entityProperties.html
+++ b/scripts/system/html/entityProperties.html
@@ -1,4 +1,4 @@
-<!--
+<!--
 //  entityProperties.html
 //
 //  Created by Ryan Huffman on 13 Nov 2014
@@ -136,17 +136,21 @@
 
                     <fieldset class="column" id="group-cloneable-group" style="display:none;">
                         <legend class="sub-section-header">
-                             <span>Cloneable Settings</span>
+                            <span>Cloneable Settings</span>
                         </legend>
                         <fieldset class="minor">
-                             <div><label>Clone Lifetime</label><input type="number" data-user-data-type="cloneLifetime" id="property-cloneable-lifetime"></div>
+                            <div><label>Clone Lifetime</label><input type="number" data-user-data-type="cloneLifetime" id="property-cloneable-lifetime"></div>
                         </fieldset>
                         <fieldset class="minor">
-                             <div><label>Clone Limit   </label><input type="number" data-user-data-type="cloneLimit" id="property-cloneable-limit"></div>
+                            <div><label>Clone Limit</label><input type="number" data-user-data-type="cloneLimit" id="property-cloneable-limit"></div>
                         </fieldset>
                         <div class="property checkbox">
-                             <input type="checkbox" id="property-cloneable-dynamic">
-                             <label for="property-cloneable-dynamic">Clone Dynamic</label>
+                            <input type="checkbox" id="property-cloneable-dynamic">
+                            <label for="property-cloneable-dynamic">Clone Dynamic</label>
+                        </div>
+                        <div class="property checkbox">
+                            <input type="checkbox" id="property-cloneable-avatarEntity">
+                            <label for="property-cloneable-avatarEntity">Clone Avatar Entity</label>
                         </div>
                     </fieldset>
                 </div>
diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js
index d93baff636..58173a794c 100644
--- a/scripts/system/html/js/entityProperties.js
+++ b/scripts/system/html/js/entityProperties.js
@@ -554,6 +554,7 @@ function loaded() {
 
         var elCloneable = document.getElementById("property-cloneable");
         var elCloneableDynamic = document.getElementById("property-cloneable-dynamic");
+        var elCloneableAvatarEntity = document.getElementById("property-cloneable-avatarEntity");
         var elCloneableGroup = document.getElementById("group-cloneable-group");
         var elCloneableLifetime = document.getElementById("property-cloneable-lifetime");
         var elCloneableLimit = document.getElementById("property-cloneable-limit");
@@ -844,25 +845,29 @@ function loaded() {
                             parsedUserData = JSON.parse(properties.userData);
 
                             if ("grabbableKey" in parsedUserData) {
-                                if ("grabbable" in parsedUserData["grabbableKey"]) {
-                                    elGrabbable.checked = parsedUserData["grabbableKey"].grabbable;
+                                var grabbableData = parsedUserData["grabbableKey"];
+                                if ("grabbable" in grabbableData) {
+                                    elGrabbable.checked = grabbableData.grabbable;
                                 }
-                                if ("wantsTrigger" in parsedUserData["grabbableKey"]) {
-                                    elWantsTrigger.checked = parsedUserData["grabbableKey"].wantsTrigger;
+                                if ("wantsTrigger" in grabbableData) {
+                                    elWantsTrigger.checked = grabbableData.wantsTrigger;
                                 }
-                                if ("ignoreIK" in parsedUserData["grabbableKey"]) {
-                                    elIgnoreIK.checked = parsedUserData["grabbableKey"].ignoreIK;
+                                if ("ignoreIK" in grabbableData) {
+                                    elIgnoreIK.checked = grabbableData.ignoreIK;
                                 }
-                                if ("cloneable" in parsedUserData["grabbableKey"]) {
-                                    elCloneable.checked = parsedUserData["grabbableKey"].cloneable;
+                                if ("cloneable" in grabbableData) {
+                                    elCloneable.checked = grabbableData.cloneable;
                                     elCloneableGroup.style.display = elCloneable.checked ? "block": "none";
-                                    elCloneableDynamic.checked = parsedUserData["grabbableKey"].cloneDynamic ? parsedUserData["grabbableKey"].cloneDynamic : properties.dynamic;
+                                    elCloneableDynamic.checked = grabbableData.cloneDynamic ? grabbableData.cloneDynamic : properties.dynamic;
                                     if (elCloneable.checked) {
-                                      if ("cloneLifetime" in parsedUserData["grabbableKey"]) {
-                                          elCloneableLifetime.value = parsedUserData["grabbableKey"].cloneLifetime ? parsedUserData["grabbableKey"].cloneLifetime : 300;
+                                      if ("cloneLifetime" in grabbableData) {
+                                          elCloneableLifetime.value = grabbableData.cloneLifetime ? grabbableData.cloneLifetime : 300;
                                       }
-                                      if ("cloneLimit" in parsedUserData["grabbableKey"]) {
-                                          elCloneableLimit.value = parsedUserData["grabbableKey"].cloneLimit ? parsedUserData["grabbableKey"].cloneLimit : 0;
+                                      if ("cloneLimit" in grabbableData) {
+                                          elCloneableLimit.value = grabbableData.cloneLimit ? grabbableData.cloneLimit : 0;
+                                      }
+                                      if ("cloneAvatarEntity" in grabbableData) {
+                                          elCloneableAvatarEntity.checked = grabbableData.cloneAvatarEntity ? grabbableData.cloneAvatarEntity : false;
                                       }
                                     }
                                 }
@@ -1114,9 +1119,14 @@ function loaded() {
             }
             userDataChanger("grabbableKey", "grabbable", elGrabbable, elUserData, properties.dynamic);
         });
-        elCloneableDynamic.addEventListener('change', function (event){
+        elCloneableDynamic.addEventListener('change', function(event) {
             userDataChanger("grabbableKey", "cloneDynamic", event.target, elUserData, -1);
         });
+
+        elCloneableAvatarEntity.addEventListener('change', function(event) {
+            userDataChanger("grabbableKey", "cloneAvatarEntity", event.target, elUserData, -1);
+        });
+
         elCloneable.addEventListener('change', function (event) {
             var checked = event.target.checked;
             if (checked) {
@@ -1124,6 +1134,7 @@ function loaded() {
                         cloneLifetime: elCloneableLifetime,
                         cloneLimit: elCloneableLimit,
                         cloneDynamic: elCloneableDynamic,
+                        cloneAvatarEntity: elCloneableAvatarEntity,
                         cloneable: event.target,
                         grabbable: null
                     }, elUserData, {});
@@ -1134,6 +1145,7 @@ function loaded() {
                         cloneLifetime: null,
                         cloneLimit: null,
                         cloneDynamic: null,
+                        cloneAvatarEntity: null,
                         cloneable: false
                     }, elUserData, {});
                 elCloneableGroup.style.display = "none";
diff --git a/scripts/system/libraries/cloneEntityUtils.js b/scripts/system/libraries/cloneEntityUtils.js
index 500c6a0696..348155091b 100644
--- a/scripts/system/libraries/cloneEntityUtils.js
+++ b/scripts/system/libraries/cloneEntityUtils.js
@@ -72,6 +72,7 @@ cloneEntity = function(props, worldEntityProps) {
     var lifetime = grabInfo.cloneLifetime ? grabInfo.cloneLifetime : 300;
     var dynamic = grabInfo.cloneDynamic ? grabInfo.cloneDynamic : false;
     var triggerable = grabInfo.triggerable ? grabInfo.triggerable : false;
+    var avatarEntity = grabInfo.cloneAvatarEntity ? grabInfo.cloneAvatarEntity : false;
     var cUserData = Object.assign({}, JSON.parse(cloneableProps.userData));
     var cProperties = Object.assign({}, cloneableProps);
 
@@ -80,6 +81,7 @@ cloneEntity = function(props, worldEntityProps) {
     delete cUserData.grabbableKey.cloneable;
     delete cUserData.grabbableKey.cloneDynamic;
     delete cUserData.grabbableKey.cloneLimit;
+    delete cUserData.grabbableKey.cloneAvatarEntity;
     delete cProperties.id;
 
 
@@ -90,6 +92,6 @@ cloneEntity = function(props, worldEntityProps) {
     cProperties.lifetime = lifetime;
     cProperties.userData = JSON.stringify(cUserData);
 
-    var cloneID = Entities.addEntity(cProperties);
+    var cloneID = Entities.addEntity(cProperties, avatarEntity);
     return cloneID;
 };