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

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

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

import cn.handyplus.lib.constants.BaseConstants;
import cn.handyplus.lib.constants.VersionCheckEnum;
import cn.handyplus.lib.core.CollUtil;
import cn.handyplus.lib.core.JsonUtil;
import cn.handyplus.lib.core.StrUtil;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;

import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.logging.Level;
import java.util.regex.Matcher;

/**
 * 常用方法
 *
 * @author handy
 */
public class BaseUtil {

    private BaseUtil() {
    }

    /**
     * 判断是否为玩家
     *
     * @param sender 发送者
     * @return true是
     */
    public static Boolean isPlayer(CommandSender sender) {
        return sender instanceof Player;
    }

    /**
     * 获取在线玩家
     * 未获取到会报错
     *
     * @param sender     控制台
     * @param playerName 玩家名
     * @param msg        提醒消息
     * @return Player
     * @since 3.2.1
     */
    public static Player getOnlinePlayer(CommandSender sender, String playerName, String msg) {
        if (StrUtil.isEmpty(playerName)) {
            AssertUtil.notPlayer(sender, msg);
            return (Player) sender;
        }
        Optional playerOpt = getOnlinePlayer(playerName);
        AssertUtil.notTrue(!playerOpt.isPresent(), sender, msg);
        return playerOpt.get();
    }

    /**
     * 获取在线玩家
     *
     * @param playerName 玩家名
     * @return Player
     * @since 3.2.2
     */
    public static Optional getOnlinePlayer(String playerName) {
        Player player = Bukkit.getPlayerExact(playerName);
        if (player == null || !player.isOnline()) {
            return Optional.empty();
        }
        return Optional.of(player);
    }

    /**
     * 获取在线玩家
     *
     * @param playerUuid 玩家UUID
     * @return Player
     * @since 3.2.2
     */
    public static Optional getOnlinePlayer(UUID playerUuid) {
        Player player = Bukkit.getPlayer(playerUuid);
        if (player == null || !player.isOnline()) {
            return Optional.empty();
        }
        return Optional.of(player);
    }

    /**
     * 获取离线玩家
     *
     * @param playerName 玩家名
     * @return 离线玩家
     * @since 3.7.2
     */
    @SuppressWarnings("deprecation")
    public static OfflinePlayer getOfflinePlayer(String playerName) {
        return Bukkit.getOfflinePlayer(playerName);
    }

    /**
     * 获取离线玩家
     *
     * @param playerUuid 玩家uid
     * @return 离线玩家
     * @since 3.7.2
     */
    public static OfflinePlayer getOfflinePlayer(UUID playerUuid) {
        return Bukkit.getOfflinePlayer(playerUuid);
    }

    /**
     * 判断是否为玩家
     *
     * @param sender 发送者
     * @return true否
     */
    public static Boolean isNotPlayer(CommandSender sender) {
        return !isPlayer(sender);
    }

    /**
     * 颜色代码转换 1.16+ 自动兼容RGB颜色
     *
     * @param str 消息
     * @return 转换后的字符串
     */
    public static String replaceChatColor(String str) {
        if (StrUtil.isEmpty(str)) {
            return "";
        }
        String replaceStr = str.replace("&", "§");
        // 判断版本
        if (BaseConstants.VERSION_ID < VersionCheckEnum.V_1_16.getVersionId()) {
            return replaceStr;
        }
        return translateColorCodes(replaceStr);
    }

    /**
     * 颜色代码转换  1.16+ 自动兼容RGB颜色
     *
     * @param strList 消息
     * @return 转换后的字符串集合
     */
    public static List replaceChatColor(List strList) {
        List loreList = new ArrayList<>();
        if (CollUtil.isEmpty(strList)) {
            return loreList;
        }
        for (String lore : strList) {
            loreList.add(replaceChatColor(lore));
        }
        return loreList;
    }

    /**
     * 清理颜色代码
     *
     * @param str 字符串
     * @return 新字符串
     * @since 3.4.0
     */
    public static String stripColor(String str) {
        if (StrUtil.isEmpty(str)) {
            return "";
        }
        return ChatColor.stripColor(replaceChatColor(str));
    }

