67 lines
3.6 KiB
Java
67 lines
3.6 KiB
Java
package me.skymc.taboolib.display;
|
|
|
|
import me.skymc.taboolib.nms.NMSUtils;
|
|
import org.bukkit.entity.Player;
|
|
|
|
import java.lang.reflect.Constructor;
|
|
|
|
/**
|
|
* @author Bkm016
|
|
* @since 2018-04-26
|
|
*/
|
|
public class TitleUtils {
|
|
|
|
private static Class<?> Packet = NMSUtils.getNMSClass("Packet");
|
|
private static Class<?> PacketPlayOutTitle = NMSUtils.getNMSClass("PacketPlayOutTitle");
|
|
private static Class<?> IChatBaseComponent = NMSUtils.getNMSClass("IChatBaseComponent");
|
|
private static Class<?> EnumTitleAction = PacketPlayOutTitle.getDeclaredClasses()[0];
|
|
|
|
public static void sendTitle(Player p, String title, String subtitle, int fadein, int stay, int fadeout) {
|
|
sendTitle(p, title, fadein, stay, fadeout, subtitle, fadein, stay, fadeout);
|
|
}
|
|
|
|
public static void sendTitle(Player p, String title, int fadeint, int stayt, int fadeoutt, String subtitle, int fadeinst, int stayst, int fadeoutst) {
|
|
if (p == null) {
|
|
return;
|
|
}
|
|
try {
|
|
if (title != null) {
|
|
Object times = EnumTitleAction.getField("TIMES").get(null);
|
|
Object chatTitle = IChatBaseComponent.getDeclaredClasses()[0].getMethod("a", String.class).invoke(null, "{\"text\":\"" + title + "\"}");
|
|
Constructor<?> subtitleConstructor = PacketPlayOutTitle.getConstructor(EnumTitleAction, IChatBaseComponent, Integer.TYPE, Integer.TYPE, Integer.TYPE);
|
|
Object titlePacket = subtitleConstructor.newInstance(times, chatTitle, fadeint, stayt, fadeoutt);
|
|
sendPacket(p, titlePacket);
|
|
|
|
times = EnumTitleAction.getField("TITLE").get(null);
|
|
chatTitle = IChatBaseComponent.getDeclaredClasses()[0].getMethod("a", String.class).invoke(null, "{\"text\":\"" + title + "\"}");
|
|
subtitleConstructor = PacketPlayOutTitle.getConstructor(EnumTitleAction, IChatBaseComponent);
|
|
titlePacket = subtitleConstructor.newInstance(times, chatTitle);
|
|
sendPacket(p, titlePacket);
|
|
}
|
|
if (subtitle != null) {
|
|
Object times = EnumTitleAction.getField("TIMES").get(null);
|
|
Object chatSubtitle = IChatBaseComponent.getDeclaredClasses()[0].getMethod("a", String.class).invoke(null, "{\"text\":\"" + title + "\"}");
|
|
Constructor<?> subtitleConstructor = PacketPlayOutTitle.getConstructor(EnumTitleAction, IChatBaseComponent, Integer.TYPE, Integer.TYPE, Integer.TYPE);
|
|
Object subtitlePacket = subtitleConstructor.newInstance(times, chatSubtitle, fadeinst, stayst, fadeoutst);
|
|
sendPacket(p, subtitlePacket);
|
|
|
|
times = EnumTitleAction.getField("SUBTITLE").get(null);
|
|
chatSubtitle = IChatBaseComponent.getDeclaredClasses()[0].getMethod("a", String.class).invoke(null, "{\"text\":\"" + subtitle + "\"}");
|
|
subtitleConstructor = PacketPlayOutTitle.getConstructor(EnumTitleAction, IChatBaseComponent, Integer.TYPE, Integer.TYPE, Integer.TYPE);
|
|
subtitlePacket = subtitleConstructor.newInstance(times, chatSubtitle, fadeinst, stayst, fadeoutst);
|
|
sendPacket(p, subtitlePacket);
|
|
}
|
|
} catch (Exception ignored) {
|
|
}
|
|
}
|
|
|
|
private static void sendPacket(Player player, Object packet) {
|
|
try {
|
|
Object handle = player.getClass().getDeclaredMethod("getHandle").invoke(player);
|
|
Object playerConnection = handle.getClass().getDeclaredField("playerConnection").get(handle);
|
|
playerConnection.getClass().getDeclaredMethod("sendPacket", Packet).invoke(playerConnection, packet);
|
|
} catch (Exception ignored) {
|
|
}
|
|
}
|
|
}
|