AFRAME.registerComponent("super-networked-interactable", { schema: { mass: { default: 1 }, counter: { type: "selector" } }, init: function() { this.counter = this.data.counter.components["networked-counter"]; this.hand = null; NAF.utils.getNetworkedEntity(this.el).then(networkedEl => { this.networkedEl = networkedEl; if (!NAF.utils.isMine(networkedEl)) { this.el.setAttribute("body", {type: "dynamic", mass: 0}); } else { this.counter.register(networkedEl); } }); this.grabStartListener = this._onGrabStart.bind(this); this.ownershipLostListener = this._onOwnershipLost.bind(this); this.el.addEventListener("grab-start", this.grabStartListener); this.el.addEventListener("ownership-lost", this.ownershipLostListener); }, remove: function() { this.counter.deregister(this.el); this.el.removeEventListener("grab-start", this.grabStartListener); this.el.removeEventListener("ownership-lost", this.ownershipLostListener); }, _onGrabStart: function(e) { this.hand = e.detail.hand; if (this.networkedEl && !NAF.utils.isMine(this.networkedEl)) { if (NAF.utils.takeOwnership(this.networkedEl)) { this.el.setAttribute("body", {mass: this.data.mass}); this.counter.register(this.networkedEl); } else { this.el.emit("grab-end", { hand: this.hand }); this.hand = null; } } }, _onOwnershipLost: function(e) { this.el.setAttribute("body", {mass: 0}); this.el.emit("grab-end", { hand: this.hand }); this.hand = null; this.counter.deregister(this.el); } });