From b78417b48b020845e01149822f7f6ab96d881674 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Wed, 18 May 2016 09:27:26 +0200 Subject: [PATCH] Compatibility 1.7, fallbacks etc. --- src/com/massivecraft/massivecore/Engine.java | 25 +++-- .../massivecraft/massivecore/MassiveCore.java | 13 ++- .../massivecore/MassivePlugin.java | 95 ++++++++++++------- .../command/type/RegistryType.java | 79 +++++++-------- .../massivecore/item/DataBannerPattern.java | 18 ++-- .../massivecraft/massivecore/mixin/Mixin.java | 2 +- .../massivecore/mson/MsonEvent.java | 6 +- .../massivecore/nms/NmsBasics.java | 9 ++ .../massivecore/nms/NmsBasics17R4P.java | 17 ++++ .../massivecraft/massivecore/nms/NmsChat.java | 3 +- .../massivecore/nms/NmsChatFallback.java | 12 +++ .../massivecore/nms/NmsItemStackTooltip.java | 5 +- .../nms/NmsItemStackTooltipFallback.java | 12 +++ .../massivecore/util/ReflectionUtil.java | 2 +- 14 files changed, 192 insertions(+), 106 deletions(-) create mode 100644 src/com/massivecraft/massivecore/nms/NmsChatFallback.java create mode 100644 src/com/massivecraft/massivecore/nms/NmsItemStackTooltipFallback.java diff --git a/src/com/massivecraft/massivecore/Engine.java b/src/com/massivecraft/massivecore/Engine.java index 873013b8..f4848abf 100644 --- a/src/com/massivecraft/massivecore/Engine.java +++ b/src/com/massivecraft/massivecore/Engine.java @@ -22,7 +22,6 @@ public abstract class Engine implements Active, Listener, Runnable private static final transient Set allInstances = new MassiveSet<>(); public static Set getAllInstances() { return allInstances; } - // -------------------------------------------- // // PLUGIN // -------------------------------------------- // @@ -117,7 +116,12 @@ public abstract class Engine implements Active, Listener, Runnable { if (active) { - Bukkit.getPluginManager().registerEvents(this, this.getPlugin()); + // Support without at load + MassivePlugin plugin = this.getPlugin(); + if (plugin.isEnabled()) + { + Bukkit.getPluginManager().registerEvents(this, this.getPlugin()); + } } else { @@ -135,13 +139,18 @@ public abstract class Engine implements Active, Listener, Runnable { if (this.getPeriod() != null) { - if (this.isSync()) + // Support without at load + MassivePlugin plugin = this.getPlugin(); + if (plugin.isEnabled()) { - this.task = Bukkit.getScheduler().runTaskTimer(this.getPlugin(), this, this.getDelay(), this.getPeriod()); - } - else - { - this.task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.getPlugin(), this, this.getDelay(), this.getPeriod()); + if (this.isSync()) + { + this.task = Bukkit.getScheduler().runTaskTimer(this.getPlugin(), this, this.getDelay(), this.getPeriod()); + } + else + { + this.task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.getPlugin(), this, this.getDelay(), this.getPeriod()); + } } } } diff --git a/src/com/massivecraft/massivecore/MassiveCore.java b/src/com/massivecraft/massivecore/MassiveCore.java index 96f92ca0..5d165443 100644 --- a/src/com/massivecraft/massivecore/MassiveCore.java +++ b/src/com/massivecraft/massivecore/MassiveCore.java @@ -217,17 +217,20 @@ public class MassiveCore extends MassivePlugin } // -------------------------------------------- // - // OVERRIDE + // LOAD // -------------------------------------------- // @Override - public void onLoad() + public void onLoadInner() { - super.onLoad(); // Attempting to fix a race condition within the class asynchronous class loader. System.out.println("TimeUnit.MILLIS_PER_MINUTE: " + TimeUnit.MILLIS_PER_MINUTE); } + // -------------------------------------------- // + // ENABLE + // -------------------------------------------- // + @Override public void onEnableInner() { @@ -328,6 +331,10 @@ public class MassiveCore extends MassivePlugin Bukkit.getScheduler().scheduleSyncDelayedTask(this, MassiveCoreTaskDeleteFiles.get()); } + // -------------------------------------------- // + // DISABLE + // -------------------------------------------- // + @Override public void onDisable() { diff --git a/src/com/massivecraft/massivecore/MassivePlugin.java b/src/com/massivecraft/massivecore/MassivePlugin.java index ec293a4c..fb7734ee 100644 --- a/src/com/massivecraft/massivecore/MassivePlugin.java +++ b/src/com/massivecraft/massivecore/MassivePlugin.java @@ -36,19 +36,52 @@ public abstract class MassivePlugin extends JavaPlugin implements Listener, Name public boolean isVersionSynchronized() { return this.versionSynchronized; } public void setVersionSynchronized(boolean versionSynchronized) { this.versionSynchronized = versionSynchronized; } + // -------------------------------------------- // + // LOAD + // -------------------------------------------- // + + @Override + public void onLoad() + { + this.onLoadPre(); + this.onLoadInner(); + this.onLoadPost(); + } + + public void onLoadPre() + { + this.logPrefixColored = Txt.parse("[%s %s] ", this.getDescription().getName(), this.getDescription().getVersion()); + this.logPrefixPlain = ChatColor.stripColor(this.logPrefixColored); + } + + public void onLoadInner() + { + + } + + public void onLoadPost() + { + + } + // -------------------------------------------- // // ENABLE // -------------------------------------------- // + @Override + public void onEnable() + { + if ( ! this.onEnablePre()) return; + this.onEnableInner(); + this.onEnablePost(); + } + private long enableTime; public long getEnableTime() { return this.enableTime; } - public boolean preEnable() + public boolean onEnablePre() { - enableTime = System.currentTimeMillis(); - - this.logPrefixColored = Txt.parse("[%s %s] ", this.getDescription().getName(), this.getDescription().getVersion()); - this.logPrefixPlain = ChatColor.stripColor(this.logPrefixColored); + this.enableTime = System.currentTimeMillis(); log("=== ENABLE START ==="); @@ -65,27 +98,6 @@ public abstract class MassivePlugin extends JavaPlugin implements Listener, Name return true; } - public void postEnable() - { - // Metrics - if (MassiveCoreMConf.get().mcstatsEnabled) - { - try - { - MetricsLite metrics = new MetricsLite(this); - metrics.start(); - } - catch (IOException e) - { - String message = Txt.parse("Metrics Initialization Failed :'("); - log(message); - } - } - - long ms = System.currentTimeMillis() - enableTime; - log(Txt.parse("=== ENABLE COMPLETE (Took " + ms + "ms) ===")); - } - public void checkVersionSynchronization() { // If this plugin is version synchronized ... @@ -121,21 +133,32 @@ public abstract class MassivePlugin extends JavaPlugin implements Listener, Name } } - @Override - public void onEnable() - { - if ( ! this.preEnable()) return; - - this.onEnableInner(); - - this.postEnable(); - } - public void onEnableInner() { } + public void onEnablePost() + { + // Metrics + if (MassiveCoreMConf.get().mcstatsEnabled) + { + try + { + MetricsLite metrics = new MetricsLite(this); + metrics.start(); + } + catch (IOException e) + { + String message = Txt.parse("Metrics Initialization Failed :'("); + log(message); + } + } + + long ms = System.currentTimeMillis() - this.enableTime; + log(Txt.parse("=== ENABLE COMPLETE (Took " + ms + "ms) ===")); + } + // -------------------------------------------- // // DISABLE // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/command/type/RegistryType.java b/src/com/massivecraft/massivecore/command/type/RegistryType.java index fb8c13e9..cfe7a9bd 100644 --- a/src/com/massivecraft/massivecore/command/type/RegistryType.java +++ b/src/com/massivecraft/massivecore/command/type/RegistryType.java @@ -88,31 +88,42 @@ public class RegistryType public static Type getType(Field field) { - EditorType annotation = field.getAnnotation(EditorType.class); - if (annotation != null) + try { - Class clazz = annotation.value(); - if (clazz == void.class) clazz = getType(field.getGenericType()).getClass(); - return getType(clazz, annotation.fieldName()); + EditorType annotation = field.getAnnotation(EditorType.class); + if (annotation != null) + { + Class clazz = annotation.value(); + if (clazz == void.class) clazz = getType(field.getGenericType()).getClass(); + return getType(clazz, annotation.fieldName()); + } + + EditorTypeList annList = field.getAnnotation(EditorTypeList.class); + if (annList != null) + { + return TypeList.get(getType(annList.value(), annList.fieldName())); + } + + EditorTypeSet annSet = field.getAnnotation(EditorTypeSet.class); + if (annSet != null) + { + return TypeSet.get(getType(annSet.value(), annSet.fieldName())); + } + + EditorTypeMap annMap = field.getAnnotation(EditorTypeMap.class); + if (annMap != null) + { + return TypeMap.get(getType(annMap.typeKey(), annMap.fieldNameKey()), getType(annMap.typeValue(), annMap.fieldNameValue())); + } + } + catch (Throwable t) + { + // This has to do with backwards compatibility (Usually 1.7). + // The EditorType annotations may trigger creation of type class instances. + // Those type classes may refer to Bukkit classes not present. + // This issue was first encountered for TypeDataItemStack. } - EditorTypeList annList = field.getAnnotation(EditorTypeList.class); - if (annList != null) - { - return TypeList.get(getType(annList.value(), annList.fieldName())); - } - - EditorTypeSet annSet = field.getAnnotation(EditorTypeSet.class); - if (annSet != null) - { - return TypeSet.get(getType(annSet.value(), annSet.fieldName())); - } - - EditorTypeMap annMap = field.getAnnotation(EditorTypeMap.class); - if (annMap != null) - { - return TypeMap.get(getType(annMap.typeKey(), annMap.fieldNameKey()), getType(annMap.typeValue(), annMap.fieldNameValue())); - } return getType(field.getGenericType()); } private static Type getType(Class clazz, String fieldName) @@ -225,30 +236,10 @@ public class RegistryType register(TypeDestination.get()); register(TypeItemStack.get()); - // 1.7 Compat - try - { - register(TypeDataBannerPattern.get()); - } - catch (Throwable t) - { - - } - + register(TypeDataBannerPattern.get()); register(TypeDataPotionEffect.get()); register(TypeDataFireworkEffect.get()); - - // 1.? Compat - // TODO: The annotations breaks with 1.7. - // TODO: Find a solution to dodge the converter annotation class inits. - try - { - register(TypeDataItemStack.get()); - } - catch (Throwable t) - { - - } + register(TypeDataItemStack.get()); register(TypePermission.get()); register(TypePotionEffectType.get()); diff --git a/src/com/massivecraft/massivecore/item/DataBannerPattern.java b/src/com/massivecraft/massivecore/item/DataBannerPattern.java index 0a45428f..e1dc73ef 100644 --- a/src/com/massivecraft/massivecore/item/DataBannerPattern.java +++ b/src/com/massivecraft/massivecore/item/DataBannerPattern.java @@ -47,25 +47,31 @@ public class DataBannerPattern implements Comparable } - public DataBannerPattern(Pattern pattern) + // Minecraft 1.7 Compatibility + public DataBannerPattern(Object pattern) { - this.write(pattern, false); + if ( ! (pattern instanceof Pattern)) throw new IllegalArgumentException("pattern"); + this.write((Pattern)pattern, false); } // -------------------------------------------- // // WRITE // -------------------------------------------- // - public void write(Pattern pattern, boolean a2b) + // Minecraft 1.7 Compatibility + public void write(Object pattern, boolean a2b) { - WriterBannerPattern.get().write(this, pattern, a2b); + if ( ! (pattern instanceof Pattern)) throw new IllegalArgumentException("pattern"); + WriterBannerPattern.get().write(this, (Pattern)pattern, a2b); } // -------------------------------------------- // // TO BUKKIT // -------------------------------------------- // - public Pattern toBukkit() + // Minecraft 1.7 Compatibility + @SuppressWarnings("unchecked") + public T toBukkit() { // Create Pattern ret = WriterBannerPattern.get().createOB(); @@ -74,7 +80,7 @@ public class DataBannerPattern implements Comparable this.write(ret, true); // Return - return ret; + return (T) ret; } // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/mixin/Mixin.java b/src/com/massivecraft/massivecore/mixin/Mixin.java index 33c1d83b..5b97407f 100644 --- a/src/com/massivecraft/massivecore/mixin/Mixin.java +++ b/src/com/massivecraft/massivecore/mixin/Mixin.java @@ -65,7 +65,7 @@ public class Mixin extends Engine // NOTE: This field must be set in the default constructor! private Boolean availableDefault = null; public boolean isAvailableDefault() { return (this.availableDefault != null ? this.availableDefault : this.getDefault().getAlternatives().isEmpty()); } - public void setAvailableDefault(boolean availableDefault) { this.setAvailableDefault(availableDefault); } + public void setAvailableDefault(boolean availableDefault) { this.availableDefault = availableDefault; } public boolean isAvailable() { return this.isAvailableDefault() || this.getInstance() != this.getDefault(); } public void require() { if (this.isAvailable()) return; throw new IllegalStateException(this.getBaseName() + " is Required"); } diff --git a/src/com/massivecraft/massivecore/mson/MsonEvent.java b/src/com/massivecraft/massivecore/mson/MsonEvent.java index 5d8d4133..9ed569d5 100644 --- a/src/com/massivecraft/massivecore/mson/MsonEvent.java +++ b/src/com/massivecraft/massivecore/mson/MsonEvent.java @@ -127,10 +127,8 @@ public final class MsonEvent implements Serializable public static MsonEvent item(ItemStack item) { if (item == null) throw new NullPointerException("item"); - String nbtStringTooltip = null; - NmsItemStackTooltip nms = NmsItemStackTooltip.get(); - if (nms.isAvailable()) nbtStringTooltip = nms.getNbtStringTooltip(item); - return MsonEvent.valueOf(MsonEventAction.SHOW_ITEM, nbtStringTooltip); + String value = NmsItemStackTooltip.get().getNbtStringTooltip(item); + return MsonEvent.valueOf(MsonEventAction.SHOW_ITEM, value); } // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/nms/NmsBasics.java b/src/com/massivecraft/massivecore/nms/NmsBasics.java index add62320..371da20c 100644 --- a/src/com/massivecraft/massivecore/nms/NmsBasics.java +++ b/src/com/massivecraft/massivecore/nms/NmsBasics.java @@ -84,4 +84,13 @@ public class NmsBasics extends Mixin throw this.notImplemented(); } + // -------------------------------------------- // + // PING + // -------------------------------------------- // + + public int getPing(Player player) + { + throw this.notImplemented(); + } + } diff --git a/src/com/massivecraft/massivecore/nms/NmsBasics17R4P.java b/src/com/massivecraft/massivecore/nms/NmsBasics17R4P.java index b467c64f..505df530 100644 --- a/src/com/massivecraft/massivecore/nms/NmsBasics17R4P.java +++ b/src/com/massivecraft/massivecore/nms/NmsBasics17R4P.java @@ -72,6 +72,10 @@ public class NmsBasics17R4P extends NmsBasics // net.minecraft.server.PlayerConnection#sendPacket(Packet) private Method methodPlayerConnectionsendPacket; + // PING + // net.minecraft.server.EntityPlayer#ping + private Field fieldNmsPlayerPing; + // -------------------------------------------- // // SETUP // -------------------------------------------- // @@ -107,6 +111,9 @@ public class NmsBasics17R4P extends NmsBasics this.classNmsPacket = PackageType.MINECRAFT_SERVER.getClass("Packet"); this.classNmsPlayerConnection = PackageType.MINECRAFT_SERVER.getClass("PlayerConnection"); this.methodPlayerConnectionsendPacket = ReflectionUtil.getMethod(this.classNmsPlayerConnection, "sendPacket", this.classNmsPacket); + + // PING + this.fieldNmsPlayerPing = ReflectionUtil.getField(this.classNmsPlayer, "ping"); } // -------------------------------------------- // @@ -170,4 +177,14 @@ public class NmsBasics17R4P extends NmsBasics ReflectionUtil.invokeMethod(this.methodPlayerConnectionsendPacket, connection, packet); } + // -------------------------------------------- // + // PING + // -------------------------------------------- // + + public int getPing(Player player) + { + Object handle = this.getHandle(player); + return ReflectionUtil.getField(this.fieldNmsPlayerPing, handle); + } + } diff --git a/src/com/massivecraft/massivecore/nms/NmsChat.java b/src/com/massivecraft/massivecore/nms/NmsChat.java index bb3f9e76..5bcfbed4 100644 --- a/src/com/massivecraft/massivecore/nms/NmsChat.java +++ b/src/com/massivecraft/massivecore/nms/NmsChat.java @@ -16,7 +16,8 @@ public class NmsChat extends Mixin private static NmsChat d = new NmsChat().setAlternatives( NmsChat18R2P.class, - NmsChat18R1.class + NmsChat18R1.class, + NmsChatFallback.class ); // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/nms/NmsChatFallback.java b/src/com/massivecraft/massivecore/nms/NmsChatFallback.java new file mode 100644 index 00000000..384b9fb5 --- /dev/null +++ b/src/com/massivecraft/massivecore/nms/NmsChatFallback.java @@ -0,0 +1,12 @@ +package com.massivecraft.massivecore.nms; + +public class NmsChatFallback extends NmsChat +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static NmsChatFallback i = new NmsChatFallback(); + public static NmsChatFallback get() { return i; } + +} diff --git a/src/com/massivecraft/massivecore/nms/NmsItemStackTooltip.java b/src/com/massivecraft/massivecore/nms/NmsItemStackTooltip.java index 68fadf0d..7c9a2802 100644 --- a/src/com/massivecraft/massivecore/nms/NmsItemStackTooltip.java +++ b/src/com/massivecraft/massivecore/nms/NmsItemStackTooltip.java @@ -11,7 +11,8 @@ public class NmsItemStackTooltip extends Mixin // -------------------------------------------- // private static NmsItemStackTooltip d = new NmsItemStackTooltip().setAlternatives( - NmsItemStackTooltip18R1P.class + NmsItemStackTooltip18R1P.class, + NmsItemStackTooltipFallback.class ); // -------------------------------------------- // @@ -27,7 +28,7 @@ public class NmsItemStackTooltip extends Mixin public String getNbtStringTooltip(ItemStack item) { - throw notImplemented(); + return null; } } diff --git a/src/com/massivecraft/massivecore/nms/NmsItemStackTooltipFallback.java b/src/com/massivecraft/massivecore/nms/NmsItemStackTooltipFallback.java new file mode 100644 index 00000000..69b49f7c --- /dev/null +++ b/src/com/massivecraft/massivecore/nms/NmsItemStackTooltipFallback.java @@ -0,0 +1,12 @@ +package com.massivecraft.massivecore.nms; + +public class NmsItemStackTooltipFallback extends NmsItemStackTooltip +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static NmsItemStackTooltipFallback i = new NmsItemStackTooltipFallback(); + public static NmsItemStackTooltipFallback get () { return i; } + +} diff --git a/src/com/massivecraft/massivecore/util/ReflectionUtil.java b/src/com/massivecraft/massivecore/util/ReflectionUtil.java index 3b65e7f0..e34fd944 100644 --- a/src/com/massivecraft/massivecore/util/ReflectionUtil.java +++ b/src/com/massivecraft/massivecore/util/ReflectionUtil.java @@ -154,7 +154,7 @@ public class ReflectionUtil public static Constructor getConstructor(Class clazz, Class... parameterTypes) { try - { + { Constructor ret = (Constructor) clazz.getDeclaredConstructor(parameterTypes); makeAccessible(ret); return ret;