diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java index 40f5854e5..8e86a6d62 100644 --- a/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java @@ -2,6 +2,7 @@ package net.citizensnpcs.trait.versioned; import java.util.Collection; import java.util.List; +import java.util.function.Supplier; import org.bukkit.Bukkit; import org.bukkit.attribute.Attribute; @@ -42,6 +43,7 @@ public class BossBarTrait extends Trait { private BarColor color = BarColor.PURPLE; @Persist private List flags = Lists.newArrayList(); + private Supplier progressProvider; @Persist private int range = -1; @Persist @@ -62,10 +64,12 @@ public class BossBarTrait extends Trait { private BossBar getBar() { if (npc.isSpawned() && isBoss(npc.getEntity()) && NMS.getBossBar(npc.getEntity()) != null) return (BossBar) NMS.getBossBar(npc.getEntity()); + if (barCache == null) { barCache = Bukkit.getServer().createBossBar(npc.getFullName(), color, style, flags.toArray(new BarFlag[flags.size()])); } + return barCache; } @@ -102,6 +106,7 @@ public class BossBarTrait extends Trait { if (isBoss) { onDespawn(); } + return isBoss; } @@ -113,6 +118,7 @@ public class BossBarTrait extends Trait { public void onDespawn() { if (barCache == null) return; + barCache.removeAll(); barCache.hide(); barCache = null; @@ -127,6 +133,7 @@ public class BossBarTrait extends Trait { public void run() { if (!npc.isSpawned()) return; + BossBar bar = getBar(); if (bar == null) return; @@ -157,21 +164,31 @@ public class BossBarTrait extends Trait { bar.setProgress(Math.max(0, Math.min(1, number))); } } + bar.setTitle(title); bar.setVisible(visible); + if (progressProvider != null) { + bar.setProgress(progressProvider.get()); + } + if (style != null) { bar.setStyle(style); } + if (color != null) { bar.setColor(color); } + for (BarFlag flag : BarFlag.values()) { bar.removeFlag(flag); } + for (BarFlag flag : flags) { bar.addFlag(flag); } + bar.removeAll(); + for (Player player : CitizensAPI.getLocationLookup().getNearbyPlayers(npc.getEntity().getLocation(), range > 0 ? range : Setting.BOSSBAR_RANGE.asInt())) { if (viewPermission != null && !player.hasPermission(viewPermission)) @@ -192,6 +209,10 @@ public class BossBarTrait extends Trait { this.flags = flags; } + public void setProgressProvider(Supplier provider) { + this.progressProvider = provider; + } + public void setRange(int range) { this.range = range; } @@ -232,24 +253,31 @@ public class BossBarTrait extends Trait { if (style != null) { trait.setStyle(style); } + if (color != null) { trait.setColor(color); } + if (track != null) { trait.setTrackVariable(track); } + if (title != null) { trait.setTitle(Messaging.parseComponents(title)); } + if (visible != null) { trait.setVisible(visible); } + if (range != null) { trait.setRange(range); } + if (viewpermission != null) { trait.setViewPermission(viewpermission); } + if (flags != null) { List parsed = Lists.newArrayList(); for (String s : Splitter.on(',').omitEmptyStrings().trimResults().split(flags)) {