package net.glowstone.boss; import net.glowstone.entity.GlowPlayer; import net.glowstone.net.message.play.player.BossBarMessage; import net.glowstone.util.TextMessage; 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 java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; public class GlowBossBar implements BossBar { private final UUID uniqueId; private String title; private BarColor color; private BarStyle style; private final List<BarFlag> flags = new ArrayList<>(); private double progress = 1.0; private final List<Player> players = new ArrayList<>(); private boolean visible = true; public GlowBossBar(String title, BarColor color, BarStyle style, double progress, BarFlag... flags) { this.uniqueId = UUID.randomUUID(); this.title = title; this.color = color; this.style = style; this.progress = progress; Collections.addAll(this.flags, flags); } public GlowBossBar(String title, BarColor color, BarStyle style, BarFlag... flags) { this(title, color, style, 1.0, flags); } @Override public String getTitle() { return title; } @Override public void setTitle(String title) { this.title = title; if (isVisible()) { sendUpdate(new BossBarMessage(getUniqueId(), BossBarMessage.Action.UPDATE_TITLE, new TextMessage(title))); } } @Override public BarColor getColor() { return color; } @Override public void setColor(BarColor color) { this.color = color; if (isVisible()) { sendUpdate(new BossBarMessage(getUniqueId(), BossBarMessage.Action.UPDATE_STYLE, BossBarMessage.Color.fromBarColor(color), BossBarMessage.Division.fromBarStyle(style))); } } @Override public BarStyle getStyle() { return style; } @Override public void setStyle(BarStyle style) { this.style = style; if (isVisible()) { sendUpdate(new BossBarMessage(getUniqueId(), BossBarMessage.Action.UPDATE_STYLE, BossBarMessage.Color.fromBarColor(color), BossBarMessage.Division.fromBarStyle(style))); } } @Override public void removeFlag(BarFlag flag) { if (flags.contains(flag)) { flags.remove(flag); if (isVisible()) { sendUpdate(new BossBarMessage(getUniqueId(), BossBarMessage.Action.UPDATE_FLAGS, flagsToByte())); } } } @Override public void addFlag(BarFlag flag) { if (!flags.contains(flag) && flag != null) { flags.add(flag); if (isVisible()) { sendUpdate(new BossBarMessage(getUniqueId(), BossBarMessage.Action.UPDATE_FLAGS, flagsToByte())); } } } @Override public boolean hasFlag(BarFlag flag) { return flags.contains(flag); } @Override public void setProgress(double progress) { this.progress = progress; if (isVisible()) { sendUpdate(new BossBarMessage(getUniqueId(), BossBarMessage.Action.UPDATE_HEALTH, (float) progress)); } } @Override public double getProgress() { return progress; } @Override public void addPlayer(Player player) { if (!players.contains(player)) { players.add(player); if (isVisible()) { sendUpdate(player, createAddAction()); } } } @Override public void removePlayer(Player player) { if (players.contains(player)) { if (isVisible()) { sendUpdate(player, createRemoveAction()); } players.remove(player); } } @Override public void removeAll() { if (isVisible()) { sendUpdate(createRemoveAction()); } players.clear(); } @Override public List<Player> getPlayers() { return players; } @Override public void setVisible(boolean visible) { if (this.visible != visible) { this.visible = visible; if (visible) { sendUpdate(createAddAction()); } else { sendUpdate(createRemoveAction()); } } } @Override public boolean isVisible() { return visible; } @Override public void show() { setVisible(true); } @Override public void hide() { setVisible(false); } public UUID getUniqueId() { return uniqueId; } private byte flagsToByte() { byte flags = 0; if (this.flags.contains(BarFlag.DARKEN_SKY)) { flags |= 0x01; } if (this.flags.contains(BarFlag.PLAY_BOSS_MUSIC)) { flags |= 0x02; } if (this.flags.contains(BarFlag.CREATE_FOG)) { flags |= 0x02; } return flags; } private BossBarMessage createAddAction() { return new BossBarMessage(getUniqueId(), BossBarMessage.Action.ADD, new TextMessage(title), (float) progress, BossBarMessage.Color.fromBarColor(color), BossBarMessage.Division.fromBarStyle(style), flagsToByte()); } private BossBarMessage createRemoveAction() { return new BossBarMessage(getUniqueId(), BossBarMessage.Action.REMOVE); } private void sendUpdate(BossBarMessage message) { for (Player player : getPlayers()) { sendUpdate(player, message); } } private void sendUpdate(Player player, BossBarMessage message) { if (player == null || !player.isOnline()) { return; } GlowPlayer impl = (GlowPlayer) player; impl.getSession().send(message); } @Override public boolean equals(Object obj) { if (obj.getClass() != GlowBossBar.class) { return false; } return ((GlowBossBar) obj).getUniqueId() == this.getUniqueId(); } }