export class TemplateHandler{ static isVisible(wrapped, ...args){ const result = wrapped(...args); return result; const currentElevation = CONFIG.Levels.currentToken?.losHeight const templateElevation = this.document.flags.levels?.elevation; if(currentElevation === undefined || templateElevation === undefined || !CONFIG.Levels.currentToken) return result; const origin = { x: CONFIG.Levels.currentToken.x, y: CONFIG.Levels.currentToken.y, z: currentElevation } const target = { x: this.center.x, y: this.center.y, z: templateElevation } const isVisible = !CONFIG.Levels.handlers.SightHandler.testCollision(origin,target); return result && isVisible; } static async drawTooltip(wrapped, ...args){ await wrapped(...args); if(this.document.getFlag(CONFIG.Levels.MODULE_ID, "elevation")===0) return this; this.tooltip = this.addChild(_templateDrawTooltip(this)); function _templateDrawTooltip(template) { // Create the tooltip Text const tipFlag = template.document.getFlag(CONFIG.Levels.MODULE_ID, "elevation"); let tipN; if (tipFlag === undefined) { if (CONFIG.Levels.UI.nextTemplateHeight !== undefined) { tipN = CONFIG.Levels.UI.nextTemplateHeight; } else { const cToken = canvas.tokens.controlled[0] || _token; tipN = cToken?.document?.elevation ?? 0; } } else { tipN = tipFlag; } let units = canvas.scene.grid.units; const tip = tipN > 0 ? `+${tipN} ${units}` : `${tipN} ${units}`; const style = CONFIG.canvasTextStyle.clone(); style.fontSize = Math.max( Math.round(canvas.dimensions.size * 0.36 * 12) / 12, 36 ); const text = new PreciseText(tip, style); text.anchor.set(0.5, 2); return text; } return this; } static _refreshRulerText() { let special = this.document.flags.levels?.special// || _levels?.nextTemplateSpecial let text; let u = canvas.scene.grid.units; if ( this.document.t === "rect" ) { let d = canvas.dimensions; let dx = Math.round(this.ray.dx) * (d.distance / d.size); let dy = Math.round(this.ray.dy) * (d.distance / d.size); let w = Math.round(dx * 10) / 10; let h = Math.round(dy * 10) / 10; text = special ? `${w}${u} x ${h}${u} x ${special}${u}` : `${w}${u} x ${h}${u}`; } else { let d = Math.round(this.document.distance * 10) / 10; text = special ? `${d}${u} x ${special}${u}` : `${d}${u}`; } this.ruler.text = text; this.ruler.position.set(this.ray.dx + 10, this.ray.dy + 5); } static getTemplateData(){ const cToken = canvas.tokens.controlled[0] || _token; const handMode = typeof LevelsVolumetricTemplates !== "undefined" && LevelsVolumetricTemplates.tools.handMode && cToken ? Math.round( (cToken.losHeight - cToken?.document?.elevation) * 0.8 ) : 0; let elevation; let special; if (CONFIG.Levels.UI.nextTemplateHeight !== undefined) { elevation = CONFIG.Levels.UI.nextTemplateHeight; special = CONFIG.Levels.UI.nextTemplateSpecial; CONFIG.Levels.UI.nextTemplateHeight = undefined; CONFIG.Levels.UI.nextTemplateSpecial = undefined; CONFIG.Levels.UI.templateElevation = false; CONFIG.Levels.UI._levelsTemplateTool.active = false; $("body") .find(`li[data-tool="setTemplateElevation"]`) .removeClass("active"); } else { elevation = cToken?.document?.elevation + handMode || 0; } return { elevation, special }; } }