package de.oppermann.bastian.spleef.util; import de.oppermann.bastian.spleef.SpleefMain; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.lang.reflect.Constructor; import java.util.logging.Level; /* * Code by https://www.spigotmc.org/threads/send-titles-to-players-using-spigot-1-8-1-10-2.48819/ * (with some small modifications) */ public class TitleManager { private static boolean nmsFailed = false; /** * Sends a title to player * * @param player Player to send the title to. * @param text The text displayed in the title. * @param subtitle Whether the title should be a subtitle or a normal title. * @return Whether the sending failed or succeed. */ public static boolean sendTitle(Player player, String text, boolean subtitle) { if (nmsFailed) { return false; } try { Object chatTitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", String.class).invoke(null, "{\"text\": \"" + text + "\"}"); Constructor<?> titleConstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), int.class, int.class, int.class); Object packet = titleConstructor.newInstance(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField(subtitle ? "SUBTITLE" : "TITLE").get(null), chatTitle, 5, 20, 5); sendPacket(player, packet); return true; } catch (Exception e) { // incompatible version SpleefMain.getInstance().log(Level.SEVERE, "Could not access NMS classes. Please use a plugin version which is compatible with your server version for full functionality."); e.printStackTrace(); nmsFailed = true; return false; } } private static void sendPacket(Player player, Object packet) throws Exception { try { Object handle = player.getClass().getMethod("getHandle").invoke(player); Object playerConnection = handle.getClass().getField("playerConnection").get(handle); playerConnection.getClass().getMethod("sendPacket", getNMSClass("Packet")).invoke(playerConnection, packet); } catch (Exception e) { throw e; } } private static Class<?> getNMSClass(String name) throws Exception { try { return Class.forName("net.minecraft.server" + Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3] + "." + name); } catch (ClassNotFoundException e) { throw e; } } }