diff --git a/src/foundry_imports.js b/src/foundry_imports.js index 5580b57..34bf587 100644 --- a/src/foundry_imports.js +++ b/src/foundry_imports.js @@ -140,6 +140,10 @@ export function onMouseMove(event) { x: event.interactionData.destination.x, y: event.interactionData.destination.y, }; + if (!canvas.grid.isHex) { + destination.x += this.rulerOffset.x; + destination.y += this.rulerOffset.y; + } // Hide any existing Token HUD canvas.hud.token.clear(); diff --git a/src/main.js b/src/main.js index bbb985c..b31860e 100644 --- a/src/main.js +++ b/src/main.js @@ -137,6 +137,11 @@ function onEntityLeftDragStart(wrapped, event) { const ruler = canvas.controls.ruler; ruler.draggedEntity = this; const entityCenter = getEntityCenter(this); + const isV11 = game.release.generation === 11; + ruler.rulerOffset = { + x: isV11 ? entityCenter.x - event.interactionData.origin.x : 0, + y: isV11 ? entityCenter.y - event.interactionData.origin.y : 0, + }; if (game.settings.get(settingsKey, "autoStartMeasurement")) { let options = {}; setSnapParameterOnOptions(ruler, options); @@ -213,7 +218,7 @@ function applyGridlessSnapping(event) { const rasterWidth = 35 / canvas.stage.scale.x; const tokenX = event.interactionData.destination.x; const tokenY = event.interactionData.destination.y; - const destination = {x: tokenX, y: tokenY}; + const destination = {x: tokenX + ruler.rulerOffset.x, y: tokenY + ruler.rulerOffset.y}; const ranges = getRangesFromSpeedProvider(ruler.draggedEntity); const terrainRulerAvailable = game.modules.get("terrain-ruler")?.active; @@ -237,8 +242,8 @@ function applyGridlessSnapping(event) { const deltaY = destination.y - rasterLocation.y; const rasterDistance = Math.hypot(deltaX, deltaY); if (rasterDistance < rasterWidth) { - event.interactionData.destination.x = rasterLocation.x; - event.interactionData.destination.y = rasterLocation.y; + event.interactionData.destination.x = rasterLocation.x - ruler.rulerOffset.x; + event.interactionData.destination.y = rasterLocation.y - ruler.rulerOffset.y; } } } else { @@ -252,7 +257,7 @@ function applyGridlessSnapping(event) { }); origin = segments.pop().ray.A; waypointDistance = canvas.grid.measureDistances(segments).reduce((a, b) => a + b); - origin = {x: origin.x, y: origin.y}; + origin = {x: origin.x - ruler.rulerOffset.x, y: origin.y - ruler.rulerOffset.y}; } const deltaX = tokenX - origin.x; diff --git a/src/ruler.js b/src/ruler.js index 851bd01..471f923 100644 --- a/src/ruler.js +++ b/src/ruler.js @@ -391,10 +391,14 @@ export function extendRuler() { if (this.waypoints.filter(w => !w.isPrevious).length > 1) { event.preventDefault(); const mousePosition = getPointer().getLocalPosition(canvas.tokens); + const rulerOffset = this.rulerOffset; // Options are not passed to _removeWaypoint in vanilla Foundry. // Send them in case other modules have overriden that behavior and accept an options parameter (Toggle Snap to Grid) - this._removeWaypoint({x: mousePosition.x, y: mousePosition.y}, options); + this._removeWaypoint( + {x: mousePosition.x + rulerOffset.x, y: mousePosition.y + rulerOffset.y}, + options, + ); this.performPostPathfindingActions(options); } else { this.dragRulerAbortDrag(event); @@ -490,8 +494,8 @@ export function extendRuler() { ruler.dragRulerAddWaypoint(entityCenter, {snap: false}); const mousePosition = getPointer().getLocalPosition(canvas.tokens); const destination = { - x: mousePosition.x, - y: mousePosition.y, + x: mousePosition.x + ruler.rulerOffset.x, + y: mousePosition.y + ruler.rulerOffset.y, }; if (measureImmediately) ruler.measure(destination, options); } diff --git a/src/util.js b/src/util.js index 7034a93..6626507 100644 --- a/src/util.js +++ b/src/util.js @@ -301,7 +301,8 @@ export function getPointer() { export function getMeasurePosition() { const mousePosition = getPointer().getLocalPosition(canvas.tokens); - const measurePosition = {x: mousePosition.x, y: mousePosition.y}; + const rulerOffset = canvas.controls.ruler.rulerOffset; + const measurePosition = {x: mousePosition.x + rulerOffset.x, y: mousePosition.y + rulerOffset.y}; return measurePosition; }