package tc.oc.commons.bukkit.bossbar; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.inject.Inject; import com.google.common.collect.ImmutableList; import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; import org.bukkit.entity.Player; import tc.oc.commons.bukkit.chat.ComponentRenderContext; import tc.oc.commons.core.chat.Components; public class RenderedBossBar implements BossBar { private final ComponentRenderContext renderer; private final BossBarFactory bossBarFactory; private final Map<Player, BossBar> views = new HashMap<>(); private BaseComponent title = Components.blank(); private double progress = 0; private final Set<BarFlag> flags = EnumSet.noneOf(BarFlag.class); private BarColor color = BarColor.PURPLE; private BarStyle style = BarStyle.SOLID; private boolean visibile = true; @Inject RenderedBossBar(ComponentRenderContext renderer, BossBarFactory bossBarFactory) { this.renderer = renderer; this.bossBarFactory = bossBarFactory; } @Override public BaseComponent getTitle() { return title; } @Override public BarColor getColor() { return color; } @Override public BarStyle getStyle() { return style; } @Override public double getProgress() { return progress; } @Override public boolean hasFlag(BarFlag flag) { return this.flags.contains(flag); } @Override public boolean isVisible() { return visibile; } @Override public List<Player> getPlayers() { return ImmutableList.copyOf(views.keySet()); } @Override public void setTitle(BaseComponent title) { this.title = title; views.entrySet().forEach(entry -> entry.getValue().setTitle(renderer.render(title, entry.getKey()))); } @Override public void setColor(BarColor color) { this.color = color; views.values().forEach(view -> view.setColor(color)); } @Override public void setStyle(BarStyle style) { this.style = style; views.values().forEach(view -> view.setStyle(style)); } @Override public void setFlags(Set<BarFlag> flags) { this.flags.clear(); this.flags.addAll(flags); views.values().forEach(view -> view.setFlags(flags)); } @Override public void removeFlag(BarFlag flag) { this.flags.remove(flag); views.values().forEach(view -> view.removeFlag(flag)); } @Override public void addFlag(BarFlag flag) { this.flags.add(flag); views.values().forEach(view -> view.addFlag(flag)); } @Override public void setProgress(double progress) { this.progress = progress; views.values().forEach(view -> view.setProgress(progress)); } @Override public void addPlayer(Player player) { if(!views.containsKey(player)) { final BossBar view = bossBarFactory.createBossBar(renderer.render(title, player), color, style, flags.toArray(new BarFlag[flags.size()])); view.setVisible(visibile); view.addPlayer(player); views.put(player, view); } } @Override public void removePlayer(Player player) { final BossBar view = views.remove(player); if(view != null) view.removePlayer(player); } @Override public void removeAll() { views.values().forEach(BossBar::removeAll); views.clear(); } @Override public void setVisible(boolean visible) { this.visibile = visible; views.values().forEach(view -> view.setVisible(visible)); } @Override public void show() { views.values().forEach(BossBar::show); } @Override public void hide() { views.values().forEach(BossBar::hide); } @Override public void update(BaseComponent title, double progress, BarColor color, BarStyle style, Set<BarFlag> flags) { this.title = title; this.progress = progress; this.color = color; this.style = style; this.flags.clear(); this.flags.addAll(flags); views.entrySet().forEach(entry -> entry.getValue().update(renderer.render(title, entry.getKey()), progress, color, style, flags)); } }