Hooks.once("ready", function () { game.settings.register("bossbar", "currentHpPath", { name: game.i18n.localize("bossbar.settings.currentHpPath.name"), hint: game.i18n.localize("bossbar.settings.currentHpPath.hint"), scope: "world", config: true, type: String, default: "attributes.hp.value", }); game.settings.register("bossbar", "maxHpPath", { name: game.i18n.localize("bossbar.settings.maxHpPath.name"), hint: game.i18n.localize("bossbar.settings.maxHpPath.hint"), scope: "world", config: true, type: String, default: "attributes.hp.max", }); game.settings.register("bossbar", "barHeight", { name: game.i18n.localize("bossbar.settings.barHeight.name"), hint: game.i18n.localize("bossbar.settings.barHeight.hint"), scope: "world", config: true, type: Number, default: 20, }); game.settings.register("bossbar", "textSize", { name: game.i18n.localize("bossbar.settings.textSize.name"), hint: game.i18n.localize("bossbar.settings.textSize.hint"), scope: "world", config: true, type: Number, default: 20, }); game.settings.register("bossbar", "cameraPan", { name: game.i18n.localize("bossbar.settings.cameraPan.name"), hint: game.i18n.localize("bossbar.settings.cameraPan.hint"), scope: "world", config: true, type: Boolean, default: false, }); game.settings.register("bossbar", "position", { name: game.i18n.localize("bossbar.settings.position.name"), hint: game.i18n.localize("bossbar.settings.position.hint"), scope: "world", config: true, type: Number, choices: { 0: game.i18n.localize("bossbar.settings.position.opt0"), 1: game.i18n.localize("bossbar.settings.position.opt1"), }, default: 0, }); game.settings.register("bossbar", "backgroundPath", { name: game.i18n.localize("bossbar.settings.backgroundPath.name"), hint: game.i18n.localize("bossbar.settings.backgroundPath.hint"), scope: "world", config: true, type: String, default: "modules/bossbar/resources/Dark.webp", filePicker: true, }); game.settings.register("bossbar", "foregroundPath", { name: game.i18n.localize("bossbar.settings.foregroundPath.name"), hint: game.i18n.localize("bossbar.settings.foregroundPath.hint"), scope: "world", config: true, type: String, default: "modules/bossbar/resources/Blood.webp", filePicker: true, }); new window.Ardittristan.ColorSetting("bossbar", "tempBarColor", { name: game.i18n.localize("bossbar.settings.tempBarColor.name"), hint: game.i18n.localize("bossbar.settings.tempBarColor.hint"), label: game.i18n.localize("bossbar.settings.tempBarColor.label"), restricted: true, defaultColor: "#7e7e7e", scope: "world", }); Hooks.on("renderApplication", (app) => { if (app.id == "controls" || app.id =="navigation" || app.id == "camera-views") { BossBar.renderBossBar(); } }); BossBar.renderBossBar(); }); Hooks.once("ready", function () {}); Hooks.on("updateScene", async (scene, updates) => { if (!game.user.isGM) { if (updates.flags?.bossbar) { const ids = canvas.scene.getFlag("bossbar", "bossBarActive"); if (!ids) { if (canvas.scene._bossBars) { for (let bar of Object.entries(canvas.scene._bossBars)) { bar[1].unHook(); } delete canvas.scene._bossBars; } return; } for (let id of ids) { if (canvas.scene._bossBars && canvas.scene._bossBars[id]) { canvas.scene._bossBars[id].draw( game.settings.get("bossbar", "barHeight") ); return; } else { await BossBar.create(canvas.tokens.get(id)); } } } else { //BossBar.clearAll(); } } }); Hooks.on("getSceneControlButtons", (controls, b, c) => { if (!canvas.scene) return; let isBoss = canvas.scene.getFlag("bossbar", "bossBarActive") ? true : false; controls .find((c) => c.name == "token") .tools.push({ name: "bossBar", title: game.i18n.localize("bossbar.controls.bossUI.name"), icon: "fas fa-pastafarianism", toggle: true, visible: game.user.isGM, active: isBoss, onClick: async (toggle) => { if (toggle) { if (canvas.tokens.controlled[0]) { for (let token of canvas.tokens.controlled) { await BossBar.create(token); if (game.settings.get("bossbar", "cameraPan")) BossBar.panCamera(token); } } else { ui.notifications.warn( game.i18n.localize("bossbar.controls.bossUI.warn") ); } } else { await canvas.scene.unsetFlag("bossbar", "bossBarActive"); BossBar.remove(); } }, }); }); Object.byString = function (o, s) { s = s.replace(/\[(\w+)\]/g, ".$1"); // convert indexes to properties s = s.replace(/^\./, ""); // strip a leading dot var a = s.split("."); for (var i = 0, n = a.length; i < n; ++i) { var k = a[i]; if (k in o) { o = o[k]; } else { return; } } return o; };