|
export class UIHandler {
|
|
static UIVisible(placeable) {
|
|
const isPreview = placeable.document?.id == null;
|
|
if (isPreview) {
|
|
placeable.visible = true;
|
|
if (CONFIG.Levels.UI?.rangeEnabled && !placeable.document?.flags?.levels) {
|
|
const uiRange = CONFIG.Levels.UI.getRange();
|
|
placeable.document.flags.levels = {
|
|
rangeBottom: uiRange.bottom,
|
|
rangeTop: uiRange.top,
|
|
};
|
|
}
|
|
return true;
|
|
}
|
|
if (!game.user.isGM || !CONFIG.Levels.UI?.rangeEnabled) return;
|
|
const isTokenSelected = canvas?.tokens?.controlled[0] || CONFIG.Levels.currentToken;
|
|
const isVision = canvas.effects.visionSources.size;
|
|
if (isTokenSelected && isVision) return;
|
|
if (isTokenSelected && !isVision && !(placeable instanceof Token)) return;
|
|
if ((canvas?.tokens?.controlled[0] || CONFIG.Levels.currentToken) && canvas.effects.visionSources.size) return;
|
|
let { rangeBottom, rangeTop } = CONFIG.Levels.helpers.getRangeForDocument(placeable.document);
|
|
rangeBottom = placeable.document.elevation ?? rangeBottom;
|
|
if (rangeBottom == -Infinity && rangeTop == Infinity) return;
|
|
if (placeable instanceof Token) {
|
|
rangeBottom = placeable.losHeight;
|
|
rangeTop = placeable.losHeight;
|
|
}
|
|
placeable.visible = placeable instanceof Tile ? CONFIG.Levels.handlers.UIHandler.inUIRangeTile(rangeBottom, rangeTop, placeable) : CONFIG.Levels.handlers.UIHandler.inUIRange(rangeBottom, rangeTop);
|
|
}
|
|
|
|
static tokenUIWrapperIsVisible(wrapped, ...args) {
|
|
if (!game.user.isGM || !CONFIG.Levels.UI?.rangeEnabled) return wrapped(...args);
|
|
const isTokenSelected = canvas?.tokens?.controlled[0] || CONFIG.Levels.currentToken;
|
|
const isVision = canvas.effects.visionSources.size;
|
|
if ((isTokenSelected && !isVision) || !isTokenSelected) {
|
|
const wrappedResult = wrapped(...args);
|
|
return wrappedResult && CONFIG.Levels.handlers.UIHandler.inUIRange(this.losHeight, this.losHeight);
|
|
} else {
|
|
return wrapped(...args);
|
|
}
|
|
}
|
|
|
|
static emitsLightUI(light) {
|
|
if (!game.user.isGM || !CONFIG.Levels.UI?.rangeEnabled || CONFIG.Levels.currentToken) return true;
|
|
const { rangeBottom, rangeTop } = CONFIG.Levels.helpers.getRangeForDocument(light.document);
|
|
const UITop = parseFloat(CONFIG.Levels.UI.range[1]);
|
|
const UIBottom = parseFloat(CONFIG.Levels.UI.range[0]);
|
|
return rangeTop <= UITop && rangeBottom >= UIBottom;
|
|
}
|
|
|
|
static inUIRange(bottom, top) {
|
|
const UIBottom = parseFloat(CONFIG.Levels.UI.range[0]);
|
|
const UITop = parseFloat(CONFIG.Levels.UI.range[1]);
|
|
return bottom >= UIBottom && top <= UITop;
|
|
}
|
|
|
|
static inUIRangeTile(bottom, top, tile) {
|
|
const overhead = tile.document.overhead;
|
|
const UIBottom = parseFloat(CONFIG.Levels.UI.range[0]);
|
|
const UITop = parseFloat(CONFIG.Levels.UI.range[1]);
|
|
if (!overhead) {
|
|
return UIBottom >= (canvas?.scene?.flags?.levels?.backgroundElevation ?? 0);
|
|
}
|
|
if (CONFIG.Levels.UI.roofEnabled) {
|
|
if (top == Infinity && bottom <= UITop + 1 && bottom >= UIBottom) {
|
|
return true;
|
|
}
|
|
}
|
|
return top <= UITop; //bottom >= UIBottom && top <= UITop;
|
|
}
|
|
}
|