diff --git a/pom.xml b/pom.xml index 9a828b7..67dc6fb 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.skymc TabooLib - 4.25 + 4.26 UTF-8 diff --git a/src/main/java/me/skymc/taboolib/Main.java b/src/main/java/me/skymc/taboolib/Main.java index c6d0453..7e36788 100644 --- a/src/main/java/me/skymc/taboolib/Main.java +++ b/src/main/java/me/skymc/taboolib/Main.java @@ -112,7 +112,7 @@ public class Main extends JavaPlugin { // 载入权限 PermissionUtils.loadRegisteredServiceProvider(); // 物品名称 - ItemUtils.LoadLib(); + ItemUtils.init(); // 低层工具 DabItemUtils.getInstance(); // 载入周期管理器 diff --git a/src/main/java/me/skymc/taboolib/common/configuration/TConfiguration.java b/src/main/java/me/skymc/taboolib/common/configuration/TConfiguration.java index 361aa75..933c4c8 100644 --- a/src/main/java/me/skymc/taboolib/common/configuration/TConfiguration.java +++ b/src/main/java/me/skymc/taboolib/common/configuration/TConfiguration.java @@ -25,25 +25,27 @@ public class TConfiguration extends YamlConfiguration { TLib.getTLib().getConfigWatcher().addSimpleListener(this.file, this::reload); } - /** - * 释放文件监听 - */ public void release() { TLib.getTLib().getConfigWatcher().removeListener(file); } - /** - * 重新载入配置 - */ public void reload() { try { load(file); - Optional.ofNullable(runnable).ifPresent(Runnable::run); + runListener(); } catch (IOException | InvalidConfigurationException e) { TLogger.getGlobalLogger().warn("Cannot load configuration from stream: " + e.toString()); } } + public void runListener() { + try { + Optional.ofNullable(runnable).ifPresent(Runnable::run); + } catch (Exception e) { + e.printStackTrace(); + } + } + /** * 创建配置文件 * diff --git a/src/main/java/me/skymc/taboolib/inventory/ItemUtils.java b/src/main/java/me/skymc/taboolib/inventory/ItemUtils.java index 2e38d61..5274c5a 100644 --- a/src/main/java/me/skymc/taboolib/inventory/ItemUtils.java +++ b/src/main/java/me/skymc/taboolib/inventory/ItemUtils.java @@ -4,13 +4,13 @@ import com.ilummc.tlib.resources.TLocale; import me.clip.placeholderapi.PlaceholderAPI; import me.skymc.taboolib.Main; import me.skymc.taboolib.TabooLib; +import me.skymc.taboolib.common.configuration.TConfiguration; import me.skymc.taboolib.fileutils.ConfigUtils; import me.skymc.taboolib.itemnbtapi.NBTItem; import me.skymc.taboolib.itemnbtapi.NBTList; import me.skymc.taboolib.itemnbtapi.NBTListCompound; import me.skymc.taboolib.itemnbtapi.NBTType; import me.skymc.taboolib.other.NumberUtils; -import me.skymc.taboolib.string.Language; import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; @@ -39,74 +39,59 @@ import java.util.stream.IntStream; */ public class ItemUtils { - private static FileConfiguration itemdir = null; - - private static FileConfiguration itemCache = null; - private static File finalItemsFolder; - - private static LinkedHashMap itemlib = new LinkedHashMap<>(); - + private static FileConfiguration itemDir; + private static FileConfiguration itemCache; + private static TConfiguration itemName; + private static LinkedHashMap itemLib = new LinkedHashMap<>(); private static LinkedHashMap itemCaches = new LinkedHashMap<>(); - private static LinkedHashMap itemCachesFinal = new LinkedHashMap<>(); - public static FileConfiguration getItemdir() { - return itemdir; - } - - public static FileConfiguration getItemCache() { - return itemCache; - } - - public static File getFinalItemsFolder() { - return finalItemsFolder; - } - - public static LinkedHashMap getItemlib() { - return itemlib; - } - - public static LinkedHashMap getItemCaches() { - return itemCaches; - } - - public static LinkedHashMap getItemCachesFinal() { - return itemCachesFinal; - } - - /** - * 获取物品缓存 - * 检测顺序: - * 1. 固定物品库 - * 2. 动态物品库 - * - * @param name 物品名称 - * @return - */ - public static ItemStack getCacheItem(String name) { - // 检测固定物品库是否存在该物品 - if (itemCachesFinal.containsKey(name)) { - return itemCachesFinal.get(name); - } - // 返回动态物品库 - return itemCaches.get(name); - } - - public static boolean isExists(String name) { - return itemCachesFinal.containsKey(name) || itemCaches.containsKey(name); - } - - public static void LoadLib() { + public static void init() { try { + reloadItemDir(); reloadItemName(); reloadItemCache(); - itemdir = YamlConfiguration.loadConfiguration(new File(Main.getInst().getConfig().getString("DATAURL.ITEMDIR"))); } catch (Exception e) { TLocale.Logger.error("ITEM-UTILS.FAIL-LOAD-ITEMS", e.toString()); } } + public static void reloadItemDir() { + File file = new File(Main.getInst().getConfig().getString("DATAURL.ITEMDIR")); + if (file.exists()) { + itemDir = YamlConfiguration.loadConfiguration(file); + } + } + + public static void reloadItemName() { + itemName = TConfiguration.createInResource(Main.getInst(), "Language/ITEM_NAME.yml"); + itemName.listener(() -> { + itemName.getConfigurationSection("").getKeys(false).forEach(a -> itemLib.put(a, itemName.getString(a))); + TLocale.Logger.info("ITEM-UTILS.SUCCESS-LOAD-NAMES", String.valueOf(itemLib.size())); + }).runListener(); + } + + public static void reloadItemCache() { + itemCaches.clear(); + itemCachesFinal.clear(); + loadItemsFile(getItemCacheFile(), false); + finalItemsFolder = new File(Main.getInst().getDataFolder(), "FinalItems"); + if (!finalItemsFolder.exists()) { + finalItemsFolder.mkdir(); + } + Arrays.stream(finalItemsFolder.listFiles()).forEach(file -> loadItemsFile(file, true)); + TLocale.Logger.info("ITEM-UTILS.SUCCESS-LOAD-CACHES", String.valueOf(itemCaches.size() + itemCachesFinal.size())); + } + + public static File getItemCacheFile() { + File itemCacheFile = new File(Main.getInst().getDataFolder(), "items.yml"); + if (!itemCacheFile.exists()) { + Main.getInst().saveResource("items.yml", true); + } + return itemCacheFile; + } + public static void loadItemsFile(File file, boolean finalFile) { FileConfiguration conf = ConfigUtils.load(Main.getInst(), file); for (String name : conf.getConfigurationSection("").getKeys(false)) { @@ -120,33 +105,22 @@ public class ItemUtils { } } - public static void reloadItemCache() { - itemCaches.clear(); - itemCachesFinal.clear(); - loadItemsFile(getItemCacheFile(), false); - // 创建固定物品库 - finalItemsFolder = new File(Main.getInst().getDataFolder(), "FinalItems"); - if (!finalItemsFolder.exists()) { - finalItemsFolder.mkdir(); - } - // 检查固定物品库中的物品 - Arrays.stream(finalItemsFolder.listFiles()).forEach(file -> loadItemsFile(file, true)); - TLocale.Logger.info("ITEM-UTILS.SUCCESS-LOAD-CACHES", String.valueOf(itemCaches.size() + itemCachesFinal.size())); + // ********************************* + // + // API + // + // ********************************* + + public static boolean isExists(String name) { + return itemCachesFinal.containsKey(name) || itemCaches.containsKey(name); } - public static void reloadItemName() { - FileConfiguration conf = new Language("ITEM_NAME", Main.getInst(), true).getConfiguration(); - itemlib.clear(); - conf.getConfigurationSection("").getKeys(false).forEach(a -> itemlib.put(a, conf.getString(a))); - TLocale.Logger.info("ITEM-UTILS.SUCCESS-LOAD-NAMES", String.valueOf(itemlib.size())); + public static ItemStack getCacheItem(String name) { + return itemCachesFinal.containsKey(name) ? itemCachesFinal.get(name) : itemCaches.get(name); } - public static File getItemCacheFile() { - File itemCacheFile = new File(Main.getInst().getDataFolder(), "items.yml"); - if (!itemCacheFile.exists()) { - Main.getInst().saveResource("items.yml", true); - } - return itemCacheFile; + public static ItemStack getItemFromDir(String name) { + return itemDir != null ? itemDir.getItemStack("item." + name) : null; } public static String getCustomName(ItemStack item) { @@ -154,19 +128,7 @@ public class ItemUtils { return TLocale.asString("ITEM-UTILS.EMPTY-ITEM"); } int data = item.getType().getMaxDurability() == 0 ? item.getDurability() : 0; - return item.getItemMeta().hasDisplayName() ? item.getItemMeta().getDisplayName() : itemlib.get(item.getType() + ":" + data) == null ? item.getType().toString() : itemlib.get(item.getType() + ":" + data); - } - - public static ItemStack getItemFromDir(String name) { - if (itemdir != null) { - return itemdir.getItemStack("item." + name); - } - return null; - } - - @SuppressWarnings("deprecation") - public static ItemStack item(int n, int a, int d) { - return new ItemStack(n, a, (short) d); + return item.getItemMeta().hasDisplayName() ? item.getItemMeta().getDisplayName() : itemLib.get(item.getType() + ":" + data) == null ? item.getType().toString() : itemLib.get(item.getType() + ":" + data); } public static ItemStack setName(ItemStack i, String n) { @@ -176,7 +138,7 @@ public class ItemUtils { return i; } - public static ItemStack Enchant(ItemStack i, Enchantment e, int l) { + public static ItemStack enchant(ItemStack i, Enchantment e, int l) { ItemMeta meta = i.getItemMeta(); meta.addEnchant(e, l, false); i.setItemMeta(meta); @@ -203,10 +165,7 @@ public class ItemUtils { } public static String asString(String args, Player placeholderPlayer) { - if (placeholderPlayer == null) { - return args.replace("&", "§"); - } - return PlaceholderAPI.setPlaceholders(placeholderPlayer, args.replace("&", "§")); + return placeholderPlayer == null ? args.replace("&", "§") : PlaceholderAPI.setPlaceholders(placeholderPlayer, args.replace("&", "§")); } public static List asString(List args, Player placeholderPlayer) { @@ -281,58 +240,30 @@ public class ItemUtils { } } - /** - * 包含介绍 - * - * @param i 物品 - * @param a 关键字 - */ + public static int getLore(ItemStack i, String a) { + return isLored(i) ? IntStream.range(0, i.getItemMeta().getLore().size()).filter(j -> i.getItemMeta().getLore().get(j).contains(a)).findFirst().orElse(0) : 0; + } + public static boolean hasLore(ItemStack i, String a) { return isLored(i) && i.getItemMeta().getLore().toString().contains(a); } - /** - * 如果已描述 - * - * @param i - * @return - */ public static boolean isLored(ItemStack i) { return i != null && i.getItemMeta() != null && i.getItemMeta().getLore() != null; } - /** - * 如果已命名 - * - * @param i - * @return - */ public static boolean isNamed(ItemStack i) { return i != null && i.getItemMeta() != null && i.getItemMeta().getDisplayName() != null; } - /** - * 添加描述 - * - * @param is 物品 - * @param lore 描述 - */ - public static ItemStack addLore(ItemStack is, String lore) { + public static ItemStack addLore(ItemStack is, String line) { ItemMeta meta = is.getItemMeta(); - - List _lore = meta.hasLore() ? meta.getLore() : Collections.emptyList(); - _lore.add(lore.replaceAll("&", "§")); - + List lore = meta.hasLore() ? meta.getLore() : Collections.emptyList(); + lore.add(TLocale.Translate.setColored(line)); is.setItemMeta(meta); return is; } - /** - * 移除描述 - * - * @param is 物品 - * @param line 行数 - */ public static ItemStack delLore(ItemStack is, int line) { ItemMeta meta = is.getItemMeta(); if (meta.hasLore()) { @@ -346,40 +277,7 @@ public class ItemUtils { return is; } - /** - * 获取介绍所在行数 - * - * @param i 物品 - * @param a 关键字 - */ - public static int getLore(ItemStack i, String a) { - return isLored(i) ? IntStream.range(0, i.getItemMeta().getLore().size()).filter(j -> i.getItemMeta().getLore().get(j).contains(a)).findFirst().orElse(0) : 0; - } - - /** - * 添加耐久 - * - * @param i 物品 - * @param d 耐久 - */ - public static ItemStack addDurability(ItemStack i, int d) { - i.setDurability((short) (i.getDurability() + d)); - int min = i.getDurability(); - int max = i.getType().getMaxDurability(); - if (min >= max) { - i.setType(Material.AIR); - } - return i; - } - - /** - * 替换描述 - * - * @param i 物品 - * @param l1 关键字1 - * @param l2 关键字2 - */ - public static ItemStack repalceLore(ItemStack i, String l1, String l2) { + public static ItemStack replaceLore(ItemStack i, String l1, String l2) { if (!isLored(i)) { return i; } else { @@ -392,6 +290,16 @@ public class ItemUtils { return i; } + public static ItemStack addDurability(ItemStack i, int d) { + i.setDurability((short) (i.getDurability() + d)); + int min = i.getDurability(); + int max = i.getType().getMaxDurability(); + if (min >= max) { + i.setType(Material.AIR); + } + return i; + } + public static ItemStack loadItem(FileConfiguration f, String s) { return loadItem(f, s, null); } @@ -552,6 +460,62 @@ public class ItemUtils { return nbt; } + // ********************************* + // + // Getter and Setter + // + // ********************************* + + public static FileConfiguration getItemDir() { + return itemDir; + } + + public static LinkedHashMap getItemLib() { + return itemLib; + } + + public static FileConfiguration getItemCache() { + return itemCache; + } + + public static File getFinalItemsFolder() { + return finalItemsFolder; + } + + public static LinkedHashMap getItemCaches() { + return itemCaches; + } + + public static LinkedHashMap getItemCachesFinal() { + return itemCachesFinal; + } + + // ********************************* + // + // Deprecated + // + // ********************************* + + @Deprecated + public static FileConfiguration getItemdir() { + return itemDir; + } + + @Deprecated + public static LinkedHashMap getItemlib() { + return itemLib; + } + + @Deprecated + public static ItemStack item(int n, int a, int d) { + return new ItemStack(n, a, (short) d); + } + + @Deprecated + public static ItemStack repalceLore(ItemStack i, String l1, String l2) { + return replaceLore(i, l1, l2); + } + @Deprecated public static void putO(ItemStack item, Inventory inv, int i) { inv.setItem(i, item); diff --git a/src/main/java/me/skymc/taboolib/inventory/builder/ItemBuilder.java b/src/main/java/me/skymc/taboolib/inventory/builder/ItemBuilder.java index e727c1c..9b01229 100644 --- a/src/main/java/me/skymc/taboolib/inventory/builder/ItemBuilder.java +++ b/src/main/java/me/skymc/taboolib/inventory/builder/ItemBuilder.java @@ -3,8 +3,10 @@ package me.skymc.taboolib.inventory.builder; import com.ilummc.tlib.resources.TLocale; import me.skymc.taboolib.TabooLib; import me.skymc.taboolib.string.ArrayUtils; +import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Material; +import org.bukkit.OfflinePlayer; import org.bukkit.block.banner.Pattern; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.EntityType; @@ -20,7 +22,7 @@ import java.util.List; /** * @Author sky * @Since 2018-08-22 11:37 - * @BuilderVersion 1.0 + * @BuilderVersion 1.1 */ public class ItemBuilder { @@ -40,6 +42,11 @@ public class ItemBuilder { itemMeta = itemStack.getItemMeta(); } + public ItemBuilder(OfflinePlayer player) { + this(Material.SKULL_ITEM, 1, 3); + this.skullOwner(player.getName()); + } + public ItemBuilder material(int id) { itemStack.setType(Material.getMaterial(id)); return this; @@ -147,6 +154,13 @@ public class ItemBuilder { return this; } + public ItemBuilder skullOwner(String name) { + if (itemMeta instanceof SkullMeta) { + ((SkullMeta) itemMeta).setOwner(name); + } + return this; + } + public ItemBuilder unbreakable(boolean value) { if (TabooLib.getVersionNumber() >= 12000) { itemMeta.setUnbreakable(value); diff --git a/src/main/java/me/skymc/taboolib/itagapi/TagDataHandler.java b/src/main/java/me/skymc/taboolib/itagapi/TagDataHandler.java index 4770dbf..aea9ec2 100644 --- a/src/main/java/me/skymc/taboolib/itagapi/TagDataHandler.java +++ b/src/main/java/me/skymc/taboolib/itagapi/TagDataHandler.java @@ -2,6 +2,7 @@ package me.skymc.taboolib.itagapi; import com.google.common.base.Preconditions; import me.skymc.taboolib.Main; +import me.skymc.taboolib.TabooLib; import me.skymc.taboolib.packet.PacketUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -132,7 +133,10 @@ public class TagDataHandler implements Listener { entryTeam.addEntry(playerData.getNameDisplay()); entryTeam.setPrefix(playerData.getPrefix()); entryTeam.setSuffix(playerData.getSuffix()); - TagUtils.cleanEmptyTeamInScoreboard(scoreboard); + // 傻逼 BedWarsRel 我草你妈的 + if (TabooLib.instance().getConfig().getBoolean("TABLIST-AUTO-CLEAN-TEAM", true)) { + TagUtils.cleanEmptyTeamInScoreboard(scoreboard); + } } private void cancelPlayerVariable(Player player, TagPlayerData playerData) { @@ -142,7 +146,10 @@ public class TagDataHandler implements Listener { for (Player online : Bukkit.getOnlinePlayers()) { Scoreboard scoreboard = TagUtils.getScoreboardComputeIfAbsent(player); TagUtils.cleanEntryInScoreboard(scoreboard, playerData.getNameDisplay()); - TagUtils.cleanEmptyTeamInScoreboard(scoreboard); + // 傻逼 BedWarsRel 我草你妈的 + if (TabooLib.instance().getConfig().getBoolean("TABLIST-AUTO-CLEAN-TEAM", true)) { + TagUtils.cleanEmptyTeamInScoreboard(scoreboard); + } } } @@ -157,7 +164,7 @@ public class TagDataHandler implements Listener { downloadPlayerVariable(e.getPlayer()); } - @EventHandler (priority = EventPriority.MONITOR) + @EventHandler(priority = EventPriority.MONITOR) public void onQuit(PlayerQuitEvent e) { cancelPlayerVariable(e.getPlayer(), unregisterPlayerData(e.getPlayer())); } diff --git a/src/main/java/me/skymc/taboolib/skull/SkullUtils.java b/src/main/java/me/skymc/taboolib/skull/SkullUtils.java index 569048f..7ce4239 100644 --- a/src/main/java/me/skymc/taboolib/skull/SkullUtils.java +++ b/src/main/java/me/skymc/taboolib/skull/SkullUtils.java @@ -1,36 +1,19 @@ package me.skymc.taboolib.skull; -import org.bukkit.Bukkit; +import me.skymc.taboolib.inventory.builder.ItemBuilder; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.SkullMeta; +@Deprecated public class SkullUtils { - - public static ItemStack getItme(OfflinePlayer p ) { - SkullMeta s = (SkullMeta) Bukkit.getItemFactory().getItemMeta(Material.SKULL_ITEM); - s.setOwner(p.getName()); - - ItemStack i = new ItemStack(Material.SKULL_ITEM); - i.setDurability((short) 3); - i.setItemMeta(s); - - return i; - } - - public static ItemStack getOnlineItem(OfflinePlayer p ) { - if (p.isOnline()) - { - SkullMeta s = (SkullMeta) Bukkit.getItemFactory().getItemMeta(Material.SKULL_ITEM); - s.setOwner(p.getName()); - - ItemStack i = new ItemStack(Material.SKULL_ITEM); - i.setDurability((short) 3); - i.setItemMeta(s); - return i; - } - return new ItemStack(Material.SKULL_ITEM); - } + + public static ItemStack getItme(OfflinePlayer p) { + return new ItemBuilder(p).build(); + } + + public static ItemStack getOnlineItem(OfflinePlayer p) { + return p.isOnline() ? new ItemBuilder(p).build() : new ItemStack(Material.SKULL_ITEM); + } } diff --git a/src/main/java/me/skymc/taboolib/socket/TabooLibClient.java b/src/main/java/me/skymc/taboolib/socket/TabooLibClient.java index d6a9a66..2706db7 100644 --- a/src/main/java/me/skymc/taboolib/socket/TabooLibClient.java +++ b/src/main/java/me/skymc/taboolib/socket/TabooLibClient.java @@ -2,9 +2,13 @@ package me.skymc.taboolib.socket; import com.ilummc.tlib.resources.TLocale; import me.skymc.taboolib.TabooLib; +import me.skymc.taboolib.commands.builder.SimpleCommandBuilder; import me.skymc.taboolib.other.NumberUtils; import me.skymc.taboolib.socket.packet.Packet; import me.skymc.taboolib.socket.packet.PacketSerializer; +import me.skymc.taboolib.socket.packet.impl.PacketCommand; +import me.skymc.taboolib.socket.packet.impl.PacketMessage; +import me.skymc.taboolib.string.ArrayUtils; import org.bukkit.Bukkit; import java.io.*; @@ -83,6 +87,23 @@ public class TabooLibClient { TLocale.sendToConsole("COMMUNICATION.FAILED-READING-PACKET", e.getMessage()); } }); + + SimpleCommandBuilder.create("TabooLibClient", TabooLib.instance()) + .aliases("tclient") + .permission("*") + .execute((sender, args) -> { + if (args.length == 0) { + sender.sendMessage("§c[TabooLibClient] §f/tclient message §7[TEXT] §8- §7发送测试信息"); + sender.sendMessage("§c[TabooLibClient] §f/tclient command §7[TEXT] §8- §7发送测试命令"); + } else if (args[0].equalsIgnoreCase("message") && args.length > 1) { + sendPacket(new PacketMessage(ArrayUtils.arrayJoin(args, 1))); + } else if (args[0].equalsIgnoreCase("command") && args.length > 1) { + sendPacket(new PacketCommand(ArrayUtils.arrayJoin(args, 1))); + } else { + sender.sendMessage("§c[TabooLibClient] §7指令错误."); + } + return true; + }).build(); } // ********************************* diff --git a/src/main/java/me/skymc/taboolib/socket/TabooLibServer.java b/src/main/java/me/skymc/taboolib/socket/TabooLibServer.java index 57a30ef..42dd99b 100644 --- a/src/main/java/me/skymc/taboolib/socket/TabooLibServer.java +++ b/src/main/java/me/skymc/taboolib/socket/TabooLibServer.java @@ -55,7 +55,7 @@ public class TabooLibServer { /* 检测无效的客户端连接,如果超过 5000 毫秒没有收到客户端的回应(上一次心跳包的回应)则注销链接 */ - client.entrySet().stream().filter(connection -> connection.getValue().isAlive()).map(connection -> new PacketQuit(connection.getKey(), "Lost connection")).forEach(TabooLibServer::sendPacket); + client.entrySet().stream().filter(connection -> !connection.getValue().isAlive()).map(connection -> new PacketQuit(connection.getKey(), "Lost connection")).forEach(TabooLibServer::sendPacket); }, 0, 1, TimeUnit.SECONDS); while (true) { @@ -76,7 +76,6 @@ public class TabooLibServer { } public static void sendPacket(String origin) { - println("Packet sending: " + origin + ", online: " + client.size()); // 在服务端尝试解析动作并运行 Optional.ofNullable(PacketSerializer.unSerialize(origin)).ifPresent(Packet::readOnServer); // 将动作发送至所有客户端 diff --git a/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketCommand.java b/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketCommand.java new file mode 100644 index 0000000..12ecab9 --- /dev/null +++ b/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketCommand.java @@ -0,0 +1,51 @@ +package me.skymc.taboolib.socket.packet.impl; + +import com.google.gson.JsonObject; +import com.ilummc.tlib.resources.TLocale; +import me.skymc.taboolib.socket.TabooLibServer; +import me.skymc.taboolib.socket.packet.Packet; +import me.skymc.taboolib.socket.packet.PacketType; +import org.bukkit.Bukkit; + +/** + * @Author sky + * @Since 2018-08-22 23:01 + */ +@PacketType(name = "command") +public class PacketCommand extends Packet { + + private String command; + + public PacketCommand(int port) { + super(port); + } + + public PacketCommand(String command) { + super(Bukkit.getPort()); + this.command = command; + } + + @Override + public void readOnServer() { + String[] args = command.split(" "); + if (args[0].equalsIgnoreCase("online")) { + TabooLibServer.sendPacket(new PacketMessage(0, "Online: " + TabooLibServer.getClient().size())); + } else { + TabooLibServer.sendPacket(new PacketMessage(0, "Invalid arguments.")); + } + } + + @Override + public void readOnClient() { + } + + @Override + public void serialize(JsonObject json) { + json.addProperty("command", this.command); + } + + @Override + public void unSerialize(JsonObject json) { + this.command = json.get("command").getAsString(); + } +} diff --git a/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketHeartbeat.java b/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketHeartbeat.java index 346e26f..e28d06c 100644 --- a/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketHeartbeat.java +++ b/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketHeartbeat.java @@ -3,6 +3,7 @@ package me.skymc.taboolib.socket.packet.impl; import me.skymc.taboolib.socket.TabooLibClient; import me.skymc.taboolib.socket.packet.Packet; import me.skymc.taboolib.socket.packet.PacketType; +import org.bukkit.Bukkit; /** * @Author sky diff --git a/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketMessage.java b/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketMessage.java index a2f8927..9721d46 100644 --- a/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketMessage.java +++ b/src/main/java/me/skymc/taboolib/socket/packet/impl/PacketMessage.java @@ -5,6 +5,7 @@ import com.ilummc.tlib.resources.TLocale; import me.skymc.taboolib.socket.TabooLibServer; import me.skymc.taboolib.socket.packet.Packet; import me.skymc.taboolib.socket.packet.PacketType; +import org.bukkit.Bukkit; /** * @Author sky @@ -24,9 +25,14 @@ public class PacketMessage extends Packet { this.message = message; } + public PacketMessage(String message) { + super(Bukkit.getPort()); + this.message = message; + } + @Override public void readOnServer() { - TabooLibServer.println(message); + TabooLibServer.println(getPort() + ": " + message); } @Override diff --git a/src/main/java/me/skymc/taboolib/socket/server/ClientConnection.java b/src/main/java/me/skymc/taboolib/socket/server/ClientConnection.java index 997d1ab..6c8a4a6 100644 --- a/src/main/java/me/skymc/taboolib/socket/server/ClientConnection.java +++ b/src/main/java/me/skymc/taboolib/socket/server/ClientConnection.java @@ -46,7 +46,7 @@ public class ClientConnection implements Runnable { /* 连接丢失,客户端退出 */ - TabooLibServer.sendPacket(new PacketQuit(socket.getPort(), e.getMessage())); + TabooLibServer.sendPacket(new PacketQuit(socket.getPort(), "SocketException: " + e.getMessage())); } catch (Exception e) { TabooLibServer.println("Client running failed: " + e.toString()); } diff --git a/src/main/java/me/skymc/taboolib/support/SupportWorldGuard.java b/src/main/java/me/skymc/taboolib/support/SupportWorldGuard.java index 241bba6..11141b5 100644 --- a/src/main/java/me/skymc/taboolib/support/SupportWorldGuard.java +++ b/src/main/java/me/skymc/taboolib/support/SupportWorldGuard.java @@ -1,5 +1,6 @@ package me.skymc.taboolib.support; +import com.google.common.base.Preconditions; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; @@ -9,60 +10,59 @@ import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +/** + * @Author AgarthaLib + */ public class SupportWorldGuard { - String Source_code_from_AgarthaLib; private WorldGuardPlugin worldGuard; public SupportWorldGuard() { - final Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("WorldGuard"); - if (plugin != null) { - this.worldGuard = (WorldGuardPlugin) plugin; - } + Preconditions.checkNotNull(Bukkit.getServer().getPluginManager().getPlugin("WorldGuard"), "WorldGuard was not found."); + worldGuard = WorldGuardPlugin.inst(); } - public final WorldGuardPlugin getWorldGuard() { + public WorldGuardPlugin getWorldGuard() { return this.worldGuard; } - public final RegionManager getRegionManager(final World world) { + public RegionManager getRegionManager(World world) { return this.worldGuard.getRegionManager(world); } - public final boolean isRegionManagerExists(final World world) { + public boolean isRegionManagerExists(World world) { return this.getRegionManager(world) != null; } - public final Collection getRegionIDs(final World world) { - final RegionManager regionManager = this.getRegionManager(world); - return regionManager.getRegions().keySet(); + public Collection getRegionIDs(World world) { + return getRegionManager(world).getRegions().keySet(); } - public final Collection getRegions(final World world) { - final RegionManager regionManager = this.getRegionManager(world); - return regionManager.getRegions().values(); + public Collection getRegions(World world) { + return getRegionManager(world).getRegions().values(); } - public final ProtectedRegion getRegion(final World world, final String id) { - final RegionManager regionManager = this.getRegionManager(world); - if (regionManager != null) { - for (final String key : regionManager.getRegions().keySet()) { - if (key.equalsIgnoreCase(id)) { - return regionManager.getRegion(key); - } - } - } - return null; + public List getRegionsAtLocation(World world, Location location) { + return getRegions(world).stream().filter(protectedRegion -> protectedRegion.contains(location.getBlockX(), location.getBlockY(), location.getBlockZ())).map(ProtectedRegion::getId).collect(Collectors.toList()); } - public final boolean isRegionExists(final World world, final String id) { + public ProtectedRegion getRegion(World world, String id) { + RegionManager regionManager = this.getRegionManager(world); + return regionManager != null ? regionManager.getRegions().keySet().stream().filter(key -> key.equalsIgnoreCase(id)).findFirst().map(regionManager::getRegion).orElse(null) : null; + } + + public boolean isRegionExists(World world, String id) { return this.getRegion(world, id) != null; } - public final boolean isPlayerInsideRegion(final ProtectedRegion region, final Player player) { - final Location location = player.getLocation(); + public boolean isPlayerInsideRegion(ProtectedRegion region, Player player) { + Location location = player.getLocation(); return region.contains(location.getBlockX(), location.getBlockY(), location.getBlockZ()); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 72b53ab..ae069c3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -33,10 +33,12 @@ LOCALE: # 关闭可提升性能 # 如果需要开启仍然可以在语言文件中加入 papi: true USE_PAPI: false - -# 玩家列表(TAB)是否根据前缀排序 -# 启用后将会导致部分通过计分板获取玩家数据的插件出错(BedwarsRel、SkyWars) -TABLIST-SORT: false + +# 玩家列表(TAB-API)是否根据前缀排序 +TABLIST-SORT: true + +# 玩家列表(TAB-API)是否自动清理没有成员的队伍 +TABLIST-AUTO-CLEAN-TEAM: true # 是否启用更新检测 UPDATE-CHECK: true diff --git a/src/main/resources/lang/zh_CN.yml b/src/main/resources/lang/zh_CN.yml index 1ff2780..2a157ca 100644 --- a/src/main/resources/lang/zh_CN.yml +++ b/src/main/resources/lang/zh_CN.yml @@ -569,6 +569,7 @@ COMMUNICATION: FAILED-CONNECT-CLIENT: '§8[§3§lTabooLibClient§8] &4本地通讯网络连接出错: {0}' FAILED-READING-PACKET: '§8[§3§lTabooLibClient§8] &4本地通讯网络数据包读取失败: {0}' SUCCESS-CONNECTED: '§8[§3§lTabooLibClient§8] &7本地通讯网络连接成功.' - CLIENT-JOINED: '§8[§3§lTabooLibClient§8] &7服务器 &flocalhost:{0} &7加入本地通讯网络.' - CLIENT-QUITED: '§8[§3§lTabooLibClient§8] &7服务器 &flocalhost:{0} &7退出本地通讯网络.' - PACKET-MESSAGE: '§8[§3§lTabooLibClient§8] &7服务器 &flocalhost:{0} &7发送信息: &f{1}' \ No newline at end of file + CLIENT-JOINED: '§8[§3§lTabooLibClient§8] &7服务器 &f{0} &7加入本地通讯网络.' + CLIENT-QUITED: '§8[§3§lTabooLibClient§8] &7服务器 &f{0} &7退出本地通讯网络.' + PACKET-MESSAGE: '§8[§3§lTabooLibClient§8] &7服务器 &f{0} &7发送信息: &f{1}' + PACKET-COMMAND: '§8[§3§lTabooLibClient§8] &7服务器 &f{0} &7运行命令: &f{1}' \ No newline at end of file