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