diff --git a/src/main/java/com/connorlinfoot/actionbarapi/ActionBarAPI.java b/src/main/java/com/connorlinfoot/actionbarapi/ActionBarAPI.java index ef3d892..202cada 100644 --- a/src/main/java/com/connorlinfoot/actionbarapi/ActionBarAPI.java +++ b/src/main/java/com/connorlinfoot/actionbarapi/ActionBarAPI.java @@ -10,8 +10,10 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.logging.Level; public class ActionBarAPI extends JavaPlugin implements Listener { @@ -36,10 +38,60 @@ public void onEnable() { useOldMethods = true; } + try { + init(); + } catch (Exception e) { + e.printStackTrace(); + } + console.sendMessage(ChatColor.AQUA + getDescription().getName() + " V" + getDescription().getVersion() + " has been enabled!"); Bukkit.getPluginManager().registerEvents(clUpdate, this); } + + private static Class craftPlayerClass, packetPlayOutChatClass, packetClass, chatSerializerClass, + iChatBaseComponentClass, chatComponentTextClass, chatMessageTypeClass; + private static Method m3; + private static Constructor chatComponentTextConstructor; + //Depending on the version this is the constructor using chatMessageType or byte + private static Constructor packetPlayOutChatConstructor; + private static Method craftPlayerHandleMethod; + private static Field playerConnectionField; + + private static Object chatMessageType = null; + + //Initialize reflections + private static void init() throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException { + craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + nmsver + ".entity.CraftPlayer"); + packetPlayOutChatClass = Class.forName("net.minecraft.server." + nmsver + ".PacketPlayOutChat"); + packetClass = Class.forName("net.minecraft.server." + nmsver + ".Packet"); + + chatSerializerClass = Class.forName("net.minecraft.server." + nmsver + ".ChatSerializer"); + iChatBaseComponentClass = Class.forName("net.minecraft.server." + nmsver + ".IChatBaseComponent"); + m3 = chatSerializerClass.getDeclaredMethod("a", String.class); + + chatComponentTextClass = Class.forName("net.minecraft.server." + nmsver + ".ChatComponentText"); + chatComponentTextConstructor = chatComponentTextClass.getConstructor(new Class[]{String.class}); + + try { + chatMessageTypeClass = Class.forName("net.minecraft.server." + nmsver + ".ChatMessageType"); + Object[] chatMessageTypes = chatMessageTypeClass.getEnumConstants(); + for (Object obj : chatMessageTypes) { + if (obj.toString().equals("GAME_INFO")) { + chatMessageType = obj; + } + } + + packetPlayOutChatConstructor = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, chatMessageTypeClass}); + }catch(ClassNotFoundException e) { + //Fallback + packetPlayOutChatConstructor = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, byte.class}); + } + + craftPlayerHandleMethod = craftPlayerClass.getDeclaredMethod("getHandle"); + playerConnectionField = craftPlayerClass.getDeclaredField("playerConnection"); + } + public static void sendActionBar(Player player, String message) { if (!player.isOnline()) { return; // Player may have logged out @@ -52,39 +104,22 @@ public static void sendActionBar(Player player, String message) { return; try { - Class craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + nmsver + ".entity.CraftPlayer"); Object craftPlayer = craftPlayerClass.cast(player); Object packet; - Class packetPlayOutChatClass = Class.forName("net.minecraft.server." + nmsver + ".PacketPlayOutChat"); - Class packetClass = Class.forName("net.minecraft.server." + nmsver + ".Packet"); + if (useOldMethods) { - Class chatSerializerClass = Class.forName("net.minecraft.server." + nmsver + ".ChatSerializer"); - Class iChatBaseComponentClass = Class.forName("net.minecraft.server." + nmsver + ".IChatBaseComponent"); - Method m3 = chatSerializerClass.getDeclaredMethod("a", String.class); Object cbc = iChatBaseComponentClass.cast(m3.invoke(chatSerializerClass, "{\"text\": \"" + message + "\"}")); packet = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, byte.class}).newInstance(cbc, (byte) 2); } else { - Class chatComponentTextClass = Class.forName("net.minecraft.server." + nmsver + ".ChatComponentText"); - Class iChatBaseComponentClass = Class.forName("net.minecraft.server." + nmsver + ".IChatBaseComponent"); - try { - Class chatMessageTypeClass = Class.forName("net.minecraft.server." + nmsver + ".ChatMessageType"); - Object[] chatMessageTypes = chatMessageTypeClass.getEnumConstants(); - Object chatMessageType = null; - for (Object obj : chatMessageTypes) { - if (obj.toString().equals("GAME_INFO")) { - chatMessageType = obj; - } - } - Object chatCompontentText = chatComponentTextClass.getConstructor(new Class[]{String.class}).newInstance(message); - packet = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, chatMessageTypeClass}).newInstance(chatCompontentText, chatMessageType); - } catch (ClassNotFoundException cnfe) { - Object chatCompontentText = chatComponentTextClass.getConstructor(new Class[]{String.class}).newInstance(message); - packet = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, byte.class}).newInstance(chatCompontentText, (byte) 2); + Object chatComponentText = chatComponentTextConstructor.newInstance(message); + if (chatMessageTypeClass == null) { + packet = packetPlayOutChatConstructor.newInstance(chatComponentText, chatMessageType); + }else{ + packet = packetPlayOutChatConstructor.newInstance(chatComponentText, (byte) 2); } } - Method craftPlayerHandleMethod = craftPlayerClass.getDeclaredMethod("getHandle"); + Object craftPlayerHandle = craftPlayerHandleMethod.invoke(craftPlayer); - Field playerConnectionField = craftPlayerHandle.getClass().getDeclaredField("playerConnection"); Object playerConnection = playerConnectionField.get(craftPlayerHandle); Method sendPacketMethod = playerConnection.getClass().getDeclaredMethod("sendPacket", packetClass); sendPacketMethod.invoke(playerConnection, packet);