All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.handyplus.lib.util.BossBarUtil Maven / Gradle / Ivy

The newest version!
package cn.handyplus.lib.util;

import cn.handyplus.lib.InitApi;
import cn.handyplus.lib.adapter.HandyRunnable;
import cn.handyplus.lib.adapter.HandySchedulerUtil;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarFlag;
import org.bukkit.boss.BarStyle;
import org.bukkit.boss.BossBar;
import org.bukkit.boss.KeyedBossBar;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * BossBar封装
 *
 * @author handy
 * @since 2.3.9
 */
public class BossBarUtil {

    private BossBarUtil() {
    }

    /**
     * 创建 BossBar
     *
     * @param title 标题
     * @return KeyedBossBar
     * @since 2.3.9
     */
    public static KeyedBossBar createBossBar(String title) {
        KeyedBossBar bossBar = Bukkit.createBossBar(
                new NamespacedKey(InitApi.PLUGIN, UUID.randomUUID().toString()),
                title,
                BarColor.PINK,
                BarStyle.SOLID
        );
        bossBar.setProgress(1.0);
        return bossBar;
    }

    /**
     * 设置风格
     *
     * @param bossBar  bossBar
     * @param barStyle barStyle
     */
    public static void setStyle(KeyedBossBar bossBar, BarStyle barStyle) {
        bossBar.setStyle(barStyle);
    }

    /**
     * 设置颜色
     *
     * @param bossBar  bossBar
     * @param barColor barColor
     */
    public static void setColor(KeyedBossBar bossBar, BarColor barColor) {
        bossBar.setColor(barColor);
    }

    /**
     * 设置进度 0.0 - 1.0
     *
     * @param bossBar  bossBar
     * @param progress progress
     */
    public static void setProgress(KeyedBossBar bossBar, double progress) {
        bossBar.setProgress(progress);
    }

    /**
     * 改变进度
     *
     * @param namespacedKey namespacedKey
     * @param delay         时间单位 秒
     * @since 3.6.3
     */
    public static void setProgress(NamespacedKey namespacedKey, Integer delay) {
        BigDecimal bigDecimal = BigDecimal.valueOf(0.1 / delay).setScale(5, RoundingMode.HALF_UP);
        final BigDecimal[] one = {BigDecimal.ONE};
        HandyRunnable handyRunnable = new HandyRunnable() {
            @Override
            public void run() {
                BossBar bossBar = getBossBar(namespacedKey);
                if (bossBar == null || !bossBar.isVisible() || one[0].compareTo(BigDecimal.ZERO) <= 0) {
                    this.cancel();
                    return;
                }
                one[0] = one[0].subtract(bigDecimal);
                if (one[0].compareTo(BigDecimal.ZERO) <= 0) {
                    one[0] = BigDecimal.ZERO;
                }
                bossBar.setProgress(one[0].doubleValue());
            }
        };
        HandySchedulerUtil.runTaskTimer(handyRunnable, 2, 2);
    }

    /**
     * 创建 BossBar
     *
     * @param config 配置文件
     * @param type   节点
     * @param title  标题
     * @return KeyedBossBar
     * @since 2.3.9
     */
    public static KeyedBossBar createBossBar(FileConfiguration config, String type, String title) {
        String color = config.getString(type + ".color", "PINK");
        String style = config.getString(type + ".style", "SOLID");
        BarColor barColor = BarColor.valueOf(color.toUpperCase());
        BarStyle barStyle = BarStyle.valueOf(style.toUpperCase());
        return createBossBar(title, barColor, barStyle);
    }

    /**
     * 创建 BossBar
     *
     * @param title    标题
     * @param barColor 颜色
     * @param barStyle 风格
     * @return KeyedBossBar
     * @since 2.3.9
     */
    public static KeyedBossBar createBossBar(String title, BarColor barColor, BarStyle barStyle) {
        KeyedBossBar bossBar = Bukkit.createBossBar(
                new NamespacedKey(InitApi.PLUGIN, UUID.randomUUID().toString()),
                title,
                barColor,
                barStyle
        );
        // 进度
        bossBar.setProgress(1.0);
        return bossBar;
    }

    /**
     * 创建 BossBar
     *
     * @param title    标题
     * @param barColor 颜色
     * @param barStyle 风格
     * @param barFlag  样式
     * @return KeyedBossBar
     * @since 2.3.9
     */
    public static KeyedBossBar createBossBar(String title, BarColor barColor, BarStyle barStyle, BarFlag barFlag) {
        KeyedBossBar bossBar = Bukkit.createBossBar(
                new NamespacedKey(InitApi.PLUGIN, UUID.randomUUID().toString()),
                title,
                barColor,
                barStyle,
                barFlag
        );
        bossBar.setProgress(1.0);
        return bossBar;
    }

    /**
     * 添加玩家
     *
     * @param namespacedKey key
     * @param player        玩家
     * @since 2.3.9
     */
    public static void addPlayer(NamespacedKey namespacedKey, Player player) {
        addPlayer(namespacedKey, Collections.singletonList(player));
    }

