feat: implemented KeyedBossBars

This commit is contained in:
Andrey Terentev 2025-03-09 22:01:37 +07:00
parent 899e7ac4ca
commit 5253b89779
2 changed files with 66 additions and 0 deletions

View File

@ -5,11 +5,13 @@ import lombok.experimental.UtilityClass;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.event.player.PlayerDisconnectEvent;
import ru.dragonestia.msb3.api.entity.PickableItem; import ru.dragonestia.msb3.api.entity.PickableItem;
import ru.dragonestia.msb3.api.item.ItemUtil; import ru.dragonestia.msb3.api.item.ItemUtil;
import ru.dragonestia.msb3.api.resource.DialogueResources; import ru.dragonestia.msb3.api.resource.DialogueResources;
import ru.dragonestia.msb3.api.resource.MonologueResources; import ru.dragonestia.msb3.api.resource.MonologueResources;
import ru.dragonestia.msb3.api.ui.BlackScreen; import ru.dragonestia.msb3.api.ui.BlackScreen;
import ru.dragonestia.msb3.api.ui.bossbar.KeyedBossBars;
import ru.dragonestia.msb3.api.ui.navigator.Navigator; import ru.dragonestia.msb3.api.ui.navigator.Navigator;
import ru.dragonestia.msb3.api.util.ResourceFromJar; import ru.dragonestia.msb3.api.util.ResourceFromJar;
import ru.dragonestia.msb3.resource.Resources; import ru.dragonestia.msb3.resource.Resources;
@ -75,6 +77,12 @@ public final class ServerBootstrap {
compileResourcePack(); compileResourcePack();
initializer.onResourcePackCompiled(Resources.getResourcePack()); initializer.onResourcePackCompiled(Resources.getResourcePack());
MinecraftServer.getGlobalEventHandler().addListener(PlayerDisconnectEvent.class, event -> {
var player = event.getPlayer();
KeyedBossBars.hideAll(player);
});
} }
private void initDefaultModules() { private void initDefaultModules() {
@ -96,6 +104,7 @@ public final class ServerBootstrap {
private void initDefaultGlyphs() { private void initDefaultGlyphs() {
ClassPreLoader.preload(BlackScreen.class); ClassPreLoader.preload(BlackScreen.class);
ClassPreLoader.preload(Navigator.class); ClassPreLoader.preload(Navigator.class);
ClassPreLoader.preload(KeyedBossBars.class);
MonologueResources.registerAvatar(MonologueResources.DEFAULT, ResourceFromJar.of(ServerBootstrap.CLASS_LOADER, "glyphs/monologue/default_avatar.png")); MonologueResources.registerAvatar(MonologueResources.DEFAULT, ResourceFromJar.of(ServerBootstrap.CLASS_LOADER, "glyphs/monologue/default_avatar.png"));
MonologueResources.registerFrame(MonologueResources.DEFAULT, ResourceFromJar.of(ServerBootstrap.CLASS_LOADER, "glyphs/monologue/avatar_frame.png")); MonologueResources.registerFrame(MonologueResources.DEFAULT, ResourceFromJar.of(ServerBootstrap.CLASS_LOADER, "glyphs/monologue/avatar_frame.png"));

View File

@ -0,0 +1,57 @@
package ru.dragonestia.msb3.api.ui.bossbar;
import lombok.experimental.UtilityClass;
import net.kyori.adventure.bossbar.BossBar;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.text.Component;
import net.minestom.server.entity.Player;
import ru.dragonestia.msb3.api.util.ResourceFromJar;
import ru.dragonestia.msb3.resource.Resources;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@UtilityClass
public class KeyedBossBars {
static {
var rp = Resources.getResourcePack();
rp.texture(Key.key("minecraft", "gui/sprites/boss_bar/white_background.png"),
ResourceFromJar.of("glyphs/navigator/notched_20_background.png"));
rp.texture(Key.key("minecraft", "gui/sprites/boss_bar/white_progress.png"),
ResourceFromJar.of("glyphs/navigator/notched_20_progress.png"));
}
private final Map<UUID, Map<String, BossBar>> bars = new ConcurrentHashMap<>();
public void hideAll(Player player) {
var map = bars.remove(player.getUuid());
if (map == null) return;
map.forEach((barId, bossBar) -> player.hideBossBar(bossBar));
}
public void hide(Player player, String bossBarId) {
var map = bars.get(player.getUuid());
if (map == null) return;
var bossBar = map.remove(bossBarId);
if (bossBar == null) return;
player.hideBossBar(bossBar);
}
public BossBar show(Player player, String bossBarId, BossBar bossBar) {
var playerBars = bars.computeIfAbsent(player.getUuid(), uuid -> new ConcurrentHashMap<>());
var prev = playerBars.put(bossBarId, bossBar);
if (prev != null) player.hideBossBar(prev);
player.showBossBar(bossBar);
return bossBar;
}
public BossBar showText(Player player, String bossBarId, Component text) {
return show(player, bossBarId, BossBar.bossBar(text, 1, BossBar.Color.WHITE, BossBar.Overlay.PROGRESS));
}
}