Make NMSHook class prettier

This commit is contained in:
Jakub Kolář 2016-06-13 00:19:00 +02:00
parent f38f62a2c9
commit 0b6b6cd637
2 changed files with 49 additions and 31 deletions

View File

@ -29,7 +29,11 @@ public class NMS {
return new NMSSetupResponse(null, false);
}
hook = new NMSHook();
try {
hook = new NMSHook();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return new NMSSetupResponse(version, true);

View File

@ -2,6 +2,7 @@ package nms;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -14,27 +15,26 @@ import org.bukkit.entity.Player;
public class NMSHook
implements INMSHook {
private String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
private Class<?> chatSerializer = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent$ChatSerializer");
private Class<?> chatComponent = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent");
private Class<?> packet = Class.forName("net.minecraft.server." + version + ".PacketPlayOutChat");
public NMSHook() throws ClassNotFoundException {
}
public void sendJSON(String json, Player player) {
try {
String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player);
Object connection = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
Class<?> chatSerializer = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent$ChatSerializer");
Class<?> chatComponent = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent");
Class<?> packet = Class.forName("net.minecraft.server." + version + ".PacketPlayOutChat");
Object nmsPlayer = getNmsPlayer(player);
Object connection = getConnection(nmsPlayer);
Constructor constructor = packet.getConstructor(chatComponent);
Object text = chatSerializer.getMethod("a", String.class).invoke(chatSerializer, json);
Object text = getText(json);
Object packetFinal = constructor.newInstance(text);
Field field = packetFinal.getClass().getDeclaredField("a");
field.setAccessible(true);
field.set(packetFinal, text);
connection
.getClass()
.getMethod("sendPacket", Class.forName("net.minecraft.server." + version + ".Packet"))
.invoke(connection, packetFinal);
sendPacket(packetFinal, text, connection);
} catch (Exception ex) {
ex.printStackTrace();
}
@ -42,27 +42,41 @@ public class NMSHook
public void sendActionBar(String json, Player player) {
try {
String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player);
Object connection = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
Class<?> chatSerializer = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent$ChatSerializer");
Class<?> chatComponent = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent");
Class<?> packet = Class.forName("net.minecraft.server." + version + ".PacketPlayOutChat");
Object nmsPlayer = getNmsPlayer(player);
Object connection = getConnection(nmsPlayer);
Constructor constructor = packet.getConstructor(chatComponent, byte.class);
Object text = chatSerializer.getMethod("a", String.class).invoke(chatSerializer, json);
Object text = getText(json);
Object packetFinal = constructor.newInstance(text, (byte) 2);
Field field = packetFinal.getClass().getDeclaredField("a");
field.setAccessible(true);
field.set(packetFinal, text);
connection
.getClass()
.getMethod("sendPacket", Class.forName("net.minecraft.server." + version + ".Packet"))
.invoke(connection, packetFinal);
sendPacket(packetFinal, text, connection);
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void sendPacket(Object packetFinal, Object text, Object connection) throws IllegalAccessException, NoSuchFieldException,
ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
Field field = packetFinal.getClass().getDeclaredField("a");
field.setAccessible(true);
field.set(packetFinal, text);
connection
.getClass()
.getMethod("sendPacket", Class.forName("net.minecraft.server." + version + ".Packet"))
.invoke(connection, packetFinal);
}
private Object getNmsPlayer(Player player) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
return player.getClass().getMethod("getHandle").invoke(player);
}
private Object getConnection(Object nmsPlayer) throws NoSuchFieldException, IllegalAccessException {
return nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
}
private Object getText(String json) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
return chatSerializer.getMethod("a", String.class).invoke(chatSerializer, json);
}
}