Use Reflection to handle NMS

This commit is contained in:
Jakub Kolář 2016-06-13 00:03:31 +02:00
parent b75ae6d05e
commit 5bf87e50a5
22 changed files with 77 additions and 464 deletions

View File

@ -13,48 +13,6 @@
<artifactId>jar</artifactId>
<dependencies>
<dependency>
<groupId>cz.boosik</groupId>
<artifactId>NMS</artifactId>
<version>${boosCooldowns.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cz.boosik</groupId>
<artifactId>NMS_hook_1_8_R3</artifactId>
<version>${boosCooldowns.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cz.boosik</groupId>
<artifactId>NMS_hook_1_8_R1</artifactId>
<version>${boosCooldowns.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cz.boosik</groupId>
<artifactId>NMS_hook_1_8_R2</artifactId>
<version>${boosCooldowns.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cz.boosik</groupId>
<artifactId>NMS_hook_1_9_R1</artifactId>
<version>${boosCooldowns.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cz.boosik</groupId>
<artifactId>NMS_hook_1_9_R2</artifactId>
<version>${boosCooldowns.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cz.boosik</groupId>
<artifactId>NMS_hook_1_10_R1</artifactId>
<version>${boosCooldowns.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cz.boosik</groupId>
<artifactId>plugin</artifactId>

View File

@ -1,28 +0,0 @@
package nms;
import org.bukkit.entity.Player;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public interface NMSHook {
/**
* Sends a JSON message to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendJSON(String json, Player player);
/**
* Sends an actionbar to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendActionBar(String json, Player player);
}

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>boosCooldowns</artifactId>
<groupId>cz.boosik</groupId>
<version>${boosCooldowns.version}</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>NMS_hook_1_10_R1</artifactId>
<dependencies>
<!--Spigot API-->
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.10-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,28 +0,0 @@
package nms;
import org.bukkit.entity.Player;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public interface NMSHook {
/**
* Sends a JSON message to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendJSON(String json, Player player);
/**
* Sends an actionbar to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendActionBar(String json, Player player);
}

View File

@ -1,29 +0,0 @@
package nms;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import net.minecraft.server.v1_10_R1.IChatBaseComponent.ChatSerializer;
import net.minecraft.server.v1_10_R1.PacketPlayOutChat;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public class NMSHook_v1_10_R1
implements NMSHook {
public void sendJSON(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json)));
}
public void sendActionBar(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json), (byte) 2));
}
}

View File

@ -1,28 +0,0 @@
package nms;
import org.bukkit.entity.Player;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public interface NMSHook {
/**
* Sends a JSON message to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendJSON(String json, Player player);
/**
* Sends an actionbar to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendActionBar(String json, Player player);
}

View File

@ -1,25 +0,0 @@
package nms;
import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import net.minecraft.server.v1_8_R1.ChatSerializer;
import net.minecraft.server.v1_8_R1.PacketPlayOutChat;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public class NMSHook_v1_8_R1
implements NMSHook {
public void sendJSON(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json)));
}
public void sendActionBar(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json), (byte) 2));
}
}

View File

@ -1,28 +0,0 @@
package nms;
import org.bukkit.entity.Player;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public interface NMSHook {
/**
* Sends a JSON message to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendJSON(String json, Player player);
/**
* Sends an actionbar to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendActionBar(String json, Player player);
}

View File

@ -1,25 +0,0 @@
package nms;
import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer;
import org.bukkit.entity.Player;
import net.minecraft.server.v1_8_R2.IChatBaseComponent.ChatSerializer;
import net.minecraft.server.v1_8_R2.PacketPlayOutChat;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public class NMSHook_v1_8_R2
implements NMSHook {
public void sendJSON(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json)));
}
public void sendActionBar(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json), (byte) 2));
}
}

View File

@ -1,28 +0,0 @@
package nms;
import org.bukkit.entity.Player;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public interface NMSHook {
/**
* Sends a JSON message to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendJSON(String json, Player player);
/**
* Sends an actionbar to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendActionBar(String json, Player player);
}

View File

@ -1,25 +0,0 @@
package nms;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;
import net.minecraft.server.v1_8_R3.IChatBaseComponent.ChatSerializer;
import net.minecraft.server.v1_8_R3.PacketPlayOutChat;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public class NMSHook_v1_8_R3
implements NMSHook {
public void sendJSON(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json)));
}
public void sendActionBar(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json), (byte) 2));
}
}

View File

@ -1,28 +0,0 @@
package nms;
import org.bukkit.entity.Player;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public interface NMSHook {
/**
* Sends a JSON message to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendJSON(String json, Player player);
/**
* Sends an actionbar to a player.
*
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendActionBar(String json, Player player);
}

View File

@ -1,29 +0,0 @@
package nms;
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import net.minecraft.server.v1_9_R1.IChatBaseComponent.ChatSerializer;
import net.minecraft.server.v1_9_R1.PacketPlayOutChat;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public class NMSHook_v1_9_R1
implements NMSHook {
public void sendJSON(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json)));
}
public void sendActionBar(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json), (byte) 2));
}
}

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>boosCooldowns</artifactId>
<groupId>cz.boosik</groupId>
<relativePath>../../pom.xml</relativePath>
<version>${boosCooldowns.version}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>NMS_hook_1_9_R2</artifactId>
<dependencies>
<!--Spigot API-->
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.9.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,29 +0,0 @@
package nms;
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
import org.bukkit.entity.Player;
import net.minecraft.server.v1_9_R2.IChatBaseComponent.ChatSerializer;
import net.minecraft.server.v1_9_R2.PacketPlayOutChat;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public class NMSHook_v1_9_R2
implements NMSHook {
public void sendJSON(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json)));
}
public void sendActionBar(String json, Player player) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutChat(ChatSerializer.a(json), (byte) 2));
}
}

View File

@ -20,12 +20,6 @@
<version>${minecraft.version}-${bukkit.version}-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>${minecraft.version}-${bukkit.version}-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!--Bukkit API-->
<dependency>
<groupId>org.bukkit</groupId>
@ -38,12 +32,6 @@
<artifactId>Vault</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>cz.boosik</groupId>
<artifactId>NMS</artifactId>
<version>3.11.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>plugin</finalName>

View File

@ -7,7 +7,7 @@ import org.bukkit.entity.Player;
*
* @author ColoredCarrot
*/
public interface NMSHook {
public interface INMSHook {
/**
* Sends a JSON message to a player.
@ -15,7 +15,7 @@ public interface NMSHook {
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendJSON(String json, Player player);
void sendJSON(String json, Player player);
/**
* Sends an actionbar to a player.
@ -23,6 +23,6 @@ public interface NMSHook {
* @param json (String) - the plain JSON
* @param player (Player) - the player
*/
public void sendActionBar(String json, Player player);
void sendActionBar(String json, Player player);
}

View File

@ -9,9 +9,9 @@ import org.bukkit.plugin.Plugin;
*/
public class NMS {
private static NMSHook hook;
private static INMSHook hook;
private static String version;
private static boolean compatible = false;
private static boolean compatible = true;
/**
* Gets the server version and adjusts this API accordingly.
@ -29,33 +29,19 @@ public class NMS {
return new NMSSetupResponse(null, false);
}
if (version.equals("v1_9_R1")) {
hook = new NMSHook_v1_9_R1();
} else if (version.equals("v1_9_R2")) {
hook = new NMSHook_v1_9_R2();
} else if (version.equals("v1_8_R3")) {
hook = new NMSHook_v1_8_R3();
} else if (version.equals("v1_8_R2")) {
hook = new NMSHook_v1_8_R2();
} else if (version.equals("v1_8_R1")) {
hook = new NMSHook_v1_8_R1();
} else if (version.equals("v1_10_R1")) {
hook = new NMSHook_v1_10_R1();
}
hook = new NMSHook();
compatible = hook != null;
return new NMSSetupResponse(version, compatible);
return new NMSSetupResponse(version, true);
}
/**
* Gets the NMS hook, if NMS is hooked.
*
* @return (NMSHook) - the NMSHook.
* @return (INMSHook) - the INMSHook.
* @throws NMSNotHookedException if NMS is not hooked (by using {@link #setup(Plugin)})
*/
public static NMSHook getHook()
public static INMSHook getHook()
throws NMSNotHookedException {
if (!compatible) {

View File

@ -0,0 +1,68 @@
package nms;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
/**
* All rights reserved.
*
* @author ColoredCarrot
*/
public class NMSHook
implements INMSHook {
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");
Constructor constructor = packet.getConstructor(chatComponent);
Object text = chatSerializer.getMethod("a", String.class).invoke(chatSerializer, 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);
} catch (Exception ex) {
ex.printStackTrace();
}
}
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");
Constructor constructor = packet.getConstructor(chatComponent, byte.class);
Object text = chatSerializer.getMethod("a", String.class).invoke(chatSerializer, 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);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

View File

@ -5,13 +5,6 @@
<artifactId>boosCooldowns</artifactId>
<version>${boosCooldowns.version}</version>
<modules>
<module>nms/NMS_hook_1_8_R1</module>
<module>nms/NMS_hook_1_8_R2</module>
<module>nms/NMS_hook_1_8_R3</module>
<module>nms/NMS_hook_1_9_R1</module>
<module>nms/NMS_hook_1_9_R2</module>
<module>nms/NMS_hook_1_10_R1</module>
<module>nms/NMS</module>
<module>plugin</module>
<module>jar</module>
</modules>