    /**
     * 获取uuid
     *
     * @param playerName 玩家名
     * @return uuid
     */
    @SuppressWarnings("deprecation")
    public static UUID getUuid(String playerName) {
        OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerName);
        return offlinePlayer.getUniqueId();
    }

    /**
     * 获取语言文件中的配置
     *
     * @param langMsg 配置项
     * @return 语言
     */
    public static String getLangMsg(String langMsg) {
        return getLangMsg(langMsg, "");
    }

    /**
     * 获取语言文件中的配置
     *
     * @param langMsg    配置项
     * @param defaultMsg 默认语言
     * @return 语言
     */
    public static String getLangMsg(String langMsg, String defaultMsg) {
        return getLangMsg(langMsg, defaultMsg, true);
    }

    /**
     * 获取语言文件中的配置
     *
     * @param langMsg 配置项
     * @return 语言
     */
    public static String getMsgNotColor(String langMsg) {
        return getMsgNotColor(langMsg, "");
    }

    /**
     * 获取语言文件中的配置
     *
     * @param langMsg    配置项
     * @param replaceMap 替换变量
     * @return 语言
     * @since 3.7.9
     */
    public static String getMsgNotColor(String langMsg, Map replaceMap) {
        String msgNotColor = getMsgNotColor(langMsg, "");
        if (replaceMap != null) {
            for (String key : replaceMap.keySet()) {
                msgNotColor = msgNotColor.replace(key, replaceMap.get(key));
            }
        }
        return msgNotColor;
    }

    /**
     * 获取语言文件中的配置
     *
     * @param langMsg 配置项
     * @return 语言
     */
    public static String getMsgNotColor(String langMsg, String defaultMsg) {
        return getLangMsg(langMsg, defaultMsg, false);
    }

    /**
     * 获取语言文件中的配置
     *
     * @param langMsg    配置项
     * @param defaultMsg 默认语言
     * @param isColor    是否开启语言
     * @return 语言
     */
    public static String getLangMsg(String langMsg, String defaultMsg, boolean isColor) {
        FileConfiguration langConfig = BaseConstants.LANG_CONFIG;
        if (langConfig == null) {
            return defaultMsg;
        }
        String msg = langConfig.getString(langMsg, defaultMsg);
        return isColor ? replaceChatColor(msg) : msg;
    }

    /**
     * 获取中文名称
     *
     * @param itemStack 物品
     * @return 中文名
     * @since 2.8.9
     */
    public static String getDisplayName(ItemStack itemStack) {
        if (itemStack == null) {
            return getDisplayName(null, Material.AIR.name());
        }
        ItemMeta itemMeta = ItemStackUtil.getItemMeta(itemStack);
        return getDisplayName(itemMeta.getDisplayName(), itemStack.getType().name());
    }

    /**
     * 获取中文名称
     *
     * @param displayName 显示名称
     * @param type        类型
     * @return 中文名
     */
    public static String getDisplayName(String displayName, String type) {
        // 如果不为空,返回
        if (StrUtil.isNotEmpty(displayName)) {
            return displayName;
        }
        // 如果有汉化信息,转换
        if (!BaseConstants.JSON_CACHE_MAP.isEmpty()) {
            // 物品
            String name = BaseConstants.JSON_CACHE_MAP.get("item.minecraft." + type.toLowerCase());
            if (name == null) {
                // 方块
                name = BaseConstants.JSON_CACHE_MAP.get("block.minecraft." + type.toLowerCase());
            }
            if (name != null) {
                return name;
            }
        }
        // 如果有自定义汉化信息,转换
        if (!BaseConstants.ITEM_JSON_CACHE_MAP.isEmpty()) {
            // 物品
            String name = BaseConstants.ITEM_JSON_CACHE_MAP.get(type);
            if (name != null) {
                return name;
            }
        }
        // 如果有云汉化信息,转换
        if (!BaseConstants.CLOUD_ITEM_JSON_CACHE_MAP.isEmpty()) {
            // 物品
            String name = BaseConstants.CLOUD_ITEM_JSON_CACHE_MAP.get(type);
            if (name != null) {
                return name;
            }
        }
        // 直接返回类型
        return type;
    }

    /**
     * 获取附魔等级中文名称
     *
     * @param level 等级
     * @return 中文名
     * @since 3.7.4
     */
    public static String getEnchantmentLevel(String level) {
        if (BaseConstants.JSON_CACHE_MAP.isEmpty()) {
            return level;
        }
        return BaseConstants.JSON_CACHE_MAP.getOrDefault("enchantment.level." + level, level);
    }

    /**
     * 获取药水效果中文名称
     *
     * @param type 类型
     * @return 中文名
     * @since 3.7.4
     */
    public static String getEffectName(String type) {
        if (BaseConstants.JSON_CACHE_MAP.isEmpty()) {
            return type;
        }
        return BaseConstants.JSON_CACHE_MAP.getOrDefault("effect.minecraft." + type.toLowerCase(), type);
    }

    /**
     * 获取实体中文名称
     *
     * @param type 类型
     * @return 中文名
     * @since 3.7.4
     */
    public static String getEntityName(String type) {
        if (BaseConstants.JSON_CACHE_MAP.isEmpty()) {
            return type;
        }
        return BaseConstants.JSON_CACHE_MAP.getOrDefault("entity.minecraft." + type.toLowerCase(), type);
    }

    /**
     * 获取颜色中文名称
     *
     * @param color 颜色
     * @return 中文名
     * @since 3.7.6
     */
    public static String getColorName(String color) {
        if (BaseConstants.JSON_CACHE_MAP.isEmpty()) {
            return color;
        }
        return BaseConstants.JSON_CACHE_MAP.getOrDefault("color.minecraft." + color.toLowerCase(), color);
    }

    /**
     * 读取json文件并给map赋值
     *
     * @param file 文件
     */
    public static void readJsonFileToItemJsonCacheMap(File file) {
        Optional jsonOpt = readJsonFile(file);
        if (jsonOpt.isPresent() && jsonOpt.get().length() > 1) {
            try {
                BaseConstants.ITEM_JSON_CACHE_MAP = JsonUtil.toMap(jsonOpt.get());
            } catch (Throwable ignored) {
            }
        }
    }

    /**
     * 读取JSON文件并给MAP赋值
     *
     * @param file 文件
     */
    public static void readJsonFileToJsonCacheMap(File file) {
        try {
            Optional jsonOpt = readJsonFile(file);
            jsonOpt.ifPresent(s -> BaseConstants.JSON_CACHE_MAP = JsonUtil.toMap(s));
        } catch (Throwable ignored) {
            MessageUtil.sendConsoleDebugMessage("读取item.json异常");
        }
    }

    /**
     * 读取json文件
     *
     * @param fileName json文件名
     * @return 返回json字符串
     */
    public static Optional readJsonFile(File fileName) {
        try {
            FileReader fileReader = new FileReader(fileName);
            Reader reader = new InputStreamReader(Files.newInputStream(fileName.toPath()), StandardCharsets.UTF_8);
            int ch;
            StringBuilder sb = new StringBuilder();
            while ((ch = reader.read()) != -1) {
                sb.append((char) ch);
            }
            fileReader.close();
            reader.close();
            return Optional.of(sb.toString());
        } catch (Exception e) {
            Bukkit.getLogger().log(Level.SEVERE, "readJsonFile 发生异常", e);
        }
        return Optional.empty();
    }

    /**
     * 玩家世界是否为地狱
     *
     * @param player 玩家
     * @return true 是
     */
    public static boolean playerWorldIsNether(Player player) {
        return World.Environment.NETHER.equals(player.getWorld().getEnvironment());
    }

    /**
     * 玩家世界是否不为地狱
     *
     * @param player 玩家
     * @return true 是
     */
    public static boolean playerWorldIsNotNether(Player player) {
        return !playerWorldIsNether(player);
    }

    /**
     * 世界时间是否为夜晚
     *
     * @param player 玩家
     * @return true 是
     */
    public static boolean worldTimeIsNight(Player player) {
        long time = player.getWorld().getTime() % 24000L;
        return time < 0L || time > 12400L;
    }

    /**
     * 世界时间是否不为夜晚
     *
     * @param player 玩家
     * @return true 是
     */
    public static boolean worldTimeIsNotNight(Player player) {
        return !worldTimeIsNight(player);
    }

    /**
     * 判断是否晴天
     *
     * @param player 玩家
     * @return true 是
     */
    public static boolean worldIsStorm(Player player) {
        return player.getWorld().hasStorm();
    }

    /**
     * 判断是否不为晴天
     *
     * @param player 玩家
     * @return true 是
     */
    public static boolean worldIsNotStorm(Player player) {
        return !worldIsStorm(player);
    }

    /**
     * 玩家头上是否有方块
     *
     * @param player 玩家
     * @return true 有
     */
    public static boolean isUnderRoof(Player player) {
        Block block = player.getLocation().getBlock();
        double height = BaseConstants.HEIGHT_254;
        if (BaseConstants.VERSION_ID >= VersionCheckEnum.V_1_18.getVersionId()) {
            height = BaseConstants.HEIGHT_319;
        }
        if (player.getLocation().getY() >= height) {
            return false;
        }
        while (block.getY() + 1 <= height) {
            block = block.getRelative(BlockFace.UP);
            if (!Material.AIR.equals(block.getType())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 玩家头上是否没有方块
     *
     * @param player 玩家
     * @return true 是
     */
    public static boolean isNotUnderRoof(Player player) {
        return !isUnderRoof(player);
    }

    /**
     * 获取版本第一位
     *
     * @param plugin 插件
     * @return 版本第一位
     * @since 1.1.5
     */
    public static int getFirstPluginVersion(Plugin plugin) {
        String version = plugin.getDescription().getVersion();
        String[] split = version.split("\\.");
        return Integer.parseInt(split[0]);
    }

    /**
     * 获取版本第二位
     *
     * @param plugin 插件
     * @return 版本第二位
     * @since 1.8.4
     */
    public static int getTwoPluginVersion(Plugin plugin) {
        String version = plugin.getDescription().getVersion();
        String[] split = version.split("\\.");
        return Integer.parseInt(split[1]);
    }

    /**
     * 转化版本号
     *
     * @param version 版本号
     * @return 版本号数字
     * @since 2.6.8
     */
    public static Integer convertVersion(String version) {
        // 移除非数字和非点号的字符
        String cleanedVersion = version.replaceAll("[^\\d.]", "");
        // 如果不包含点号,直接返回整数
        if (!cleanedVersion.contains(BaseConstants.POINT)) {
            return Integer.parseInt(cleanedVersion);
        }
        // 使用StringBuilder构建结果
        StringBuilder result = new StringBuilder();
        // 分割版本号
        String[] versionParts = cleanedVersion.split("\\.");
        // 处理每个部分
        for (String part : versionParts) {
            // 如果部分长度为1,则在前面补0
            if (part.length() == 1) {
                result.append("0");
            }
            result.append(part);
        }
        // 返回最终的整数
        return Integer.parseInt(result.toString());
    }

    /**
     * 获取声音
     *
     * @param sound 声音
     * @return 返回
     * @since 3.7.9
     */
    public static Optional getSound(String sound) {
        try {
            return Optional.of(Sound.valueOf(sound.toUpperCase()));
        } catch (IllegalArgumentException exception) {
            return Optional.empty();
        }
    }

    /**
     * 获取实体类型
     *
     * @param key 实体类型
     * @return 返回
     * @since 3.7.9
     */
    public static Optional getEntityType(String key) {
        try {
            return Optional.of(EntityType.valueOf(key.toUpperCase()));
        } catch (IllegalArgumentException exception) {
            return Optional.empty();
        }
    }

    /**
     * 加载插件
     *
     * @param pluginName 插件名
     * @return true成功, false失败
     * @since 3.7.1
     */
    public static Optional hook(String pluginName) {
        Plugin plugin = Bukkit.getPluginManager().getPlugin(pluginName);
        return plugin != null && plugin.isEnabled() ? Optional.of(plugin) : Optional.empty();
    }

    /**
     * 加载插件
     *
     * @param pluginName     插件名
     * @param succeedMsgNode 成功消息节点
     * @param failureMsgNode 失败消息节点
     * @return true 成功
     * @since 3.2.0
     */
    public static boolean hook(String pluginName, String succeedMsgNode, String failureMsgNode) {
        Optional pluginOpt = hook(pluginName);
        MessageUtil.sendConsoleMessage(BaseUtil.getLangMsg(pluginOpt.isPresent() ? succeedMsgNode : failureMsgNode));
        return pluginOpt.isPresent();
    }

    /**
     * RGB颜色代码处理
     *
     * @param str 输入字符
     * @return 输出字符
     * @since 3.4.4
     */
    private static String translateColorCodes(String str) {
        // 正则判断
        Matcher matcher = BaseConstants.RPG_PATTERN.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String hex = matcher.group();
            if (hex.length() == 5) {
                // 将3个字符的十六进制转换为6个字符
                hex = hex.substring(0, 2) + doubleCharacters(hex.substring(2));
            }
            matcher.appendReplacement(sb, ChatColor.of(hex.substring(1)).toString());
        }
        matcher.appendTail(sb);
        return ChatColor.translateAlternateColorCodes('§', sb.toString());
    }

    /**
     * 双重字符
     *
     * @param str 字符
     * @return 重复字符
     * @since 3.4.4
     */
    private static String doubleCharacters(String str) {
        StringBuilder sb = new StringBuilder();
        for (char c : str.toCharArray()) {
            sb.append(c);
            sb.append(c);
        }
        return sb.toString();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy