mirror of
https://github.com/Minestom/Minestom.git
synced 2025-01-20 07:02:32 +01:00
Merge pull request #327 from Minestom/bossbar-removal
Remove legacy boss bars
This commit is contained in:
commit
85d4fd83f4
@ -1,20 +0,0 @@
|
||||
package net.minestom.server.bossbar;
|
||||
|
||||
/**
|
||||
* Represents the displayed color of a {@link BossBar}.
|
||||
* @deprecated Use {@link net.kyori.adventure.bossbar.BossBar.Color}
|
||||
*/
|
||||
@Deprecated
|
||||
public enum BarColor {
|
||||
PINK,
|
||||
BLUE,
|
||||
RED,
|
||||
GREEN,
|
||||
YELLOW,
|
||||
PURPLE,
|
||||
WHITE;
|
||||
|
||||
public net.kyori.adventure.bossbar.BossBar.Color asAdventureColor() {
|
||||
return net.kyori.adventure.bossbar.BossBar.Color.valueOf(this.name());
|
||||
}
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
package net.minestom.server.bossbar;
|
||||
|
||||
/**
|
||||
* Used to define the number of segments on a {@link BossBar}.
|
||||
*
|
||||
* @deprecated Use {@link net.kyori.adventure.bossbar.BossBar.Overlay}
|
||||
*/
|
||||
@Deprecated
|
||||
public enum BarDivision {
|
||||
SOLID,
|
||||
SEGMENT_6,
|
||||
SEGMENT_10,
|
||||
SEGMENT_12,
|
||||
SEGMENT_20;
|
||||
|
||||
public net.kyori.adventure.bossbar.BossBar.Overlay asAdventureOverlay() {
|
||||
return net.kyori.adventure.bossbar.BossBar.Overlay.values()[this.ordinal()];
|
||||
}
|
||||
}
|
@ -1,300 +0,0 @@
|
||||
package net.minestom.server.bossbar;
|
||||
|
||||
import net.minestom.server.Viewable;
|
||||
import net.minestom.server.chat.JsonMessage;
|
||||
import net.minestom.server.entity.Player;
|
||||
import net.minestom.server.network.packet.server.play.BossBarPacket;
|
||||
import net.minestom.server.utils.MathUtils;
|
||||
import net.minestom.server.utils.validate.Check;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
|
||||
/**
|
||||
* Represents a boss bar which is displayed on the top of the client screen (max amount of boss bar defined by {@link #MAX_BOSSBAR}).
|
||||
* <p>
|
||||
* To use it, create a new instance using the constructor
|
||||
* and add the {@link Player} you want using {@link #addViewer(Player)} and remove them using {@link #removeViewer(Player)}.
|
||||
* <p>
|
||||
* You can retrieve all the boss bars of a {@link Player} with {@link #getBossBars(Player)}.
|
||||
*
|
||||
* @deprecated Use {@link net.kyori.adventure.bossbar.BossBar}
|
||||
*/
|
||||
@Deprecated
|
||||
public class BossBar implements Viewable {
|
||||
|
||||
private static final int MAX_BOSSBAR = 7;
|
||||
private static final Map<UUID, Set<BossBar>> PLAYER_BOSSBAR_MAP = new HashMap<>();
|
||||
|
||||
private final UUID uuid = UUID.randomUUID();
|
||||
private final Set<Player> viewers = new CopyOnWriteArraySet<>();
|
||||
private final Set<Player> unmodifiableViewers = Collections.unmodifiableSet(viewers);
|
||||
|
||||
private JsonMessage title;
|
||||
private float progress;
|
||||
private BarColor color;
|
||||
private BarDivision division;
|
||||
private byte flags;
|
||||
|
||||
/**
|
||||
* Creates a new {@link BossBar}.
|
||||
*
|
||||
* @param title the boss bar title
|
||||
* @param color the boss bar color
|
||||
* @param division the boss bar division
|
||||
*/
|
||||
public BossBar(@NotNull JsonMessage title, @NotNull BarColor color, @NotNull BarDivision division) {
|
||||
this.title = title;
|
||||
this.color = color;
|
||||
this.division = division;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all the visible boss bars of a {@link Player}.
|
||||
*
|
||||
* @param player the player to check the boss bars
|
||||
* @return all the visible boss bars of the player, null if not any
|
||||
*/
|
||||
@Nullable
|
||||
public static Set<BossBar> getBossBars(@NotNull Player player) {
|
||||
return PLAYER_BOSSBAR_MAP.getOrDefault(player.getUuid(), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean addViewer(@NotNull Player player) {
|
||||
// Check already viewer
|
||||
if (isViewer(player)) {
|
||||
return false;
|
||||
}
|
||||
// Check max boss bar count
|
||||
final Set<BossBar> playerBossBars = getBossBars(player);
|
||||
if (playerBossBars != null && playerBossBars.size() >= MAX_BOSSBAR) {
|
||||
return false;
|
||||
}
|
||||
|
||||
addToPlayer(player);
|
||||
return viewers.add(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean removeViewer(@NotNull Player player) {
|
||||
// Check not viewer
|
||||
final boolean result = this.viewers.remove(player);
|
||||
if (result) {
|
||||
removeToPlayer(player);
|
||||
}
|
||||
// Remove from the map
|
||||
removePlayer(player);
|
||||
return result;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Set<Player> getViewers() {
|
||||
return unmodifiableViewers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the bossbar title.
|
||||
*
|
||||
* @return the current title of the bossbar
|
||||
*/
|
||||
@NotNull
|
||||
public JsonMessage getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the bossbar title.
|
||||
*
|
||||
* @param title the new title of the bossbar
|
||||
*/
|
||||
public void setTitle(@NotNull JsonMessage title) {
|
||||
this.title = title;
|
||||
updateTitle();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the bossbar progress.
|
||||
*
|
||||
* @return the current progress of the bossbar
|
||||
*/
|
||||
public float getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the bossbar progress.
|
||||
*
|
||||
* @param progress the new progress bar percentage
|
||||
* @throws IllegalArgumentException if {@code progress} is not between 0 and 1
|
||||
*/
|
||||
public void setProgress(float progress) {
|
||||
Check.argCondition(!MathUtils.isBetween(progress, 0, 1),
|
||||
"BossBar progress percentage should be between 0 and 1");
|
||||
this.progress = progress;
|
||||
updateProgress();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the bossbar color.
|
||||
*
|
||||
* @return the current bossbar color
|
||||
*/
|
||||
@NotNull
|
||||
public BarColor getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the bossbar color.
|
||||
*
|
||||
* @param color the new color of the bossbar
|
||||
*/
|
||||
public void setColor(@NotNull BarColor color) {
|
||||
this.color = color;
|
||||
updateStyle();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the bossbar division.
|
||||
*
|
||||
* @return the current bossbar division
|
||||
*/
|
||||
@NotNull
|
||||
public BarDivision getDivision() {
|
||||
return division;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the bossbar division.
|
||||
*
|
||||
* @param division the new bossbar division count
|
||||
*/
|
||||
public void setDivision(@NotNull BarDivision division) {
|
||||
this.division = division;
|
||||
updateStyle();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the bossbar flags.
|
||||
*
|
||||
* @return the flags
|
||||
*/
|
||||
public byte getFlags() {
|
||||
return flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the bossbar flags.
|
||||
*
|
||||
* @param flags the bossbar flags
|
||||
* @see <a href="https://wiki.vg/Protocol#Boss_Bar">Boss bar packet</a>
|
||||
*/
|
||||
public void setFlags(byte flags) {
|
||||
this.flags = flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the boss bar and remove all of its viewers.
|
||||
*/
|
||||
public void delete() {
|
||||
BossBarPacket bossBarPacket = new BossBarPacket();
|
||||
bossBarPacket.uuid = uuid;
|
||||
bossBarPacket.action = BossBarPacket.Action.REMOVE;
|
||||
sendPacketToViewers(bossBarPacket);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
BossBar bossBar = (BossBar) o;
|
||||
return Objects.equals(uuid, bossBar.uuid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(uuid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the player from the bossbar map.
|
||||
*
|
||||
* @param player the player to remove from the map
|
||||
*/
|
||||
private void removePlayer(@NotNull Player player) {
|
||||
final UUID uuid = player.getUuid();
|
||||
if (!PLAYER_BOSSBAR_MAP.containsKey(uuid)) {
|
||||
return;
|
||||
}
|
||||
Set<BossBar> bossBars = PLAYER_BOSSBAR_MAP.get(uuid);
|
||||
bossBars.remove(this);
|
||||
if (bossBars.isEmpty()) {
|
||||
PLAYER_BOSSBAR_MAP.remove(uuid);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a {@link BossBarPacket} to create the bossbar.
|
||||
* <p>
|
||||
* Also add the bossbar to the player viewing list.
|
||||
*
|
||||
* @param player the player to create the bossbar to
|
||||
*/
|
||||
private void addToPlayer(@NotNull Player player) {
|
||||
// Add to the map
|
||||
Set<BossBar> bossBars = PLAYER_BOSSBAR_MAP.computeIfAbsent(player.getUuid(), p -> new HashSet<>());
|
||||
bossBars.add(this);
|
||||
|
||||
BossBarPacket bossBarPacket = new BossBarPacket();
|
||||
bossBarPacket.uuid = uuid;
|
||||
bossBarPacket.action = BossBarPacket.Action.ADD;
|
||||
bossBarPacket.title = title.asComponent();
|
||||
bossBarPacket.health = progress;
|
||||
bossBarPacket.color = color.asAdventureColor();
|
||||
bossBarPacket.overlay = division.asAdventureOverlay();
|
||||
bossBarPacket.flags = flags;
|
||||
player.getPlayerConnection().sendPacket(bossBarPacket);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a {@link BossBarPacket} to remove the bossbar.
|
||||
*
|
||||
* @param player the player to remove the bossbar to
|
||||
*/
|
||||
private void removeToPlayer(@NotNull Player player) {
|
||||
if (!player.isRemoved()) {
|
||||
BossBarPacket bossBarPacket = new BossBarPacket();
|
||||
bossBarPacket.uuid = uuid;
|
||||
bossBarPacket.action = BossBarPacket.Action.REMOVE;
|
||||
player.getPlayerConnection().sendPacket(bossBarPacket);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTitle() {
|
||||
BossBarPacket bossBarPacket = new BossBarPacket();
|
||||
bossBarPacket.uuid = uuid;
|
||||
bossBarPacket.action = BossBarPacket.Action.UPDATE_TITLE;
|
||||
bossBarPacket.title = title.asComponent();
|
||||
sendPacketToViewers(bossBarPacket);
|
||||
}
|
||||
|
||||
private void updateProgress() {
|
||||
BossBarPacket bossBarPacket = new BossBarPacket();
|
||||
bossBarPacket.uuid = uuid;
|
||||
bossBarPacket.action = BossBarPacket.Action.UPDATE_HEALTH;
|
||||
bossBarPacket.health = progress;
|
||||
sendPacketToViewers(bossBarPacket);
|
||||
}
|
||||
|
||||
private void updateStyle() {
|
||||
BossBarPacket bossBarPacket = new BossBarPacket();
|
||||
bossBarPacket.uuid = uuid;
|
||||
bossBarPacket.action = BossBarPacket.Action.UPDATE_STYLE;
|
||||
bossBarPacket.color = color.asAdventureColor();
|
||||
sendPacketToViewers(bossBarPacket);
|
||||
}
|
||||
}
|
@ -518,16 +518,6 @@ public class Player extends LivingEntity implements CommandSender, Localizable,
|
||||
if (getOpenInventory() != null)
|
||||
getOpenInventory().removeViewer(this);
|
||||
|
||||
// Boss bars cache
|
||||
{
|
||||
Set<net.minestom.server.bossbar.BossBar> bossBars = net.minestom.server.bossbar.BossBar.getBossBars(this);
|
||||
if (bossBars != null) {
|
||||
for (net.minestom.server.bossbar.BossBar bossBar : bossBars) {
|
||||
bossBar.removeViewer(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MinecraftServer.getBossBarManager().removeAllBossBars(this);
|
||||
|
||||
// Advancement tabs cache
|
||||
|
Loading…
Reference in New Issue
Block a user