diff --git a/.gitignore b/.gitignore
index b620d62..7492fab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,4 +23,4 @@ hs_err_pid*
.idea
target
TabooLib.iml
-build
\ No newline at end of file
+build
diff --git a/TabooLib R2.iml b/TabooLib R2.iml
index c709ad4..d763862 100644
--- a/TabooLib R2.iml
+++ b/TabooLib R2.iml
@@ -5,4 +5,4 @@
-
\ No newline at end of file
+
diff --git a/build.gradle b/build.gradle
index 7dabdec..a92ca03 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ plugins {
}
group = 'me.skymc'
-version = '5.18'
+version = '5.19'
sourceCompatibility = 1.8
targetCompatibility = 1.8
@@ -19,28 +19,42 @@ tasks.withType(ScalaCompile) {
}
repositories {
- mavenCentral()
+ maven { url "http://ptms.ink:8081/repository/codemc-nms/" }
+ maven { url "http://ptms.ink:8081/repository/maven-releases/" }
maven { url "http://repo.extendedclip.com/content/repositories/placeholderapi/" }
+ mavenCentral()
}
dependencies {
- shadow(group: 'org.apache.cassandra', name: 'cassandra-all', version: '0.8.1') {
+ shadow('org.apache.cassandra:cassandra-all:0.8.1') {
exclude(module: 'slf4j-log4j12')
exclude(module: 'log4j')
}
- compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.8'
- compile group: 'org.ow2.asm', name: 'asm', version: '7.0-beta'
- compile group: 'com.google.code.gson', name: 'gson', version: '2.8.6'
- compile subprojects
- shadow group: 'com.zaxxer', name: 'HikariCP', version: '3.1.0'
- shadow group: 'org.scala-lang', name: 'scala-library', version: '2.12.8'
- shadow group: 'me.clip', name: 'placeholderapi', version: '2.10.4'
- shadow group: 'com.google.inject', name: 'guice', version: '4.2.2'
+ compile 'ink.ptms.core:v11200:11200:all'
+ compile 'ink.ptms.core:v11500:11500:all'
+ compile 'ink.ptms.core:v11400:11400:all'
+ compile 'ink.ptms.core:v11300:11300:all'
+ compile 'ink.ptms.core:v10800:10800:all'
+ compile 'net.md_5.bungee:BungeeCord:1:all'
+ compile 'org.apache.commons:commons-lang3:3.8'
+ compile 'com.google.code.gson:gson:2.8.6'
+ compile 'org.ow2.asm:asm:7.0-beta'
+ shadow 'com.zaxxer:HikariCP:3.1.0'
+ shadow 'com.google.inject:guice:4.2.2'
+ shadow 'org.scala-lang:scala-library:2.12.8'
+ shadow 'pw.yumc.Yum:Yum:1:all'
+ shadow 'me.clip:placeholderapi:2.10.4'
+ shadow 'net.milkbowl.vault:Vault:1:all'
+ shadow 'me.skymc.taboolib:TabooLib:4.9:all'
+ shadow 'us.myles.ViaVersion:ViaVersion:1:all'
+ shadow 'protocolsupport:ProtocolSupport:1:all'
+ shadow 'com.sk89q.worldedit:WorldEdit:7:all'
+ shadow 'com.sk89q.worldguard:WorldGuard:7:all'
+ shadow 'org.inventivetalent.bossbar:BossBar:1:all'
shadow fileTree(dir: 'libs', includes: ['*.jar'])
}
shadowJar {
-
// 免得 MANIFEST.MF 里面刷一堆 lib 难看
taskActions.removeIf { it.actionClassName.contains 'configureShadowTask' }
@@ -48,7 +62,6 @@ shadowJar {
it.include it.dependency('org.apache.commons:.*')
it.include it.dependency('org.ow2.asm:.*')
it.include it.dependency('com.google.code.gson:.*')
- it.include it.dependency('me.skymc:.*')
}
relocate 'org.apache.commons', 'io.izzel.taboolib.internal.apache'
@@ -57,8 +70,6 @@ shadowJar {
}
processResources {
- inputs.property "version", project.version
-
from(sourceSets.main.resources.srcDirs) {
include '__resources__/version'
include 'plugin.yml'
diff --git a/settings.gradle b/settings.gradle
index 761d9a5..77728ac 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,4 +1,3 @@
rootProject.name = 'TabooLib'
include 'injector'
-include 'module-ipc'
-
+include 'module-ipc'
\ No newline at end of file
diff --git a/src/main/scala/io/izzel/taboolib/PluginLoader.java b/src/main/scala/io/izzel/taboolib/PluginLoader.java
index 5f4a72f..201c938 100644
--- a/src/main/scala/io/izzel/taboolib/PluginLoader.java
+++ b/src/main/scala/io/izzel/taboolib/PluginLoader.java
@@ -1,6 +1,7 @@
package io.izzel.taboolib;
import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import io.izzel.taboolib.module.command.TCommandHandler;
import io.izzel.taboolib.module.config.TConfig;
@@ -27,6 +28,7 @@ public abstract class PluginLoader {
private static List registerLoader = Lists.newArrayList();
private static Set plugins = Sets.newHashSet();
+ private static Map redefine = Maps.newHashMap();
static {
registerLoader.add(new PluginLoader() {
@@ -65,8 +67,6 @@ public abstract class PluginLoader {
@Override
public void onStopping(Plugin plugin) {
- // 卸载语言文件
- TLocaleLoader.unload(plugin);
// 保存数据
Local.saveFiles(plugin.getName());
Local.clearFiles(plugin.getName());
@@ -80,6 +80,8 @@ public abstract class PluginLoader {
DBSource.getDataSource().entrySet().stream().filter(dataEntry -> dataEntry.getKey().getPlugin().equals(plugin)).map(Map.Entry::getKey).forEach(DBSource::closeDataSource);
// 注销调度器
Bukkit.getScheduler().cancelTasks(plugin);
+ // 卸载语言文件
+ TLocaleLoader.unload(plugin);
}
});
}
@@ -140,4 +142,12 @@ public abstract class PluginLoader {
public static boolean isPlugin(Plugin plugin) {
return plugins.contains(plugin.getName());
}
+
+ public static void redefine(Plugin origin, Object instance) {
+ redefine.put(origin.getName(), instance);
+ }
+
+ public static Object get(Plugin plugin) {
+ return redefine.getOrDefault(plugin.getName(), plugin);
+ }
}
diff --git a/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java b/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java
index d12419b..f47a4e5 100644
--- a/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java
+++ b/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java
@@ -1,8 +1,11 @@
package io.izzel.taboolib.common.listener;
+import com.google.common.collect.Lists;
import io.izzel.taboolib.TabooLibAPI;
import io.izzel.taboolib.module.db.local.Local;
import io.izzel.taboolib.module.db.local.LocalPlayer;
+import io.izzel.taboolib.module.hologram.Hologram;
+import io.izzel.taboolib.module.hologram.THologram;
import io.izzel.taboolib.module.inject.TListener;
import io.izzel.taboolib.module.locale.TLocale;
import io.izzel.taboolib.module.locale.logger.TLogger;
@@ -11,6 +14,7 @@ import io.izzel.taboolib.util.Files;
import io.izzel.taboolib.util.item.Items;
import io.izzel.taboolib.util.lite.Signs;
import org.bukkit.Bukkit;
+import org.bukkit.Location;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -46,6 +50,30 @@ public class ListenerCommand implements Listener {
e.getPlayer().sendMessage("§8[§3§lTabooLib§8] §7FakeSign Lines: §f" + Arrays.toString(lines));
});
}
+ if (e.getMessage().equalsIgnoreCase("/hologramTest") && e.getPlayer().hasPermission("*")) {
+ e.setCancelled(true);
+ e.getPlayer().sendMessage("§8[§3§lTabooLib§8] §7Hologram Test.");
+ Location location = e.getPlayer().getEyeLocation().add(e.getPlayer().getLocation().getDirection());
+ Hologram hologram = THologram.create(location, "TabooLib", e.getPlayer())
+ .flash(Lists.newArrayList(
+ "§bT§fabooLib",
+ "§bTa§fbooLib",
+ "§bTab§fooLib",
+ "§bTabo§foLib",
+ "§bTaboo§fLib",
+ "§bTabooL§fib",
+ "§bTabooLi§fb",
+ "§bTabooLib",
+ "§bTabooLi§fb",
+ "§bTabooL§fib",
+ "§bTaboo§fLib",
+ "§bTabo§foLib",
+ "§bTab§fooLib",
+ "§bTa§fbooLib",
+ "§bT§fabooLib",
+ "§fTabooLib"
+ ), 1).deleteOn(30);
+ }
}
@EventHandler(priority = EventPriority.LOWEST)
diff --git a/src/main/scala/io/izzel/taboolib/module/dependency/TDependency.java b/src/main/scala/io/izzel/taboolib/module/dependency/TDependency.java
index 033f6a1..656c5b8 100644
--- a/src/main/scala/io/izzel/taboolib/module/dependency/TDependency.java
+++ b/src/main/scala/io/izzel/taboolib/module/dependency/TDependency.java
@@ -9,8 +9,7 @@ import java.util.Arrays;
public class TDependency {
- // 阿里 http://maven.aliyun.com/nexus/content/groups/public
- public static final String MAVEN_REPO = "http://repo1.maven.org/maven2";
+ public static final String MAVEN_REPO = "https://maven.aliyun.com/repository/central";
/**
* 请求一个插件作为依赖,这个插件将会在所有已经添加的 Jenkins 仓库、Maven 仓库寻找
diff --git a/src/main/scala/io/izzel/taboolib/module/hologram/Hologram.java b/src/main/scala/io/izzel/taboolib/module/hologram/Hologram.java
index 9f21706..f1fbb3f 100644
--- a/src/main/scala/io/izzel/taboolib/module/hologram/Hologram.java
+++ b/src/main/scala/io/izzel/taboolib/module/hologram/Hologram.java
@@ -1,13 +1,16 @@
package io.izzel.taboolib.module.hologram;
import com.google.common.collect.Sets;
+import io.izzel.taboolib.TabooLib;
import io.izzel.taboolib.module.nms.NMS;
import io.izzel.taboolib.module.packet.TPacketHandler;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
+import java.util.List;
import java.util.Set;
+import java.util.function.Consumer;
/**
* @Author sky
@@ -22,6 +25,7 @@ public class Hologram {
private boolean deleted = false;
private boolean autoDelete = false;
private int viewDistance = 50;
+ private Consumer event;
Hologram(Location location, String text, Player... viewers) {
THologram.getHolograms().add(this);
@@ -42,6 +46,11 @@ public class Hologram {
return this;
}
+// public Hologram onClick(Consumer event) {
+// this.event = event;
+// return this;
+// }
+
public Hologram refresh() {
if (deleted) {
return this;
@@ -75,6 +84,14 @@ public class Hologram {
return this;
}
+ public Hologram flash(List text, int period) {
+ for (int i = 0; i < text.size(); i++) {
+ String line = text.get(i);
+ Bukkit.getScheduler().runTaskLater(TabooLib.getPlugin(), () -> flash(line), period * i);
+ }
+ return this;
+ }
+
public Hologram flash(String text) {
if (deleted) {
return this;
@@ -99,6 +116,11 @@ public class Hologram {
return this;
}
+ public Hologram deleteOn(int delay) {
+ Bukkit.getScheduler().runTaskLater(TabooLib.getPlugin(), this::delete, delay);
+ return this;
+ }
+
public Hologram destroy() {
if (deleted) {
return this;
@@ -181,6 +203,10 @@ public class Hologram {
return viewDistance;
}
+ public Consumer getEvent() {
+ return event;
+ }
+
public void setText(String text) {
this.text = text;
}
diff --git a/src/main/scala/io/izzel/taboolib/module/hologram/THologramHandler.java b/src/main/scala/io/izzel/taboolib/module/hologram/THologramHandler.java
index beeef87..5bc270f 100644
--- a/src/main/scala/io/izzel/taboolib/module/hologram/THologramHandler.java
+++ b/src/main/scala/io/izzel/taboolib/module/hologram/THologramHandler.java
@@ -44,6 +44,15 @@ class THologramHandler implements Listener {
learned = true;
Bukkit.getScheduler().runTask(TabooLib.getPlugin(), () -> learn(player));
}
+ if (packet.is("PacketPlayInUseEntity")) {
+ int id = packet.read("a", Integer.TYPE);
+ for (Hologram hologram : THologram.getHolograms()) {
+ HologramViewer viewer = hologram.getViewer(player);
+ if (viewer != null && viewer.getId() == id) {
+ hologram.getEvent().accept(player);
+ }
+ }
+ }
return true;
}
@@ -134,7 +143,6 @@ class THologramHandler implements Listener {
public static void learn(Player player) {
player.getWorld().spawn(player.getLocation(), ArmorStand.class, c -> {
learnTarget = c;
- learnTarget.setSmall(true);
learnTarget.setMarker(true);
learnTarget.setVisible(false);
learnTarget.setCustomName(" ");
diff --git a/src/main/scala/io/izzel/taboolib/module/inject/TInjectHelper.java b/src/main/scala/io/izzel/taboolib/module/inject/TInjectHelper.java
index 92fbb02..f4fa188 100644
--- a/src/main/scala/io/izzel/taboolib/module/inject/TInjectHelper.java
+++ b/src/main/scala/io/izzel/taboolib/module/inject/TInjectHelper.java
@@ -1,6 +1,7 @@
package io.izzel.taboolib.module.inject;
import com.google.common.collect.Lists;
+import io.izzel.taboolib.PluginLoader;
import io.izzel.taboolib.compat.kotlin.CompatKotlin;
import io.izzel.taboolib.module.locale.logger.TLogger;
import org.bukkit.plugin.Plugin;
@@ -43,13 +44,17 @@ public class TInjectHelper {
// No Static
else if (!Modifier.isStatic(field.getModifiers())) {
// Main
- if (pluginClass.equals(plugin.getClass())) {
- instance.add(plugin);
+ if (pluginClass.equals(PluginLoader.get(plugin).getClass())) {
+ instance.add(PluginLoader.get(plugin));
}
// TInject
else if (TInjectCreator.getInstanceMap().entrySet().stream().anyMatch(e -> e.getKey().getType().equals(pluginClass))) {
TInjectCreator.getInstanceMap().entrySet().stream().filter(e -> e.getKey().getType().equals(pluginClass)).forEach(i -> instance.add(i.getValue().getInstance()));
}
+ // TListener
+ else {
+ instance.addAll(TListenerHandler.getInstance(plugin, pluginClass));
+ }
}
// Nothing
if (instance.isEmpty()) {
diff --git a/src/main/scala/io/izzel/taboolib/module/inject/TListenerHandler.java b/src/main/scala/io/izzel/taboolib/module/inject/TListenerHandler.java
index 2d2bd62..c04e341 100644
--- a/src/main/scala/io/izzel/taboolib/module/inject/TListenerHandler.java
+++ b/src/main/scala/io/izzel/taboolib/module/inject/TListenerHandler.java
@@ -14,6 +14,7 @@ import org.bukkit.plugin.Plugin;
import java.lang.reflect.Method;
import java.util.*;
+import java.util.stream.Collectors;
/**
* @Author sky
@@ -39,8 +40,6 @@ public class TListenerHandler {
/**
* 初始化插件的所有监听器
* 该操作会执行无参构造方法
- *
- * @param plugin 插件
*/
public static void setupListener(Plugin plugin) {
for (Class> pluginClass : TabooLibLoader.getPluginClassSafely(plugin)) {
@@ -89,8 +88,6 @@ public class TListenerHandler {
/**
* 注册插件的所有监听器
* 该操作会执行 TListener 注解中的 register() 对应方法
- *
- * @param plugin 插件
*/
public static void registerListener(Plugin plugin) {
Optional.ofNullable(listeners.get(plugin.getName())).ifPresent(listeners -> {
@@ -141,8 +138,6 @@ public class TListenerHandler {
/**
* 注销插件的所有监听器
* 该操作会执行 TListener 注解中的 cancel() 对应方法
- *
- * @param plugin 插件
*/
public static void cancelListener(Plugin plugin) {
Optional.ofNullable(listeners.remove(plugin.getName())).ifPresent(listeners -> {
@@ -162,6 +157,11 @@ public class TListenerHandler {
});
}
+ public static List getInstance(Plugin plugin, Class pluginClass) {
+ List list = TListenerHandler.listeners.get(plugin.getName());
+ return list == null ? Collections.emptyList() : list.stream().filter(listener -> pluginClass.equals(listener.getClass())).collect(Collectors.toList());
+ }
+
public static HashMap> getListeners() {
return listeners;
}
diff --git a/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java b/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java
index 43a196d..5d20693 100644
--- a/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java
+++ b/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java
@@ -254,7 +254,7 @@ public class NMSImpl extends NMS {
} else {
attr = ((net.minecraft.server.v1_8_R3.ItemStack) nmsItem).getItem().i();
}
- ((Multimap) attr).forEach((k, v) -> {
+ ((Multimap) attr).asMap().forEach((k, v) -> {
Object nbt = net.minecraft.server.v1_12_R1.GenericAttributes.a((net.minecraft.server.v1_12_R1.AttributeModifier) v);
list.add(new NBTAttribute(
new UUID(((NBTTagCompound) nbt).getLong("UUIDMost"), ((NBTTagCompound) nbt).getLong("UUIDLeast")),
diff --git a/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTCompound.java b/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTCompound.java
index 3ff8b0a..b17fd51 100644
--- a/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTCompound.java
+++ b/src/main/scala/io/izzel/taboolib/module/nms/nbt/NBTCompound.java
@@ -70,7 +70,7 @@ public class NBTCompound extends NBTBase implements Map {
if (element instanceof JsonObject) {
JsonObject json = (JsonObject) element;
// base
- if (json.has("type") && json.has("data") && json.size() == 2) {
+ if (json.has("type") && json.has("data") && json.entrySet().size() == 2) {
switch (NBTType.parse(json.get("type").getAsString())) {
case BYTE:
return new NBTBase(json.get("data").getAsByte());
diff --git a/src/main/scala/io/izzel/taboolib/util/item/Items.java b/src/main/scala/io/izzel/taboolib/util/item/Items.java
index d40c9a4..5da8953 100644
--- a/src/main/scala/io/izzel/taboolib/util/item/Items.java
+++ b/src/main/scala/io/izzel/taboolib/util/item/Items.java
@@ -11,6 +11,7 @@ import io.izzel.taboolib.module.nms.nbt.Attribute;
import io.izzel.taboolib.module.nms.nbt.NBTBase;
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
import io.izzel.taboolib.module.nms.nbt.NBTList;
+import io.izzel.taboolib.util.Reflection;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
@@ -75,7 +76,11 @@ public class Items {
public static Material asMaterial(String args) {
try {
Material material = Material.getMaterial(args.toUpperCase());
- return material != null ? material : Material.getMaterial(Integer.valueOf(args));
+ if (material != null) {
+ return material;
+ }
+ Object getById = Reflection.invokeMethod(Material.class, "getMaterial", NumberConversions.toInt(args));
+ return getById != null ? (Material) getById : null;
} catch (Exception e) {
return Material.STONE;
}
@@ -101,7 +106,11 @@ public class Items {
public static Enchantment asEnchantment(String enchant) {
try {
Enchantment enchantment = Enchantment.getByName(enchant);
- return enchantment != null ? enchantment : Enchantment.getById(Integer.valueOf(enchant));
+ if (enchantment != null) {
+ return enchantment;
+ }
+ Object getById = Reflection.invokeMethod(Enchantment.class, "getById", NumberConversions.toInt(enchant));
+ return getById != null ? (Enchantment) getById : null;
} catch (Exception e) {
return null;
}