From 5503ba44f095a779321751f2edca03f62a392861 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Sun, 11 Jun 2017 19:02:26 +0200 Subject: [PATCH] Initial Pass at Minecraft 1.12 support --- .../massivecraft/massivecore/MassiveCore.java | 14 ++++- .../massivecraft/massivecore/nms/NmsChat.java | 1 + .../massivecore/nms/NmsChat112R1P.java | 54 +++++++++++++++++++ .../massivecore/nms/NmsChat18R1.java | 9 ++-- .../massivecore/nms/NmsChat18R2P.java | 10 ++-- .../massivecore/nms/NmsChatAbstract.java | 29 +++++----- .../sender/BasicCommandSender.java | 10 +--- .../massivecore/util/RecipeUtil.java | 37 ++++++++++++- 8 files changed, 134 insertions(+), 30 deletions(-) create mode 100644 src/com/massivecraft/massivecore/nms/NmsChat112R1P.java diff --git a/src/com/massivecraft/massivecore/MassiveCore.java b/src/com/massivecraft/massivecore/MassiveCore.java index 6f78dd59..f09fefb3 100644 --- a/src/com/massivecraft/massivecore/MassiveCore.java +++ b/src/com/massivecraft/massivecore/MassiveCore.java @@ -35,6 +35,7 @@ import com.massivecraft.massivecore.item.WriterItemStack; import com.massivecraft.massivecore.mixin.MixinEvent; import com.massivecraft.massivecore.mson.Mson; import com.massivecraft.massivecore.mson.MsonEvent; +import com.massivecraft.massivecore.nms.NmsBasics; import com.massivecraft.massivecore.nms.NmsItemStackCreate17R4P; import com.massivecraft.massivecore.ps.PS; import com.massivecraft.massivecore.ps.PSAdapter; @@ -261,7 +262,18 @@ public class MassiveCore extends MassivePlugin return ret; } - + + @Override + public List> getClassesActiveNms() + { + List> ret = super.getClassesActiveNms(); + + ret.remove(NmsBasics.class); + ret.add(0, NmsBasics.class); + + return ret; + } + @Override public List> getClassesActiveMixins() { diff --git a/src/com/massivecraft/massivecore/nms/NmsChat.java b/src/com/massivecraft/massivecore/nms/NmsChat.java index 247ed327..778a26c2 100644 --- a/src/com/massivecraft/massivecore/nms/NmsChat.java +++ b/src/com/massivecraft/massivecore/nms/NmsChat.java @@ -14,6 +14,7 @@ public class NmsChat extends Mixin // -------------------------------------------- // private static NmsChat d = new NmsChat().setAlternatives( + NmsChat112R1P.class, NmsChat18R2P.class, NmsChat18R1.class, NmsChatFallback.class diff --git a/src/com/massivecraft/massivecore/nms/NmsChat112R1P.java b/src/com/massivecraft/massivecore/nms/NmsChat112R1P.java new file mode 100644 index 00000000..3aa3c5f2 --- /dev/null +++ b/src/com/massivecraft/massivecore/nms/NmsChat112R1P.java @@ -0,0 +1,54 @@ +package com.massivecraft.massivecore.nms; + +import com.massivecraft.massivecore.particleeffect.ReflectionUtils.PackageType; +import com.massivecraft.massivecore.util.IdUtil; +import com.massivecraft.massivecore.util.ReflectionUtil; +import org.bukkit.entity.Player; + +public class NmsChat112R1P extends NmsChatAbstract +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static NmsChat112R1P i = new NmsChat112R1P(); + public static NmsChat112R1P get() { return i; } + + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + protected Class classChatMessageType; + protected Object instanceChatMessageTypeGameInfo; + + // -------------------------------------------- // + // SETUP + // -------------------------------------------- // + + @Override + public void setup() throws Throwable + { + this.classChatSerializer = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent$ChatSerializer"); + this.methodChatSerializer = ReflectionUtil.getMethod(this.classChatSerializer, "a", String.class); + this.classEnumTitleAction = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle$EnumTitleAction"); + + setupCommon(); + + this.classChatMessageType = PackageType.MINECRAFT_SERVER.getClass("ChatMessageType"); + this.instanceChatMessageTypeGameInfo = this.classChatMessageType.getEnumConstants()[2]; + // CHAT(0), + // SYSTEM(1), + // GAME_INFO(2); + this.constructorPacketPlayOutChatType = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent, this.classChatMessageType); + } + + // -------------------------------------------- // + // ACTIONBAR + // -------------------------------------------- // + + @Override + public T constructActionBarPacket(Object component) { + return ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutChatType, component, this.instanceChatMessageTypeGameInfo); + } + +} diff --git a/src/com/massivecraft/massivecore/nms/NmsChat18R1.java b/src/com/massivecraft/massivecore/nms/NmsChat18R1.java index ba34379d..e4c79dde 100644 --- a/src/com/massivecraft/massivecore/nms/NmsChat18R1.java +++ b/src/com/massivecraft/massivecore/nms/NmsChat18R1.java @@ -13,16 +13,19 @@ public class NmsChat18R1 extends NmsChatAbstract public static NmsChat18R1 get() { return i; } // -------------------------------------------- // - // SETUP SPECIFIC + // SETUP // -------------------------------------------- // @Override - public void setupSpecific() throws Throwable + public void setup() throws Throwable { this.classChatSerializer = PackageType.MINECRAFT_SERVER.getClass("ChatSerializer"); this.methodChatSerializer = ReflectionUtil.getMethod(this.classChatSerializer, "a", String.class); - this.classEnumTitleAction = PackageType.MINECRAFT_SERVER.getClass("EnumTitleAction"); + + setupCommon(); + + this.constructorPacketPlayOutChatType = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent, Byte.TYPE); } } diff --git a/src/com/massivecraft/massivecore/nms/NmsChat18R2P.java b/src/com/massivecraft/massivecore/nms/NmsChat18R2P.java index e5d393e5..e0e5625e 100644 --- a/src/com/massivecraft/massivecore/nms/NmsChat18R2P.java +++ b/src/com/massivecraft/massivecore/nms/NmsChat18R2P.java @@ -13,16 +13,18 @@ public class NmsChat18R2P extends NmsChatAbstract public static NmsChat18R2P get() { return i; } // -------------------------------------------- // - // SETUP SPECIFIC + // SETUP // -------------------------------------------- // @Override - public void setupSpecific() throws Throwable + public void setup() throws Throwable { this.classChatSerializer = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent$ChatSerializer"); this.methodChatSerializer = ReflectionUtil.getMethod(this.classChatSerializer, "a", String.class); - this.classEnumTitleAction = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle$EnumTitleAction"); + + setupCommon(); + + this.constructorPacketPlayOutChatType = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent, Byte.TYPE); } - } diff --git a/src/com/massivecraft/massivecore/nms/NmsChatAbstract.java b/src/com/massivecraft/massivecore/nms/NmsChatAbstract.java index fb3b3d7f..c55a48c4 100644 --- a/src/com/massivecraft/massivecore/nms/NmsChatAbstract.java +++ b/src/com/massivecraft/massivecore/nms/NmsChatAbstract.java @@ -61,8 +61,14 @@ public abstract class NmsChatAbstract extends NmsChat @Override public void setup() throws Throwable { - this.setupSpecific(); - + throw notImplemented(); + } + + // -------------------------------------------- // + // SETUP COMMON + // -------------------------------------------- // + + protected void setupCommon() throws Throwable { for (Object object : this.classEnumTitleAction.getEnumConstants()) { Enum e = (Enum) object; @@ -70,27 +76,20 @@ public abstract class NmsChatAbstract extends NmsChat else if (e.name().equalsIgnoreCase("SUBTITLE")) this.enumEnumTitleActionSub = e; else if (e.name().equalsIgnoreCase("TIMES")) this.enumEnumTitleActionTimes = e; } - + this.classIChatBaseComponent = PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent"); - + // Get title packet and it's constructor this.classPacketPlayOutTitle = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutTitle"); this.constructorPacketPlayOutTitle = ReflectionUtil.getConstructor(this.classPacketPlayOutTitle, this.classEnumTitleAction, this.classIChatBaseComponent); this.constructorPacketPlayOutTitleTimes = ReflectionUtil.getConstructor(this.classPacketPlayOutTitle, this.classEnumTitleAction, this.classIChatBaseComponent, int.class, int.class, int.class); - + // Get Chat packet and it's constructor this.classPacketPlayOutChat = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutChat"); this.constructorPacketPlayOutChat = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent); - this.constructorPacketPlayOutChatType = ReflectionUtil.getConstructor(this.classPacketPlayOutChat, this.classIChatBaseComponent, Byte.TYPE); } - // -------------------------------------------- // - // SETUP SPECIFIC - // -------------------------------------------- // - - public abstract void setupSpecific() throws Throwable; - // -------------------------------------------- // // TO COMPONENT // -------------------------------------------- // @@ -173,8 +172,12 @@ public abstract class NmsChatAbstract extends NmsChat if (player == null) return; Object component = toComponent(raw); - Object packet = ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutChatType, component, (byte)2); + Object packet = this.constructActionBarPacket(component); NmsBasics.get().sendPacket(player, packet); } + public T constructActionBarPacket(Object component) { + return ReflectionUtil.invokeConstructor(this.constructorPacketPlayOutChatType, component, (byte)2); + } + } diff --git a/src/com/massivecraft/massivecore/sender/BasicCommandSender.java b/src/com/massivecraft/massivecore/sender/BasicCommandSender.java index 09e6a14b..b4289b36 100644 --- a/src/com/massivecraft/massivecore/sender/BasicCommandSender.java +++ b/src/com/massivecraft/massivecore/sender/BasicCommandSender.java @@ -7,7 +7,7 @@ import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.permissions.PermissibleBase; -public class BasicCommandSender extends PermissibleBase implements CommandSender +public abstract class BasicCommandSender extends PermissibleBase implements CommandSender { public final String name; @@ -32,19 +32,13 @@ public class BasicCommandSender extends PermissibleBase implements CommandSender { return this.name; } - + @Override public Server getServer() { return Bukkit.getServer(); } - @Override - public void sendMessage(String message) - { - // Nothing per default - } - @Override public void sendMessage(String[] messages) { diff --git a/src/com/massivecraft/massivecore/util/RecipeUtil.java b/src/com/massivecraft/massivecore/util/RecipeUtil.java index 99e5c510..c54e1a63 100644 --- a/src/com/massivecraft/massivecore/util/RecipeUtil.java +++ b/src/com/massivecraft/massivecore/util/RecipeUtil.java @@ -1,16 +1,51 @@ package com.massivecraft.massivecore.util; +import com.massivecraft.massivecore.collections.MassiveList; +import com.massivecraft.massivecore.predicate.Predicate; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Recipe; import org.bukkit.inventory.ShapelessRecipe; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + // NOTE: This utility targets 1.9 and will crash on older servers. public class RecipeUtil -{ +{ + // ------------------------------------------- // + // REMOVE + // -------------------------------------------- // + + public static void remove(Predicate removePredicate) + { + Objects.requireNonNull(removePredicate); + + List recipesToRemove = new MassiveList<>(); + List recipesToKeep = new MassiveList<>(); + + Iterator iterator = Bukkit.recipeIterator(); + while (iterator.hasNext()) + { + Recipe recipe = iterator.next(); + List recipes = removePredicate.apply(recipe) ? recipesToRemove : recipesToKeep; + recipes.add(recipe); + } + + if (recipesToRemove.isEmpty()) return; + + Bukkit.clearRecipes(); + for (Recipe recipe : recipesToKeep) { + Bukkit.addRecipe(recipe); + } + } + // ------------------------------------------- // // POTION // -------------------------------------------- //