From 135a3091b08792e7223b5b33d7bce2366bb6cd45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Mon, 1 Feb 2021 21:42:38 +0100 Subject: [PATCH] Don't show the drag ruler to players who cannot se the dragged token As a side effect this will now also show the coloring to other players --- CHANGELOG.md | 4 ++++ src/main.js | 36 +++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..26e5f03 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,4 @@ +# In development +## New features +- The drag ruler will now be colored for other players than the dragging player as well +- The drag ruler won't be shown to other players if they cannot see the dragged token diff --git a/src/main.js b/src/main.js index 75fe4db..e92ed69 100644 --- a/src/main.js +++ b/src/main.js @@ -6,7 +6,7 @@ import {registerSettings, settingsKey} from "./settings.js" Hooks.once("init", () => { registerSettings() hookTokenDragHandlers() - hookRulerHandlers() + hookRulerFunctions() patchRulerMeasure() patchRulerHighlightMeasurement() @@ -26,11 +26,13 @@ Hooks.once("ready", () => { }) Hooks.on("canvasReady", () => { - canvas.controls.ruler.draggedToken = null - Object.defineProperty(canvas.controls.ruler, "isDragRuler", { - get: function isDragRuler() { - return Boolean(this.draggedToken) // If draggedToken is set this is a drag ruler - } + canvas.controls.rulers.children.forEach(ruler => { + ruler.draggedToken = null + Object.defineProperty(ruler, "isDragRuler", { + get: function isDragRuler() { + return Boolean(this.draggedToken) // If draggedToken is set this is a drag ruler + } + }) }) }) @@ -62,7 +64,7 @@ function hookTokenDragHandlers() { } } -function hookRulerHandlers() { +function hookRulerFunctions() { const originalMoveTokenHandler = Ruler.prototype.moveToken Ruler.prototype.moveToken = function (event) { const eventHandled = onRulerMoveToken.call(this, event) @@ -70,6 +72,22 @@ function hookRulerHandlers() { return originalMoveTokenHandler.call(this, event) return true } + + const originalToJSON = Ruler.prototype.toJSON + Ruler.prototype.toJSON = function () { + const json = originalToJSON.call(this) + if (this.draggedToken) + json["draggedToken"] = this.draggedToken.data._id + return json + } + + const originalUpdate = Ruler.prototype.update + Ruler.prototype.update = function (data) { + if (data.draggedToken) { + this.draggedToken = canvas.tokens.get(data.draggedToken) + } + originalUpdate.call(this, data) + } } function onTokenLeftDragStart(event) { @@ -127,6 +145,10 @@ function patchRulerMeasure() { code = code.slice(code.indexOf("\n"), code.lastIndexOf("\n")) code = strInsertAfter(code, "for ( let [i, d] of distances.entries() ) {\n", "segments[i].startDistance = totalDistance\n") code = strInsertAfter(code, "this._highlightMeasurement(ray", ", s.startDistance") + + // Don't show ruler if the measured token is invisible + code = "if (this.isDragRuler && !this.draggedToken.isVisible) return [];" + code + Ruler.prototype.measure = new Function("destination", "{gridSpaces=true}={}", code) }