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;
}
}
}