
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