|
import { MODULE_SCOPE, TOP_KEY, BOTTOM_KEY } from "./const.js";
|
|
|
|
export function getTokenLOSheight(token) {
|
|
let losDiff;
|
|
let divideBy = WallHeight._isLevelsAutoCover && token.document.flags.levelsautocover?.ducking ? 3 : 1;
|
|
if (WallHeight._autoLosHeight) {
|
|
losDiff =
|
|
token.document.flags[MODULE_SCOPE]?.tokenHeight ||
|
|
WallHeight._losHeightMulti * canvas.scene.dimensions.distance *
|
|
Math.max(token.document.width, token.document.height) *
|
|
((Math.abs(token.document.texture.scaleX) + Math.abs(token.document.texture.scaleY)) / 2);
|
|
} else {
|
|
losDiff = token.document.flags[MODULE_SCOPE]?.tokenHeight || WallHeight._defaultTokenHeight;
|
|
}
|
|
|
|
return token.document.elevation + losDiff / divideBy;
|
|
}
|
|
|
|
export function getAdvancedLighting(document){
|
|
return game.settings.get(MODULE_SCOPE, 'globalAdvancedLighting') || document.getFlag(MODULE_SCOPE, "advancedLighting")
|
|
}
|
|
|
|
export function getWallBounds(wall) {
|
|
if(wall.document) wall = wall.document;
|
|
const top = wall.flags[MODULE_SCOPE]?.[TOP_KEY] ?? Infinity;
|
|
const bottom = wall.flags[MODULE_SCOPE]?.[BOTTOM_KEY] ?? -Infinity;
|
|
return { top, bottom }
|
|
}
|
|
|
|
export function getLevelsBounds(document){
|
|
const top = document.flags?.levels?.rangeTop ?? Infinity;
|
|
const bottom = document.flags?.levels?.rangeBottom ?? -Infinity;
|
|
return { top, bottom }
|
|
}
|
|
|
|
export function getSceneSettings(scene) {
|
|
let advancedVision = scene.flags[MODULE_SCOPE]?.advancedVision ?? true;
|
|
return {advancedVision};
|
|
}
|
|
|
|
export async function _old_migrateData(scene){
|
|
if(!scene) scene = canvas.scene;
|
|
const walls = Array.from(scene.walls);
|
|
const updates = [];
|
|
for (const wall of walls) {
|
|
const oldTop = wall.document.flags?.wallHeight?.wallHeightTop;
|
|
const oldBottom = wall.document.flags?.wallHeight?.wallHeightBottom;
|
|
if ((oldTop !== null && oldTop !== undefined) || (oldBottom !== null && oldBottom !== undefined)) {
|
|
const update = {
|
|
_id: wall.id,
|
|
flags: {
|
|
"wall-height": {
|
|
top: oldTop,
|
|
bottom: oldBottom,
|
|
},
|
|
"-=wallHeight": null
|
|
},
|
|
};
|
|
updates.push(update);
|
|
}
|
|
}
|
|
if(updates.length <= 0) return false;
|
|
await scene.updateEmbeddedDocuments("Wall", updates);
|
|
console.log("Wall Height - Migrated " + updates.length + " walls to new Wall Height data structure in scene " + scene.name);
|
|
return true;
|
|
|
|
}
|
|
|
|
export async function migrateData(scene){
|
|
if(!scene) scene = canvas.scene;
|
|
const walls = Array.from(scene.walls);
|
|
const updates = [];
|
|
for (const wall of walls) {
|
|
const oldTop = wall.flags?.wallHeight?.wallHeightTop;
|
|
const oldBottom = wall.flags?.wallHeight?.wallHeightBottom;
|
|
if ((oldTop !== null && oldTop !== undefined) || (oldBottom !== null && oldBottom !== undefined)) {
|
|
const update = {
|
|
_id: wall.id,
|
|
flags: {
|
|
"wall-height": {
|
|
top: oldTop,
|
|
bottom: oldBottom,
|
|
},
|
|
"-=wallHeight": null
|
|
},
|
|
};
|
|
if(wall.flags['token-attacher']){
|
|
const oldOffsetTop = wall.flags?.['token-attacher']?.offset?.elevation?.flags?.wallHeight?.wallHeightTop;
|
|
const oldOffsetBottom = wall.flags?.['token-attacher']?.offset?.elevation?.flags?.wallHeight?.wallHeightBottom;
|
|
if ((oldTop !== null && oldTop !== undefined) || (oldBottom !== null && oldBottom !== undefined)) {
|
|
setProperty(update, `flags.token-attacher.offset.elevation.flags.wall-height`,{
|
|
top: oldOffsetTop,
|
|
bottom: oldOffsetBottom
|
|
});
|
|
setProperty(update, `flags.token-attacher.offset.elevation.flags.-=wallHeight`, null);
|
|
}
|
|
}
|
|
updates.push(update);
|
|
}
|
|
}
|
|
if(updates.length <= 0) return false;
|
|
await scene.updateEmbeddedDocuments("Wall", updates,{'token-attacher': {update:true}});
|
|
ui.notifications.notify("Wall Height - Migrated " + updates.length + " walls to new Wall Height data structure in scene " + scene.name);
|
|
console.log("Wall Height - Migrated " + updates.length + " walls to new Wall Height data structure in scene " + scene.name);
|
|
return true;
|
|
}
|
|
|
|
export async function migrateTokenHeight(){
|
|
ui.notifications.notify("Wall Height - Migrating Token Height from Levels...");
|
|
const scenes = Array.from(game.scenes);
|
|
for(let scene of scenes){
|
|
await migrateTokenHeightInScene(scene);
|
|
}
|
|
const updates = [];
|
|
const actors = Array.from(game.actors);
|
|
for(const actor of actors){
|
|
const oldTokenHeight = actor.document.token.flags?.levels?.tokenHeight
|
|
if (oldTokenHeight) {
|
|
const update = {
|
|
_id: actor.id,
|
|
"token.flags.wall-height.tokenHeight": oldTokenHeight,
|
|
};
|
|
updates.push(update);
|
|
}
|
|
}
|
|
await Actor.updateDocuments(updates)
|
|
ui.notifications.notify("Wall Height - Migrated Token Height from Levels. You can migrate again with the provided macro if needeed.");
|
|
ui.notifications.warn("Global settings for Token Height need to be manually set in Wall Height module settings!", {permanent: true});
|
|
}
|
|
|
|
async function migrateTokenHeightInScene(scene){
|
|
const tokens = Array.from(scene.tokens);
|
|
const updates = [];
|
|
for (const token of tokens) {
|
|
const oldTokenHeight = token.document.flags?.levels?.tokenHeight
|
|
if (oldTokenHeight) {
|
|
const update = {
|
|
_id: token.id,
|
|
flags: {
|
|
"wall-height": {
|
|
tokenHeight: oldTokenHeight,
|
|
},
|
|
},
|
|
};
|
|
updates.push(update);
|
|
}
|
|
}
|
|
if(updates.length <= 0) return false;
|
|
await scene.updateEmbeddedDocuments("Token", updates);
|
|
return true;
|
|
}
|