diff --git a/tokenmagic/module/settings.js b/tokenmagic/module/settings.js index 91db5a3..f23d847 100644 --- a/tokenmagic/module/settings.js +++ b/tokenmagic/module/settings.js @@ -413,7 +413,14 @@ Hooks.once('init', () => { canvas.stage.on('mousemove', (event) => { const { x: mx, y: my } = event.data.getLocalPosition(canvas.templates); for (const template of canvas.templates.placeables) { + // A template whose _draw aborted (e.g. legacy scene data carried + // over from a system that no longer creates MeasuredTemplates, or + // a missing/failing texture) leaves `template.template` and the + // grid highlight layer undefined. Skip those rather than crash + // the pointermove pipeline. + if (!template.template) continue; const hl = canvas.interface.grid.getHighlightLayer(template.highlightId); + if (!hl) continue; const opacity = template.document.getFlag('tokenmagic', 'templateData')?.opacity ?? 1; if (template.texture && template.texture !== '') { const { x: cx, y: cy } = template.center; diff --git a/tokenmagic/module/tokenmagic.js b/tokenmagic/module/tokenmagic.js index 2073c8f..463bbb7 100644 --- a/tokenmagic/module/tokenmagic.js +++ b/tokenmagic/module/tokenmagic.js @@ -856,8 +856,11 @@ export function TokenMagic() { if (placeableType === PlaceableType.TEMPLATE) { let updateData = placeable.document.getFlag('tokenmagic', 'templateData'); if (!(updateData == null)) { - placeable.document.tmfxTextureAlpha = placeable._TMFXgetSprite().alpha = updateData.opacity; - placeable.document.tmfxTint = updateData.tint; + const sprite = placeable._TMFXgetSprite(); + if (sprite) { + placeable.document.tmfxTextureAlpha = sprite.alpha = updateData.opacity; + placeable.document.tmfxTint = updateData.tint; + } } } else if (placeableType === PlaceableType.REGION) { const sprite = placeable._TMFXgetSprite();