TabooLib v4.26

+ 调整 TConfiguration 类,增加 runListener 方法运行重载任务
+ 调整 ItemBuilder 类,增加玩家皮肤头构造方法
+ 调整 TagDataHandler 类,兼容了弱智 BedwarsRel 的计分板冲突
+ 调整 SupportWorldGuard 类,新增了获取所有区域的方法。
+ 重构 ItemUtils 类,现在更加整洁了。。
+ SkullUtils 被赋予尊贵的 @Deprecated
+ 优化本地通讯网,修复了心跳包的语法错误问题,并新增了 /tclient 命令用于简单的操作通讯网络。
This commit is contained in:
坏黑 2018-09-10 00:00:17 +08:00
parent 40aa95e17b
commit 5b5a96464f
16 changed files with 296 additions and 245 deletions

View File

@ -6,7 +6,7 @@
<groupId>me.skymc</groupId>
<artifactId>TabooLib</artifactId>
<version>4.25</version>
<version>4.26</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

View File

@ -112,7 +112,7 @@ public class Main extends JavaPlugin {
// 载入权限
PermissionUtils.loadRegisteredServiceProvider();
// 物品名称
ItemUtils.LoadLib();
ItemUtils.init();
// 低层工具
DabItemUtils.getInstance();
// 载入周期管理器

View File

@ -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();
}
}
/**
* 创建配置文件
*

View File

@ -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<String, String> itemlib = new LinkedHashMap<>();
private static FileConfiguration itemDir;
private static FileConfiguration itemCache;
private static TConfiguration itemName;
private static LinkedHashMap<String, String> itemLib = new LinkedHashMap<>();
private static LinkedHashMap<String, ItemStack> itemCaches = new LinkedHashMap<>();
private static LinkedHashMap<String, ItemStack> itemCachesFinal = new LinkedHashMap<>();
public static FileConfiguration getItemdir() {
return itemdir;
}
public static FileConfiguration getItemCache() {
return itemCache;
}
public static File getFinalItemsFolder() {
return finalItemsFolder;
}
public static LinkedHashMap<String, String> getItemlib() {
return itemlib;
}
public static LinkedHashMap<String, ItemStack> getItemCaches() {
return itemCaches;
}
public static LinkedHashMap<String, ItemStack> 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<String> asString(List<String> 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<String> _lore = meta.hasLore() ? meta.getLore() : Collections.emptyList();
_lore.add(lore.replaceAll("&", "§"));
List<String> 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<String, String> getItemLib() {
return itemLib;
}
public static FileConfiguration getItemCache() {
return itemCache;
}
public static File getFinalItemsFolder() {
return finalItemsFolder;
}
public static LinkedHashMap<String, ItemStack> getItemCaches() {
return itemCaches;
}
public static LinkedHashMap<String, ItemStack> getItemCachesFinal() {
return itemCachesFinal;
}
// *********************************
//
// Deprecated
//
// *********************************
@Deprecated
public static FileConfiguration getItemdir() {
return itemDir;
}
@Deprecated
public static LinkedHashMap<String, String> 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);

View File

@ -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);

View File

@ -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()));
}

View File

@ -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);
}
}

View File

@ -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();
}
// *********************************

View File

@ -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);
// 将动作发送至所有客户端

View File

@ -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();
}
}

View File

@ -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

View File

@ -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

View File

@ -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());
}

View File

@ -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<String> getRegionIDs(final World world) {
final RegionManager regionManager = this.getRegionManager(world);
return regionManager.getRegions().keySet();
public Collection<String> getRegionIDs(World world) {
return getRegionManager(world).getRegions().keySet();
}
public final Collection<ProtectedRegion> getRegions(final World world) {
final RegionManager regionManager = this.getRegionManager(world);
return regionManager.getRegions().values();
public Collection<ProtectedRegion> 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<String> 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());
}
}

View File

@ -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

View File

@ -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}'
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}'