From 9b8503eba5ce4d359c30c681e4765e8dfa242227 Mon Sep 17 00:00:00 2001 From: Menithal Date: Sun, 19 Feb 2017 18:18:38 +0200 Subject: [PATCH 01/11] Initial Grab Clone --- scripts/system/html/entityProperties.html | 15 ++++++++++++++- scripts/system/html/js/entityProperties.js | 13 ++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index b11127b26c..4c3723a2ef 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -61,7 +61,7 @@ - +

@@ -295,12 +295,25 @@
+
+ + +
+
+
+ Cloneable Settings +
+
+
+
+
+

diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 8879c0f34e..63cb037ada 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -273,7 +273,7 @@ function updateCheckedSubProperty(propertyName, propertyValue, subPropertyElemen propertyValue += subPropertyString + ','; } } else { - // We've unchecked, so remove + // We've unchecked, so remove propertyValue = propertyValue.replace(subPropertyString + ",", ""); } @@ -584,6 +584,7 @@ function loaded() { var elCollisionSoundURL = document.getElementById("property-collision-sound-url"); var elGrabbable = document.getElementById("property-grabbable"); + var elCloneable = document.getElementById("property-cloneable"); var elWantsTrigger = document.getElementById("property-wants-trigger"); var elIgnoreIK = document.getElementById("property-ignore-ik"); @@ -780,7 +781,7 @@ function loaded() { if (lastEntityID !== '"' + properties.id + '"' && lastEntityID !== null && editor !== null) { saveJSONUserData(true); } - //the event bridge and json parsing handle our avatar id string differently. + //the event bridge and json parsing handle our avatar id string differently. lastEntityID = '"' + properties.id + '"'; elID.innerHTML = properties.id; @@ -1156,6 +1157,12 @@ function loaded() { elGrabbable.addEventListener('change', function() { userDataChanger("grabbableKey", "grabbable", elGrabbable, elUserData, properties.dynamic); }); + elCloneable.addEventListener('change', function () { + userDataChanger("grabbableKey", "cloneable", elCloneable, elUserData, false); + if (elCloneable.checked) { + + } + }); elWantsTrigger.addEventListener('change', function() { userDataChanger("grabbableKey", "wantsTrigger", elWantsTrigger, elUserData, false); }); @@ -1390,7 +1397,7 @@ function loaded() { elZoneFlyingAllowed.addEventListener('change', createEmitCheckedPropertyUpdateFunction('flyingAllowed')); elZoneGhostingAllowed.addEventListener('change', createEmitCheckedPropertyUpdateFunction('ghostingAllowed')); elZoneFilterURL.addEventListener('change', createEmitTextPropertyUpdateFunction('filterURL')); - + var voxelVolumeSizeChangeFunction = createEmitVec3PropertyUpdateFunction( 'voxelVolumeSize', elVoxelVolumeSizeX, elVoxelVolumeSizeY, elVoxelVolumeSizeZ); elVoxelVolumeSizeX.addEventListener('change', voxelVolumeSizeChangeFunction); From e95e50ad6ebade12a4c07e0bfcd524803fbc9d73 Mon Sep 17 00:00:00 2001 From: Menithal Date: Thu, 23 Feb 2017 10:34:04 +0200 Subject: [PATCH 02/11] Preliminary work on edit.js to allow for new param --- scripts/system/html/entityProperties.html | 6 ++-- scripts/system/html/js/entityProperties.js | 38 +++++++++++++++++----- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index 4c3723a2ef..25cd4417d5 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -305,13 +305,13 @@
-
+
Cloneable Settings
-
-
+
+
diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 63cb037ada..7212fd9b9e 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -323,13 +323,9 @@ function setUserDataFromEditor(noUpdate) { }) ); } - } - - } - -function userDataChanger(groupName, keyName, checkBoxElement, userDataElement, defaultValue) { +function userDataChanger(groupName, keyName, values, userDataElement, defaultValue) { var properties = {}; var parsedData = {}; try { @@ -339,15 +335,19 @@ function userDataChanger(groupName, keyName, checkBoxElement, userDataElement, d } else { parsedData = JSON.parse(userDataElement.value); } - } catch (e) {} if (!(groupName in parsedData)) { parsedData[groupName] = {} } + delete parsedData[groupName][keyName]; - if (checkBoxElement.checked !== defaultValue) { - parsedData[groupName][keyName] = checkBoxElement.checked; + if (values instanceof Element) { + if (values.checked !== defaultValue) { + parsedData[groupName][keyName] = values.checked; + } + } else { + parsedData[groupName][keyName] = values; } if (Object.keys(parsedData[groupName]).length == 0) { @@ -584,7 +584,12 @@ function loaded() { var elCollisionSoundURL = document.getElementById("property-collision-sound-url"); var elGrabbable = document.getElementById("property-grabbable"); + var elCloneable = document.getElementById("property-cloneable"); + var elCloneableGroup = document.getElementById("group-cloneable-group"); + var elCloneableLifetime = document.getElementById("property-cloneable-lifetime"); + var elCloneableLimit = document.getElementById("property-cloneable-limit") + var elWantsTrigger = document.getElementById("property-wants-trigger"); var elIgnoreIK = document.getElementById("property-ignore-ik"); @@ -1160,9 +1165,24 @@ function loaded() { elCloneable.addEventListener('change', function () { userDataChanger("grabbableKey", "cloneable", elCloneable, elUserData, false); if (elCloneable.checked) { - + var cloneProperties = { + lifetime: 300, + limit: 10 + }; + userDataChanger("grabbableKey", "cloneable-properties", cloneProperties, elUserData, false); + elCloneableGroup.style.display = "block"; + } else { + userDataChanger("grabbableKey", "cloneable-properties", {}, elUserData, false); + elCloneableGroup.style.display = "none"; } }); + + var numberListener = function (event) { + userDataChanger("grabbableKey", event.target.getAttribute("data-user-data-type"), event.target.value, elUserData, false}); + }; + elCloneableLifetime.addEventListener('change', numberListener); + elCloneableLimit.addEventListener('change', numberListener); + elWantsTrigger.addEventListener('change', function() { userDataChanger("grabbableKey", "wantsTrigger", elWantsTrigger, elUserData, false); }); From 4d98cc436b63af354f05c0a84afa481ba4769e88 Mon Sep 17 00:00:00 2001 From: Menithal Date: Thu, 23 Feb 2017 23:20:21 +0200 Subject: [PATCH 03/11] Finished up Edit.js --- scripts/system/html/entityProperties.html | 6 +-- scripts/system/html/js/entityProperties.js | 43 +++++++++++++++------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index 25cd4417d5..e775be9e3a 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -297,7 +297,7 @@
- +
@@ -310,8 +310,8 @@ Cloneable Settings
-
-
+
+
diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 7212fd9b9e..629b9dc4e9 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -586,9 +586,10 @@ function loaded() { var elGrabbable = document.getElementById("property-grabbable"); var elCloneable = document.getElementById("property-cloneable"); + var elCloneableGroup = document.getElementById("group-cloneable-group"); var elCloneableLifetime = document.getElementById("property-cloneable-lifetime"); - var elCloneableLimit = document.getElementById("property-cloneable-limit") + var elCloneableLimit = document.getElementById("property-cloneable-limit"); var elWantsTrigger = document.getElementById("property-wants-trigger"); var elIgnoreIK = document.getElementById("property-ignore-ik"); @@ -853,6 +854,7 @@ function loaded() { elCollideOtherAvatar.checked = properties.collidesWith.indexOf("otherAvatar") > -1; elGrabbable.checked = properties.dynamic; + elWantsTrigger.checked = false; elIgnoreIK.checked = true; var parsedUserData = {} @@ -869,8 +871,27 @@ function loaded() { if ("ignoreIK" in parsedUserData["grabbableKey"]) { elIgnoreIK.checked = parsedUserData["grabbableKey"].ignoreIK; } + if ("cloneable" in parsedUserData["grabbableKey"]) { + elCloneable.checked = parsedUserData["grabbableKey"].cloneable; + + elCloneableGroup.style.display = elCloneable.checked ? "block": "none"; + elCloneableLimit.value = elCloneable.checked ? 10: 0; + elCloneableLifetime.value = elCloneable.checked ? 300: 0; + } else { + elCloneable.checked = false; + elCloneableGroup.style.display = elCloneable.checked ? "block": "none"; + elCloneableLimit.value = 0; + elCloneableLifetime.value = 0; + } + if ("cloneLifetime" in parsedUserData["grabbableKey"]) { + elCloneableLifetime.value = parsedUserData["grabbableKey"].cloneLifetime; + } + if ("cloneLimit" in parsedUserData["grabbableKey"]) { + elCloneableLimit.value = parsedUserData["grabbableKey"].cloneLimit; + } } - } catch (e) {} + } catch (e) { + } elCollisionSoundURL.value = properties.collisionSoundURL; elLifetime.value = properties.lifetime; @@ -1162,23 +1183,19 @@ function loaded() { elGrabbable.addEventListener('change', function() { userDataChanger("grabbableKey", "grabbable", elGrabbable, elUserData, properties.dynamic); }); - elCloneable.addEventListener('change', function () { - userDataChanger("grabbableKey", "cloneable", elCloneable, elUserData, false); - if (elCloneable.checked) { - var cloneProperties = { - lifetime: 300, - limit: 10 - }; - userDataChanger("grabbableKey", "cloneable-properties", cloneProperties, elUserData, false); + elCloneable.addEventListener('change', function (event) { + if (event.target.checked) { + userDataChanger("grabbableKey", "cloneLifetime", 300, elUserData, -1); + userDataChanger("grabbableKey", "cloneLimit", 10, elUserData, -1); elCloneableGroup.style.display = "block"; } else { - userDataChanger("grabbableKey", "cloneable-properties", {}, elUserData, false); elCloneableGroup.style.display = "none"; } + userDataChanger("grabbableKey", "cloneable", event.target, elUserData, null); }); - + var numberListener = function (event) { - userDataChanger("grabbableKey", event.target.getAttribute("data-user-data-type"), event.target.value, elUserData, false}); + userDataChanger("grabbableKey", event.target.getAttribute("data-user-data-type"), parseInt(event.target.value), elUserData, false); }; elCloneableLifetime.addEventListener('change', numberListener); elCloneableLimit.addEventListener('change', numberListener); From 10151c3f5b23f5a9302f9aadd2db13cfdc23f1a7 Mon Sep 17 00:00:00 2001 From: Menithal Date: Fri, 24 Feb 2017 08:04:03 +0200 Subject: [PATCH 04/11] Added Multi-userdata field updater --- scripts/system/html/js/entityProperties.js | 112 +++++++++++++-------- 1 file changed, 71 insertions(+), 41 deletions(-) diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 629b9dc4e9..abffdaee96 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -27,6 +27,7 @@ var EDITOR_TIMEOUT_DURATION = 1500; var colorPickers = []; var lastEntityID = null; + debugPrint = function(message) { EventBridge.emitWebEvent( JSON.stringify({ @@ -325,49 +326,65 @@ function setUserDataFromEditor(noUpdate) { } } } -function userDataChanger(groupName, keyName, values, userDataElement, defaultValue) { - var properties = {}; - var parsedData = {}; - try { - if ($('#userdata-editor').css('height') !== "0px") { - //if there is an expanded, we want to use its json. - parsedData = getEditorJSON(); - } else { - parsedData = JSON.parse(userDataElement.value); +function multiUserDataChanger(groupName, keyPair, userDataElement, defaults) { + var properties = {}; + var parsedData = {}; + try { + if ($('#userdata-editor').css('height') !== "0px") { + //if there is an expanded, we want to use its json. + parsedData = getEditorJSON(); + } else { + parsedData = JSON.parse(userDataElement.value); + } + } catch (e) {} + + if (!(groupName in parsedData)) { + parsedData[groupName] = {} + } + var keys = Object.keys(keyPair); + keys.forEach(function (key) { + delete parsedData[groupName][key]; + if (keyPair[key] instanceof Element) { + if(keyPair[key].type === "checkbox") { + if (keyPair[key].checked !== defaults[key]) { + parsedData[groupName][key] = keyPair[key].checked; + } + } else { + var val = isNaN(keyPair[key].value) ? keyPair[key].value : parseInt(keyPair[key].value); + if (val !== defaults[key]) { + parsedData[groupName][key] = val; } - } catch (e) {} - - if (!(groupName in parsedData)) { - parsedData[groupName] = {} - } - - delete parsedData[groupName][keyName]; - if (values instanceof Element) { - if (values.checked !== defaultValue) { - parsedData[groupName][keyName] = values.checked; } } else { - parsedData[groupName][keyName] = values; + parsedData[groupName][key] = keyPair[key]; } + }); - if (Object.keys(parsedData[groupName]).length == 0) { - delete parsedData[groupName]; - } - if (Object.keys(parsedData).length > 0) { - properties['userData'] = JSON.stringify(parsedData); - } else { - properties['userData'] = ''; - } + if (Object.keys(parsedData[groupName]).length == 0) { + delete parsedData[groupName]; + } + if (Object.keys(parsedData).length > 0) { + properties['userData'] = JSON.stringify(parsedData); + } else { + properties['userData'] = ''; + } - userDataElement.value = properties['userData']; + userDataElement.value = properties['userData']; - EventBridge.emitWebEvent( - JSON.stringify({ - id: lastEntityID, - type: "update", - properties: properties, - }) - ); + EventBridge.emitWebEvent( + JSON.stringify({ + id: lastEntityID, + type: "update", + properties: properties, + }) + ); + +} +function userDataChanger(groupName, keyName, values, userDataElement, defaultValue) { + var val = {}, def = {}; + val[keyName] = values; + def[keyName] = defaultValue; + multiUserDataChanger(groupName, val, userDataElement, def); }; function setTextareaScrolling(element) { @@ -873,15 +890,18 @@ function loaded() { } if ("cloneable" in parsedUserData["grabbableKey"]) { elCloneable.checked = parsedUserData["grabbableKey"].cloneable; - elCloneableGroup.style.display = elCloneable.checked ? "block": "none"; elCloneableLimit.value = elCloneable.checked ? 10: 0; elCloneableLifetime.value = elCloneable.checked ? 300: 0; + elDynamic.checked = elCloneable.checked ? false: properties.dynamic; + } else { elCloneable.checked = false; + elCloneableGroup.style.display = elCloneable.checked ? "block": "none"; elCloneableLimit.value = 0; elCloneableLifetime.value = 0; + } if ("cloneLifetime" in parsedUserData["grabbableKey"]) { elCloneableLifetime.value = parsedUserData["grabbableKey"].cloneLifetime; @@ -1184,14 +1204,24 @@ function loaded() { userDataChanger("grabbableKey", "grabbable", elGrabbable, elUserData, properties.dynamic); }); elCloneable.addEventListener('change', function (event) { - if (event.target.checked) { - userDataChanger("grabbableKey", "cloneLifetime", 300, elUserData, -1); - userDataChanger("grabbableKey", "cloneLimit", 10, elUserData, -1); + var checked = event.target.checked; + if (checked) { + multiUserDataChanger("grabbableKey", + {cloneLifetime: elCloneableLifetime, cloneLimit: elCloneableLimit, cloneable: event.target}, + elUserData, + {cloneLifetime: 300, cloneLimit: 10, cloneable: false}); elCloneableGroup.style.display = "block"; + EventBridge.emitWebEvent( + '{"id":' + lastEntityID + ', "type":"update", "properties":{"dynamic":false}}' + ); + EventBridge.emitWebEvent( + '{"id":' + lastEntityID + ', "type":"update", "properties":{"grabbable":true}}' + ); } else { elCloneableGroup.style.display = "none"; } - userDataChanger("grabbableKey", "cloneable", event.target, elUserData, null); + + userDataChanger("grabbableKey", "cloneable", checked, elUserData, null); }); var numberListener = function (event) { From 69949cd6b56c18bd173b9a59a209038c8e41d24f Mon Sep 17 00:00:00 2001 From: Menithal Date: Sun, 26 Feb 2017 18:49:13 +0200 Subject: [PATCH 05/11] Finalized Grab-Clone action --- .../system/controllers/handControllerGrab.js | 83 ++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index ea76490b7b..7f67c11a7c 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -266,6 +266,27 @@ CONTROLLER_STATE_MACHINE[STATE_OVERLAY_STYLUS_TOUCHING] = { }; CONTROLLER_STATE_MACHINE[STATE_OVERLAY_LASER_TOUCHING] = CONTROLLER_STATE_MACHINE[STATE_OVERLAY_STYLUS_TOUCHING]; +// Object assign polyfill +if (typeof Object.assign != 'function') { + Object.assign = function(target, varArgs) { + 'use strict'; + if (target == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var to = Object(target); + for (var index = 1; index < arguments.length; index++) { + var nextSource = arguments[index]; + if (nextSource != null) { + for (var nextKey in nextSource) { + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + return to; + }; +} function distanceBetweenPointAndEntityBoundingBox(point, entityProps) { var entityXform = new Xform(entityProps.rotation, entityProps.position); @@ -1437,7 +1458,18 @@ function MyController(hand) { return true; }; + this.entityIsCloneable = function(entityID) { + var entityProps = entityPropertiesCache.getGrabbableProps(entityID); + var props = entityPropertiesCache.getProps(entityID); + if (!props) { + return false; + } + if (entityProps.hasOwnProperty("cloneable")/*&& props.locked*/) { + return entityProps.cloneable; + } + return false; + } this.entityIsGrabbable = function(entityID) { var grabbableProps = entityPropertiesCache.getGrabbableProps(entityID); var props = entityPropertiesCache.getProps(entityID); @@ -1517,7 +1549,7 @@ function MyController(hand) { this.entityIsNearGrabbable = function(entityID, handPosition, maxDistance) { - if (!this.entityIsGrabbable(entityID)) { + if (!this.entityIsCloneable(entityID) && !this.entityIsGrabbable(entityID)) { return false; } @@ -2359,6 +2391,55 @@ function MyController(hand) { reparentProps.localPosition = this.offsetPosition; reparentProps.localRotation = this.offsetRotation; } + + if (grabbedProperties.userData.length > 0) { + try{ + var userData = JSON.parse(grabbedProperties.userData); + var grabInfo = userData.grabbableKey; + if (grabInfo && grabInfo.cloneable) { + + var worldEntities = Entities.findEntitiesInBox(Vec3.subtract(MyAvatar.position, {x:25,y:25, z:25}), {x:50, y: 50, z: 50}) + var count = 0; + worldEntities.forEach(function(item) { + var item = Entities.getEntityProperties(item, ["name"]); + if (item.name === grabbedProperties.name) { + count++; + } + }) + var cloneableProps = Entities.getEntityProperties(grabbedProperties.id); + var lifetime = grabInfo.cloneLifetime ? grabInfo.cloneLifetime : 300; + var limit = grabInfo.cloneLimit ? grabInfo.cloneLimit : 10; + var cUserData = Object.assign({}, userData); + var cProperties = Object.assign({}, cloneableProps); + + if (count > limit) { + delete cloneableProps; + delete lifetime; + delete cUserData; + delete cProperties; + return; + } + + delete cUserData.grabbableKey.cloneLifetime; + delete cUserData.grabbableKey.cloneable; + delete cUserData.grabbableKey.cloneLimit; + delete cProperties.id + cUserData.grabbableKey.triggerable = true; + cUserData.grabbableKey.grabbable = true; + cProperties.lifetime = lifetime; + cProperties.userData = JSON.stringify(cUserData); + this.grabbedEntity = Entities.addEntity(cProperties); + grabbedProperties = Entities.getEntityProperties(this.grabbedEntity); + var _this = this; + Script.setTimeout(function () { + // This is needed to wait for the grabbed entity to have been instanciated. + _this.callEntityMethodOnGrabbed("startEquip"); + },400); + } + }catch(e) { + print("ERROR: " + e); + } + } Entities.editEntity(this.grabbedEntity, reparentProps); if (this.thisHandIsParent(grabbedProperties)) { From 1d8be2aeaa682c3fa33b65077f6eb3543c09a995 Mon Sep 17 00:00:00 2001 From: Menithal Date: Sun, 26 Feb 2017 19:17:46 +0200 Subject: [PATCH 06/11] Added missing dynamic --- scripts/system/controllers/handControllerGrab.js | 5 +++++ scripts/system/html/entityProperties.html | 4 ++++ scripts/system/html/js/entityProperties.js | 12 +++++++----- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 7f67c11a7c..4b469798ab 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -2409,6 +2409,7 @@ function MyController(hand) { var cloneableProps = Entities.getEntityProperties(grabbedProperties.id); var lifetime = grabInfo.cloneLifetime ? grabInfo.cloneLifetime : 300; var limit = grabInfo.cloneLimit ? grabInfo.cloneLimit : 10; + var dynamic = grabInfo.cloneDynamic ? grabInfo.cloneDynamic : false; var cUserData = Object.assign({}, userData); var cProperties = Object.assign({}, cloneableProps); @@ -2422,8 +2423,12 @@ function MyController(hand) { delete cUserData.grabbableKey.cloneLifetime; delete cUserData.grabbableKey.cloneable; + delete cUserData.grabbableKey.cloneDynamic; delete cUserData.grabbableKey.cloneLimit; delete cProperties.id + + cProperties.dynamic = dynamic; + cProperties.locked = false; cUserData.grabbableKey.triggerable = true; cUserData.grabbableKey.grabbable = true; cProperties.lifetime = lifetime; diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index e775be9e3a..a0497d6a92 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -312,6 +312,10 @@
+
+ + +
diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index abffdaee96..2c77d54e85 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -603,7 +603,7 @@ function loaded() { var elGrabbable = document.getElementById("property-grabbable"); var elCloneable = document.getElementById("property-cloneable"); - + var elCloneableDynamic = document.getElementById("property-cloneable-dynamic"); var elCloneableGroup = document.getElementById("group-cloneable-group"); var elCloneableLifetime = document.getElementById("property-cloneable-lifetime"); var elCloneableLimit = document.getElementById("property-cloneable-limit"); @@ -893,15 +893,14 @@ function loaded() { elCloneableGroup.style.display = elCloneable.checked ? "block": "none"; elCloneableLimit.value = elCloneable.checked ? 10: 0; elCloneableLifetime.value = elCloneable.checked ? 300: 0; + elCloneableDynamic.checked = parsedUserData["grabbableKey"].cloneDynamic ? parsedUserData["grabbableKey"].cloneDynamic : properties.dynamic; elDynamic.checked = elCloneable.checked ? false: properties.dynamic; - } else { elCloneable.checked = false; - + elCloneableDynamic.checked = false; elCloneableGroup.style.display = elCloneable.checked ? "block": "none"; elCloneableLimit.value = 0; elCloneableLifetime.value = 0; - } if ("cloneLifetime" in parsedUserData["grabbableKey"]) { elCloneableLifetime.value = parsedUserData["grabbableKey"].cloneLifetime; @@ -1203,11 +1202,14 @@ function loaded() { elGrabbable.addEventListener('change', function() { userDataChanger("grabbableKey", "grabbable", elGrabbable, elUserData, properties.dynamic); }); + elCloneableDynamic.addEventListener('change', function (event){ + userDataChanger("grabbableKey", "cloneDynamic", event.target, elUserData, -1); + }); elCloneable.addEventListener('change', function (event) { var checked = event.target.checked; if (checked) { multiUserDataChanger("grabbableKey", - {cloneLifetime: elCloneableLifetime, cloneLimit: elCloneableLimit, cloneable: event.target}, + {cloneLifetime: elCloneableLifetime, cloneLimit: elCloneableLimit, cloneDynamic: elCloneableDynamic, cloneable: event.target}, elUserData, {cloneLifetime: 300, cloneLimit: 10, cloneable: false}); elCloneableGroup.style.display = "block"; From 9fbde41dc45508324ac1feef09f647cc51b39c44 Mon Sep 17 00:00:00 2001 From: Menithal Date: Mon, 27 Feb 2017 23:27:48 +0200 Subject: [PATCH 07/11] Styling formating and Rebuild attempt --- .../system/controllers/handControllerGrab.js | 99 ++++++++++--------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 4b469798ab..ad6adf7722 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -1465,7 +1465,7 @@ function MyController(hand) { return false; } - if (entityProps.hasOwnProperty("cloneable")/*&& props.locked*/) { + if (entityProps.hasOwnProperty("cloneable")) { return entityProps.cloneable; } return false; @@ -2393,57 +2393,58 @@ function MyController(hand) { } if (grabbedProperties.userData.length > 0) { - try{ - var userData = JSON.parse(grabbedProperties.userData); - var grabInfo = userData.grabbableKey; - if (grabInfo && grabInfo.cloneable) { + try{ + var userData = JSON.parse(grabbedProperties.userData); + var grabInfo = userData.grabbableKey; + if (grabInfo && grabInfo.cloneable) { + // Check if + var worldEntities = Entities.findEntitiesInBox(Vec3.subtract(MyAvatar.position, {x:25,y:25, z:25}), {x:50, y: 50, z: 50}) + var count = 0; + worldEntities.forEach(function(item) { + var item = Entities.getEntityProperties(item, ["name"]); + if (item.name === grabbedProperties.name) { + count++; + } + }) + var cloneableProps = Entities.getEntityProperties(grabbedProperties.id); + var lifetime = grabInfo.cloneLifetime ? grabInfo.cloneLifetime : 300; + var limit = grabInfo.cloneLimit ? grabInfo.cloneLimit : 10; + var dynamic = grabInfo.cloneDynamic ? grabInfo.cloneDynamic : false; + var cUserData = Object.assign({}, userData); + var cProperties = Object.assign({}, cloneableProps); - var worldEntities = Entities.findEntitiesInBox(Vec3.subtract(MyAvatar.position, {x:25,y:25, z:25}), {x:50, y: 50, z: 50}) - var count = 0; - worldEntities.forEach(function(item) { - var item = Entities.getEntityProperties(item, ["name"]); - if (item.name === grabbedProperties.name) { - count++; + if (count > limit) { + delete cloneableProps; + delete lifetime; + delete cUserData; + delete cProperties; + return; + } + + delete cUserData.grabbableKey.cloneLifetime; + delete cUserData.grabbableKey.cloneable; + delete cUserData.grabbableKey.cloneDynamic; + delete cUserData.grabbableKey.cloneLimit; + delete cProperties.id + + cProperties.dynamic = dynamic; + cProperties.locked = false; + cUserData.grabbableKey.triggerable = true; + cUserData.grabbableKey.grabbable = true; + cProperties.lifetime = lifetime; + cProperties.userData = JSON.stringify(cUserData); + this.grabbedEntity = Entities.addEntity(cProperties); + grabbedProperties = Entities.getEntityProperties(this.grabbedEntity); + var _this = this; + + Script.setTimeout(function () { + // This is needed to wait for the grabbed entity to have been instanciated. + _this.callEntityMethodOnGrabbed("startEquip"); + },400); } - }) - var cloneableProps = Entities.getEntityProperties(grabbedProperties.id); - var lifetime = grabInfo.cloneLifetime ? grabInfo.cloneLifetime : 300; - var limit = grabInfo.cloneLimit ? grabInfo.cloneLimit : 10; - var dynamic = grabInfo.cloneDynamic ? grabInfo.cloneDynamic : false; - var cUserData = Object.assign({}, userData); - var cProperties = Object.assign({}, cloneableProps); - - if (count > limit) { - delete cloneableProps; - delete lifetime; - delete cUserData; - delete cProperties; - return; - } - - delete cUserData.grabbableKey.cloneLifetime; - delete cUserData.grabbableKey.cloneable; - delete cUserData.grabbableKey.cloneDynamic; - delete cUserData.grabbableKey.cloneLimit; - delete cProperties.id - - cProperties.dynamic = dynamic; - cProperties.locked = false; - cUserData.grabbableKey.triggerable = true; - cUserData.grabbableKey.grabbable = true; - cProperties.lifetime = lifetime; - cProperties.userData = JSON.stringify(cUserData); - this.grabbedEntity = Entities.addEntity(cProperties); - grabbedProperties = Entities.getEntityProperties(this.grabbedEntity); - var _this = this; - Script.setTimeout(function () { - // This is needed to wait for the grabbed entity to have been instanciated. - _this.callEntityMethodOnGrabbed("startEquip"); - },400); + }catch(e) { + print("ERROR: " + e); } - }catch(e) { - print("ERROR: " + e); - } } Entities.editEntity(this.grabbedEntity, reparentProps); From d0c2c26a8e77209d6cba4c4a5c97538a4678d268 Mon Sep 17 00:00:00 2001 From: Matti Lahtinen Date: Tue, 28 Feb 2017 16:37:08 +0200 Subject: [PATCH 08/11] One last gotcha from the conflict resolution. --- scripts/system/controllers/handControllerGrab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 14d737de55..fd13b74f7d 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -2497,7 +2497,7 @@ function MyController(hand) { cProperties.lifetime = lifetime; cProperties.userData = JSON.stringify(cUserData); this.grabbedThingID = Entities.addEntity(cProperties); - grabbedProperties = Entities.getEntityProperties(this.grabbedEntity); + grabbedProperties = Entities.getEntityProperties(this.grabbedThingID); var _this = this; Script.setTimeout(function () { From f538ac24f30515a2abd0f772a9a1822fe033b1d5 Mon Sep 17 00:00:00 2001 From: Menithal Date: Wed, 1 Mar 2017 22:07:02 +0200 Subject: [PATCH 09/11] Various Properties --- scripts/system/html/entityProperties.html | 2 +- scripts/system/html/js/entityProperties.js | 149 +++++++++++---------- 2 files changed, 78 insertions(+), 73 deletions(-) diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index a0497d6a92..5022dbd6a6 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -305,7 +305,7 @@ -
+