added spigot side and action bar

This commit is contained in:
ajgeiss0702
2020-05-12 09:13:56 -07:00
parent 77b5d3e507
commit 6634e1dbc9
10 changed files with 212 additions and 11 deletions
@@ -0,0 +1,44 @@
package us.ajg0702.queue.spigot;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.messaging.PluginMessageListener;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import us.ajg0702.queue.spigot.utils.VersionSupport;
public class Main extends JavaPlugin implements PluginMessageListener {
public void onEnable() {
getServer().getMessenger().registerIncomingPluginChannel(this, "ajqueue:tospigot", this);
getLogger().info("Spigot side enabled! v"+getDescription().getVersion());
}
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
if (!channel.equals("ajqueue:tospigot")) return;
ByteArrayDataInput in = ByteStreams.newDataInput(message);
String subchannel = in.readUTF();
if(subchannel.equals("actionbar")) {
String data = in.readUTF();
VersionSupport.sendActionBar(player, data.split(";time=")[0]);
int time = Integer.parseInt(data.split(";time=")[1]);
if(time > 2) {
Bukkit.getScheduler().runTaskLater(this, new Runnable() {
public void run() {
VersionSupport.sendActionBar(player, data.split(";time=")[0]);
}
}, 2*20);
if(time > 4) {
Bukkit.getScheduler().runTaskLater(this, new Runnable() {
public void run() {
VersionSupport.sendActionBar(player, data.split(";time=")[0]);
}
}, 4*20);
}
}
}
}
}
@@ -0,0 +1,71 @@
package us.ajg0702.queue.spigot.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
/**
* A cross-version actionbar class
* @author Based on ActionBarAPI from https://github.com/ConnorLinfoot
*
*/
public class ActionBar {
private static String version;
private static boolean old;
public static void send(Player player, String message) {
if(player == null) return;
if(!player.isOnline()) return;
version = Bukkit.getServer().getClass().getPackage().getName();
version = version.substring(version.lastIndexOf(".") + 1);
old = version.equalsIgnoreCase("v1_8_R1") || version.startsWith("v1_7_");
try {
Class<?> craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + version + ".entity.CraftPlayer");
Object craftPlayer = craftPlayerClass.cast(player);
Object packet;
Class<?> packetPlayOutChatClass = Class.forName("net.minecraft.server." + version + ".PacketPlayOutChat");
Class<?> packetClass = Class.forName("net.minecraft.server." + version + ".Packet");
if (old) {
Class<?> chatSerializerClass = Class.forName("net.minecraft.server." + version + ".ChatSerializer");
Class<?> iChatBaseComponentClass = Class.forName("net.minecraft.server." + version + ".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." + version + ".ChatComponentText");
Class<?> iChatBaseComponentClass = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent");
try {
Class<?> chatMessageTypeClass = Class.forName("net.minecraft.server." + version + ".ChatMessageType");
Object[] chatMessageTypes = chatMessageTypeClass.getEnumConstants();
Object chatMessageType = null;
for (Object o : chatMessageTypes) {
if (o.toString().equals("GAME_INFO")) {
chatMessageType = o;
}
}
Object chatCompontentText = chatComponentTextClass.getConstructor(new Class<?>[]{String.class}).newInstance(message);
packet = packetPlayOutChatClass.getConstructor(new Class<?>[]{iChatBaseComponentClass, chatMessageTypeClass}).newInstance(chatCompontentText, chatMessageType);
} catch (ClassNotFoundException e) {
Object chatCompontentText = chatComponentTextClass.getConstructor(new Class<?>[]{String.class}).newInstance(message);
packet = packetPlayOutChatClass.getConstructor(new Class<?>[]{iChatBaseComponentClass, byte.class}).newInstance(chatCompontentText, (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);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,32 @@
package us.ajg0702.queue.spigot.utils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
public class VersionSupport {
public static String getVersion() {
return Bukkit.getVersion().split("\\(MC: ")[1].split("\\)")[0];
}
public static int getMinorVersion() {
return Integer.parseInt(getVersion().split("\\.")[1]);
}
/**
* Send the player an actionbar message
* @param ply The {@link org.bukkit.entity.Player Player} to send the actionbar to
* @param message The message to send in the actionbar.
*/
public static void sendActionBar(Player ply, String message) {
// Use spigot version if available, otherwise use packets.
if(getMinorVersion() >= 11) {
ply.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(message));
} else if(getMinorVersion() >= 8) {
ActionBar.send(ply, message);
}
}
}