added spigot side and action bar
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user