    /**
     * 添加玩家
     *
     * @param namespacedKey key
     * @param playerName    玩家
     * @since 2.3.9
     */
    public static void addPlayer(NamespacedKey namespacedKey, String playerName) {
        Optional playerOpt = BaseUtil.getOnlinePlayer(playerName);
        playerOpt.ifPresent(player -> addPlayer(namespacedKey, player));
    }

    /**
     * 添加玩家
     *
     * @param namespacedKey key
     * @param playerUuid    玩家
     * @since 2.3.9
     */
    public static void addPlayer(NamespacedKey namespacedKey, UUID playerUuid) {
        Optional onlinePlayer = BaseUtil.getOnlinePlayer(playerUuid);
        onlinePlayer.ifPresent(player -> addPlayer(namespacedKey, player));
    }

    /**
     * 添加玩家
     *
     * @param namespacedKey  key
     * @param playerUuidList 玩家列表
     * @since 2.3.9
     */
    public static void addPlayerByUuid(NamespacedKey namespacedKey, List playerUuidList) {
        for (UUID playerUuid : playerUuidList) {
            addPlayer(namespacedKey, playerUuid);
        }
    }

    /**
     * 添加玩家
     *
     * @param namespacedKey  key
     * @param playerNameList 玩家列表
     * @since 2.3.9
     */
    public static void addPlayerByName(NamespacedKey namespacedKey, List playerNameList) {
        for (String playerName : playerNameList) {
            addPlayer(namespacedKey, playerName);
        }
    }

    /**
     * 添加玩家
     *
     * @param namespacedKey key
     * @param playerList    玩家列表
     * @since 2.3.9
     */
    public static void addPlayer(NamespacedKey namespacedKey, List playerList) {
        BossBar bossBar = getBossBar(namespacedKey);
        if (bossBar == null) {
            return;
        }
        for (Player player : playerList) {
            bossBar.addPlayer(player);
        }
    }

    /**
     * 添加玩家
     *
     * @param bossBar bossBar
     * @since 3.5.6
     */
    public static void addAllPlayer(KeyedBossBar bossBar) {
        for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
            bossBar.addPlayer(onlinePlayer);
        }
    }

    /**
     * 移除玩家
     *
     * @param namespacedKey key
     * @param player        玩家
     * @since 2.3.9
     */
    public static void removePlayer(NamespacedKey namespacedKey, Player player) {
        removePlayer(namespacedKey, Collections.singletonList(player));
    }

    /**
     * 移除玩家
     *
     * @param namespacedKey key
     * @param playerName    玩家
     * @since 2.3.9
     */
    public static void removePlayer(NamespacedKey namespacedKey, String playerName) {
        Optional playerOpt = BaseUtil.getOnlinePlayer(playerName);
        playerOpt.ifPresent(player -> removePlayer(namespacedKey, player));
    }

    /**
     * 移除玩家
     *
     * @param namespacedKey key
     * @param playerUuid    玩家
     * @since 2.3.9
     */
    public static void removePlayer(NamespacedKey namespacedKey, UUID playerUuid) {
        Optional playerOpt = BaseUtil.getOnlinePlayer(playerUuid);
        playerOpt.ifPresent(player -> removePlayer(namespacedKey, player));
    }

    /**
     * 移除玩家
     *
     * @param namespacedKey  key
     * @param playerUuidList 玩家列表
     * @since 2.3.9
     */
    public static void removePlayerByUuid(NamespacedKey namespacedKey, List playerUuidList) {
        for (UUID playerUuid : playerUuidList) {
            removePlayer(namespacedKey, playerUuid);
        }
    }

    /**
     * 移除玩家
     *
     * @param namespacedKey  key
     * @param playerNameList 玩家列表
     * @since 2.3.9
     */
    public static void removePlayerByName(NamespacedKey namespacedKey, List playerNameList) {
        for (String playerName : playerNameList) {
            removePlayer(namespacedKey, playerName);
        }
    }

    /**
     * 移除玩家
     *
     * @param namespacedKey key
     * @param playerList    玩家列表
     * @since 2.3.9
     */
    public static void removePlayer(NamespacedKey namespacedKey, List playerList) {
        BossBar bossBar = getBossBar(namespacedKey);
        if (bossBar == null) {
            return;
        }
        for (Player player : playerList) {
            bossBar.removePlayer(player);
        }
    }

    /**
     * 获取对应BossBar
     *
     * @param namespacedKey key
     * @return BossBar
     * @since 2.3.9
     */
    public static BossBar getBossBar(NamespacedKey namespacedKey) {
        return Bukkit.getBossBar(namespacedKey);
    }

    /**
     * 移除 BossBar
     *
     * @param namespacedKey key
     * @since 2.3.9
     */
    public static void removeBossBar(NamespacedKey namespacedKey) {
        Bukkit.removeBossBar(namespacedKey);
    }

    /**
     * 定时清理
     *
     * @param namespacedKey 标识
     * @param delay         时间单位 秒
     * @since 3.5.6
     */
    public static void removeBossBar(NamespacedKey namespacedKey, Integer delay) {
        HandySchedulerUtil.runTaskLater(() -> {
            BossBar bossBar = getBossBar(namespacedKey);
            bossBar.removeAll();
            removeBossBar(namespacedKey);
        }, delay * 20);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy