Merge pull request #193 from kezz/fix-boss-bar-progress

Ensure boss bars are registered on creation
This commit is contained in:
TheMode 2021-03-27 15:03:32 +01:00 committed by GitHub
commit cadbdd8300
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 25 deletions

View File

@ -25,16 +25,13 @@ final class BossBarHolder implements Viewable {
protected final UUID uuid = UUID.randomUUID(); protected final UUID uuid = UUID.randomUUID();
protected final Set<Player> players = new CopyOnWriteArraySet<>(); protected final Set<Player> players = new CopyOnWriteArraySet<>();
protected final BossBar bar; protected final BossBar bar;
protected boolean registered;
BossBarHolder(@NotNull BossBar bar) { BossBarHolder(@NotNull BossBar bar) {
this.bar = bar; this.bar = bar;
this.registered = false;
} }
@NotNull BossBarPacket createRemovePacket() { @NotNull BossBarPacket createRemovePacket() {
return this.createGenericPacket(REMOVE, packet -> { return this.createGenericPacket(REMOVE, packet -> { });
});
} }
@NotNull BossBarPacket createAddPacket() { @NotNull BossBarPacket createAddPacket() {

View File

@ -56,7 +56,7 @@ class BossBarListener implements BossBar.Listener {
private void doIfRegistered(@NotNull BossBar bar, @NotNull Consumer<BossBarHolder> consumer) { private void doIfRegistered(@NotNull BossBar bar, @NotNull Consumer<BossBarHolder> consumer) {
BossBarHolder holder = this.manager.bars.get(bar); BossBarHolder holder = this.manager.bars.get(bar);
if (holder != null && holder.registered) { if (holder != null) {
consumer.accept(holder); consumer.accept(holder);
} }
} }

View File

@ -9,6 +9,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/** /**
* Manages all boss bars known to this Minestom instance. Although this class can be used * Manages all boss bars known to this Minestom instance. Although this class can be used
@ -58,9 +59,9 @@ public class BossBarManager {
* @param bar the boss bar to hide * @param bar the boss bar to hide
*/ */
public void removeBossBar(@NotNull Player player, @NotNull BossBar bar) { public void removeBossBar(@NotNull Player player, @NotNull BossBar bar) {
BossBarHolder holder = this.getOrCreateHandler(bar); BossBarHolder holder = this.bars.get(bar);
if (holder.removeViewer(player)) { if (holder != null && holder.removeViewer(player)) {
player.getPlayerConnection().sendPacket(holder.createRemovePacket()); player.getPlayerConnection().sendPacket(holder.createRemovePacket());
this.removePlayer(player, holder); this.removePlayer(player, holder);
} }
@ -75,14 +76,7 @@ public class BossBarManager {
*/ */
public void addBossBar(@NotNull Collection<Player> players, @NotNull BossBar bar) { public void addBossBar(@NotNull Collection<Player> players, @NotNull BossBar bar) {
BossBarHolder holder = this.getOrCreateHandler(bar); BossBarHolder holder = this.getOrCreateHandler(bar);
Collection<Player> addedPlayers = new ArrayList<>(); Collection<Player> addedPlayers = players.stream().filter(holder::addViewer).collect(Collectors.toList());
for (Player player : players) {
if (holder.addViewer(player)) {
addedPlayers.add(player);
this.playerBars.computeIfAbsent(player.getUuid(), uuid -> new HashSet<>()).add(holder);
}
}
if (!addedPlayers.isEmpty()) { if (!addedPlayers.isEmpty()) {
PacketUtils.sendGroupedPacket(addedPlayers, holder.createAddPacket()); PacketUtils.sendGroupedPacket(addedPlayers, holder.createAddPacket());
@ -96,20 +90,16 @@ public class BossBarManager {
* @param bar the boss bar to hide * @param bar the boss bar to hide
*/ */
public void removeBossBar(@NotNull Collection<Player> players, @NotNull BossBar bar) { public void removeBossBar(@NotNull Collection<Player> players, @NotNull BossBar bar) {
BossBarHolder holder = this.getOrCreateHandler(bar); BossBarHolder holder = this.bars.get(bar);
Collection<Player> removedPlayers = new ArrayList<>();
for (Player player : players) { if (holder != null) {
if (holder.removeViewer(player)) { Collection<Player> removedPlayers = players.stream().filter(holder::removeViewer).collect(Collectors.toList());
removedPlayers.add(player);
this.removePlayer(player, holder);
}
}
if (!removedPlayers.isEmpty()) { if (!removedPlayers.isEmpty()) {
PacketUtils.sendGroupedPacket(removedPlayers, holder.createRemovePacket()); PacketUtils.sendGroupedPacket(removedPlayers, holder.createRemovePacket());
} }
} }
}
/** /**
* Completely destroys a boss bar, removing it from all players. * Completely destroys a boss bar, removing it from all players.