diff --git a/resources/Language2/Language2.yml b/resources/Language2/Language2.yml index b82305b..b495e0d 100644 --- a/resources/Language2/Language2.yml +++ b/resources/Language2/Language2.yml @@ -11,6 +11,9 @@ # 30: 大标题不兼容当前版本服务器 # 31: 动作栏不兼容当前版本服务器 # 40: 语言文件类型异常 +# 50: BOOK 语言类型指定 option 不存在 +# 51: BOOK 语言类型识别异常 +# 52: BOOK 语言类型 url 地址错误(http:// or https://) # 正常提示 TEXT: '&f正常的提示' @@ -89,4 +92,23 @@ SOUND-TEXT: - '单行文本 - 1' - '单行文本 - 2' - '[sound]' -- 'BLOCK_ANVIL_USE-1-1' \ No newline at end of file +- 'BLOCK_ANVIL_USE-1-1' + +# 书本界面 +BOOK-TEXT: +- '[book]' +- '书本单行文本' +- '&4书本单行文本' +- '&4&l书本单行文本' +- '[page]' +- '<@1>' +- '<@1> | <@1> 单行重复变量' +- '<@1> | <@2> 单行不同变量' +- '@option:1' +- ' text: 文本' +- ' command: 执行命令' +- ' showtext: 显示文本' +- '@option:2' +- ' text: 测试' +- ' command: 执行命令' +- ' showtext: 显示文本' \ No newline at end of file diff --git a/resources/config.yml b/resources/config.yml index dc86cf1..e819d77 100644 --- a/resources/config.yml +++ b/resources/config.yml @@ -35,7 +35,7 @@ DELETE-VARIABLE: false ENABLE-UUID: false # 是否隐藏保存数据的提示 -HIDE-NOTIFY: false +HIDE-NOTIFY: true # 数据库信息 MYSQL: diff --git a/resources/plugin.yml b/resources/plugin.yml index d7e4a98..773120e 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -6,7 +6,7 @@ website: http://www.15imc.com/index.html main: me.skymc.taboolib.Main -version: 3.77 +version: 3.78 commands: taboolib: diff --git a/src/.gradle/4.5/taskHistory/taskHistory.bin b/src/.gradle/4.5/taskHistory/taskHistory.bin deleted file mode 100644 index 4548949..0000000 Binary files a/src/.gradle/4.5/taskHistory/taskHistory.bin and /dev/null differ diff --git a/src/.gradle/4.5/taskHistory/taskHistory.lock b/src/.gradle/4.5/taskHistory/taskHistory.lock deleted file mode 100644 index 6d15a40..0000000 Binary files a/src/.gradle/4.5/taskHistory/taskHistory.lock and /dev/null differ diff --git a/src/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/src/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index ed23724..0000000 Binary files a/src/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ diff --git a/src/.gradle/buildOutputCleanup/cache.properties b/src/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 5af4b84..0000000 --- a/src/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Sat Mar 10 19:32:51 CST 2018 -gradle.version=4.5 diff --git a/src/main/java/me/skymc/taboolib/entity/EntityTag.java b/src/main/java/me/skymc/taboolib/entity/EntityTag.java new file mode 100644 index 0000000..624b85f --- /dev/null +++ b/src/main/java/me/skymc/taboolib/entity/EntityTag.java @@ -0,0 +1,282 @@ +package me.skymc.taboolib.entity; + +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +import org.bukkit.entity.Entity; +import org.bukkit.scheduler.BukkitRunnable; + +import me.skymc.taboolib.Main; + +/** + * 伪 - MetaData + * + * @author sky + * @since 2018-03-11 11:43:41 + */ +public class EntityTag { + + private static EntityTag inst; + private static ConcurrentHashMap> entityData = new ConcurrentHashMap<>(); + + private EntityTag() { + new BukkitRunnable() { + + @Override + public void run() { + for (UUID uuid : entityData.keySet()) { + if (EntityUtils.getEntityWithUUID(uuid) == null) { + entityData.remove(uuid); + } + } + } + }.runTaskTimerAsynchronously(Main.getInst(), 20 * 180, 20 * 180); + } + + public static EntityTag getInst() { + if (inst == null) { + synchronized (EntityTag.class) { + if (inst == null) { + inst = new EntityTag(); + } + } + } + return inst; + } + + /** + * 设置标签 + * + * @param entity 实体 + * @param key 键 + * @param value 值 + */ + public void set(String key, Object value, Entity entity) { + if (contains(entity)) { + entityData.get(entity.getUniqueId()).put(key, value); + } else { + ConcurrentHashMap map = new ConcurrentHashMap<>(); + map.put(key, value); + entityData.put(entity.getUniqueId(), map); + } + } + + /** + * 设置标签 + * + * @param key 键 + * @param value 值 + * @param entity 实体 + */ + public void set(String key, Object value, Entity... entities) { + for (Entity entity : entities) set(key, value, entity); + } + + /** + * 设置标签 + * + * @param key 键 + * @param value 值 + * @param entity 实体 + */ + public void set(String key, Object value, List entities) { + for (Entity entity : entities) set(key, value, entity); + } + + /** + * 移除标签 + * + * @param key 键 + * @param value 值 + * @param entity 实体 + */ + public void remove(String key, Object value, Entity entity) { + if (contains(entity)) { + entityData.get(entity.getUniqueId()).remove(key); + if (entityData.get(entity.getUniqueId()).size() == 0) { + entityData.remove(entity.getUniqueId()); + } + } + } + + /** + * 移除标签 + * + * @param key 键 + * @param value 值 + * @param entities 实体 + */ + public void remove(String key, Object value, Entity... entities) { + for (Entity entity : entities) remove(key, value, entity); + } + + /** + * 移除标签 + * + * @param key 键 + * @param value 值 + * @param entities 实体 + */ + public void remove(String key, Object value, List entities) { + for (Entity entity : entities) remove(key, value, entity); + } + + /** + * 检查数据 + * + * @param entity 实体 + * @return boolean + */ + public boolean contains(Entity entity) { + return entityData.containsKey(entity.getUniqueId()); + } + + /** + * 检查标签 + * + * @param key 键 + * @param entity 实体 + * @return boolean + */ + public boolean hasKey(String key, Entity entity) { + if (contains(entity)) { + return entityData.get(entity.getUniqueId()).containsKey(key); + } + return false; + } + + /** + * 获取数据 + * + * @param key 键 + * @param entity 实体 + * @return Object + */ + public Object get(String key, Entity entity) { + if (contains(entity)) { + return entityData.get(entity.getUniqueId()).get(key); + } + return null; + } + + /** + * 获取数据 + * + * @param key 键 + * @param entity 值 + * @return String + */ + public String getString(String key, Entity entity) { + Object object = get(key, entity); + if (object instanceof String) { + return (String) object; + } + return null; + } + + /** + * 获取数据 + * + * @param key 键 + * @param entity 值 + * @return int + */ + public int getInteger(String key, Entity entity) { + Object object = get(key, entity); + if (object != null) { + return (int) object; + } + return 0; + } + + /** + * 获取数据 + * + * @param key 键 + * @param entity 值 + * @return long + */ + public long getLong(String key, Entity entity) { + Object object = get(key, entity); + if (object != null) { + return (long) object; + } + return 0L; + } + + /** + * 获取数据 + * + * @param key 键 + * @param entity 实体 + * @return boolean + */ + public boolean getBoolean(String key, Entity entity) { + Object object = get(key, entity); + if (object != null) { + return (boolean) object; + } + return false; + } + + /** + * 获取数据 + * + * @param key 键 + * @param entity 实体 + * @return double + */ + public double getDouble(String key, Entity entity) { + Object object = get(key, entity); + if (object != null) { + return (double) object; + } + return 0D; + } + + /** + * 获取数据 + * + * @param key 键 + * @param entity 实体 + * @return float + */ + public double getFloat(String key, Entity entity) { + Object object = get(key, entity); + if (object != null) { + return (float) object; + } + return 0F; + } + + /** + * 获取数据 + * + * @param key 键 + * @param entity 实体 + * @return short + */ + public short getShort(String key, Entity entity) { + Object object = get(key, entity); + if (object != null) { + return (short) object; + } + return (short) 0; + } + + /** + * 获取数据 + * + * @param key 键 + * @param entity 实体 + * @return byte + */ + public byte getByte(String key, Entity entity) { + Object object = get(key, entity); + if (object != null) { + return (byte) object; + } + return (byte) 0; + } +} diff --git a/src/main/java/me/skymc/taboolib/entity/EntityUtils.java b/src/main/java/me/skymc/taboolib/entity/EntityUtils.java index b1c5ff0..84b13bf 100644 --- a/src/main/java/me/skymc/taboolib/entity/EntityUtils.java +++ b/src/main/java/me/skymc/taboolib/entity/EntityUtils.java @@ -16,17 +16,25 @@ import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.WrappedDataWatcher; -import me.skymc.taboolib.methods.MethodsUtils; +import lombok.Getter; +import me.skymc.taboolib.exception.PluginNotFoundException; -public class EntityUtils implements Listener{ +public class EntityUtils implements Listener { - public static Entity lastSpawned = null; + @Getter + private static Entity lastSpawnedEntity = null; @EventHandler public void spawn(EntitySpawnEvent e) { - lastSpawned = e.getEntity(); + lastSpawnedEntity = e.getEntity(); } + /** + * 根据 UUID 获取生物 + * + * @param u + * @return + */ public static Entity getEntityWithUUID(UUID u) { for (World w : Bukkit.getWorlds()) { for (Entity e : w.getLivingEntities()) { @@ -38,6 +46,13 @@ public class EntityUtils implements Listener{ return null; } + /** + * 根据 UUID 获取生物(单世界) + * + * @param u + * @param world + * @return + */ public static Entity getEntityWithUUID_World(UUID u, World world) { for (Entity e : world.getLivingEntities()) { if (e.getUniqueId().equals(u)) { @@ -46,7 +61,7 @@ public class EntityUtils implements Listener{ } return null; } - + /** * 设置生物发光(ProcotolLib) * @@ -54,6 +69,14 @@ public class EntityUtils implements Listener{ * @param entity */ public static void addGlow(Player player,Entity entity) { + if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) { + try { + throw new PluginNotFoundException("缺少前置插件 ProtocolLib"); + } + catch (Exception e) { + // + } + } PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_METADATA); packet.getIntegers().write(0, entity.getEntityId()); WrappedDataWatcher watcher = new WrappedDataWatcher(); @@ -75,6 +98,13 @@ public class EntityUtils implements Listener{ * @param entity */ public static void delGlow(Player player,Entity entity) { + if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) { + try { + throw new PluginNotFoundException("缺少前置插件 ProtocolLib"); + } catch (Exception e) { + // + } + } PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_METADATA); packet.getIntegers().write(0, entity.getEntityId()); WrappedDataWatcher watcher = new WrappedDataWatcher(); diff --git a/src/main/java/me/skymc/taboolib/exception/PluginNotFoundException.java b/src/main/java/me/skymc/taboolib/exception/PluginNotFoundException.java new file mode 100644 index 0000000..0fec22b --- /dev/null +++ b/src/main/java/me/skymc/taboolib/exception/PluginNotFoundException.java @@ -0,0 +1,10 @@ +package me.skymc.taboolib.exception; + +public class PluginNotFoundException extends Error { + + private static final long serialVersionUID = -475540326950009346L; + + public PluginNotFoundException(String message) { + super(message); + } +}