Skip to content

Commit

Permalink
multibar
Browse files Browse the repository at this point in the history
  • Loading branch information
theripper93 committed Jul 12, 2021
1 parent 2489199 commit 12bf416
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 54 deletions.
74 changes: 50 additions & 24 deletions scripts/BossBar.js
Original file line number Diff line number Diff line change
@@ -1,57 +1,79 @@
class BossBar {
constructor() {
this.actor;
this.token;
this.bgPath = game.settings.get("bossbar", "backgroundPath");
this.fgPath = game.settings.get("bossbar", "foregroundPath");
}

static create(token, render = true) {
this.clear()
static async create(token, render = true) {
let instance = new BossBar();
instance.actor = token.actor;
instance.token = token
this.addBossBar(instance)
if (render) instance.draw(game.settings.get("bossbar", "barHeight"));
canvas.scene.setFlag("bossbar","bossBarActive",token.id)
if (game.user.isGM){
debugger
let oldBars = canvas.scene.getFlag("bossbar", "bossBarActive")
if(Array.isArray(oldBars)){oldBars.push(token.id)}else{oldBars=[token.id]}
await canvas.scene.setFlag("bossbar", "bossBarActive", oldBars);
}
this.hookId = Hooks.on("updateActor", (actor, updates) => {
if (
actor.id == instance.actor.id &&
Object.byString(updates, game.settings.get("bossbar", "currentHpPath"))
) {
instance.update();
}
});
return instance;
}

draw(h) {
if($("body").find(`div[id="bossBar-${this.id}"]`).length > 0) return
$("#navigation").append(
`<div style="flex-basis: 100%;height: 0;"></div><div id ="bossBar" class="bossBar">
`<div style="flex-basis: 100%;height: 0;"></div><div id ="bossBar-${this.id}" class="bossBar">
<a class="bossBarName">${this.name}</a>
<div id ="bossBarBar" style="z-index: 1000;">
<img id="bossBarMax" class="bossBarMax" src="${this.bgPath}" alt="test" width="100%" height="${h}">
<img id="bossBarCurrent" class="bossBarCurrent" src="${this.fgPath}" alt="test" width="100%" height="${h}">
<div id ="bossBarBar-${this.id}" style="z-index: 1000;">
<img id="bossBarMax-${this.id}" class="bossBarMax" src="${this.bgPath}" alt="test" width="100%" height="${h}">
<img id="bossBarCurrent-${this.id}" class="bossBarCurrent" src="${this.fgPath}" alt="test" width="100%" height="${h}">
</div>
</div>
`
);
this.update();
const bossBar = this;
Hooks.on("updateActor", (actor, updates) => {
if (
actor.id == this.actor.id &&
Object.byString(
updates,
game.settings.get("bossbar", "currentHpPath")
)
) {
bossBar.update();
}
});
}

update() {
document
.getElementById("bossBarCurrent")
.getElementById(`bossBarCurrent-${this.id}`)
.setAttribute("style", `width:${this.hpPercent}%;`);
}

static clear(){
$("body").find('div[id="bossBar"]').remove();
clear() {
$("body").find(`div[id="bossBar-${this.id}"]`).remove();
}

static remove(){
canvas.scene.unsetFlag("bossbar","bossBarActive").then(()=>{BossBar.clear()})
static clearAll(){
debugger
if(!canvas.scene._bossBars) return
for(let bar of Object.entries(canvas.scene._bossBars)){
$("body").find(`div[id="bossBar-${bar[1].id}"]`).remove();
}

}

remove() {
canvas.scene.unsetFlag("bossbar", "bossBarActive").then(() => {
this.clear();
});
}

static addBossBar(bossBar) {
if (!canvas.scene._bossBars) {
canvas.scene._bossBars = {};
}
canvas.scene._bossBars[bossBar.id] = bossBar;
}

get currentHp() {
Expand Down Expand Up @@ -79,4 +101,8 @@ class BossBar {
get name() {
return this.actor.data.name;
}

get id() {
return this.token.id;
}
}
80 changes: 50 additions & 30 deletions scripts/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,50 +47,70 @@ Hooks.once("init", function () {
});
});

Hooks.on("updateScene", (scene, updates) => {
if (updates.flags?.bossbar) {
BossBar.create(canvas.tokens.get(updates.flags?.bossbar.bossBarActive));
} else {
BossBar.clear();
Hooks.on("updateScene", async (scene, updates) => {
if (!game.user.isGM) {
if (updates.flags?.bossbar) {
const ids = canvas.scene.getFlag("bossbar", "bossBarActive");
if (!ids) 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.clear();
}
}
});

Hooks.on("renderApplication", () => {
Hooks.on("renderApplication", async () => {
if (canvas.scene) {
let tId = canvas.scene.getFlag("bossbar", "bossBarActive");
if (tId) {
BossBar.create(canvas.tokens.get(tId));
} else {
BossBar.clear();
BossBar.clearAll()
const ids = canvas.scene.getFlag("bossbar", "bossBarActive");
if (!ids) return;
for (let id of ids) {
if (canvas.scene._bossBars && canvas.scene._bossBars[id]) {
canvas.scene._bossBars[id].draw(
game.settings.get("bossbar", "barHeight")
);
} else {
await BossBar.create(canvas.tokens.get(id));
}
}
}
});

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: "toggleCylinder",
title: game.i18n.localize("bossbar.controls.bossUI.name"),
icon: "fas fa-pastafarianism",
toggle: true,
visible: game.user.isGM,
active: isBoss,
onClick: (toggle) => {
if(toggle){
if(canvas.tokens.controlled[0]){
BossBar.create(canvas.tokens.controlled[0])
}else{
ui.notifications.warn(game.i18n.localize("bossbar.controls.bossUI.warn"))
}
}else{
BossBar.remove()
.tools.push({
name: "toggleCylinder",
title: game.i18n.localize("bossbar.controls.bossUI.name"),
icon: "fas fa-pastafarianism",
toggle: true,
visible: game.user.isGM,
active: isBoss,
onClick: (toggle) => {
if (toggle) {
if (canvas.tokens.controlled[0]) {
BossBar.create(canvas.tokens.controlled[0]);
} else {
ui.notifications.warn(
game.i18n.localize("bossbar.controls.bossUI.warn")
);
}
} else {
BossBar.remove();
}
}
);
},
});
});

Object.byString = function (o, s) {
Expand Down

0 comments on commit 12bf416

Please sign in to comment.