Removed dependency on craftbukkit by using reflection. (Took a while to learn and sort out :P but should be useful for the future anyway so its time well spent :D)

This commit is contained in:
Alastair 2016-08-03 03:30:59 +00:00
parent 6aa354c2eb
commit 22163ba629
3 changed files with 66 additions and 23 deletions

View File

@ -32,11 +32,11 @@
<version>1.10.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<!--<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.10.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependency>-->
</dependencies>
</project>

View File

@ -36,7 +36,7 @@ public class AdvancedPortalsPlugin extends JavaPlugin {
try {
this.compat = new CraftBukkit(version);
this.compat = new CraftBukkit(this, version);
ConfigAccessor portalConfig = new ConfigAccessor(this, "portals.yml");
portalConfig.saveDefaultConfig();
@ -84,7 +84,7 @@ public class AdvancedPortalsPlugin extends JavaPlugin {
this.getLogger().warning("This version of craftbukkit is not yet supported, please notify sekwah and tell him about this version v:" + version);
this.setEnabled(false);
} catch (IllegalArgumentException |
NoSuchFieldException | SecurityException e) {
NoSuchFieldException | SecurityException | NoSuchMethodException e) {
e.printStackTrace();
this.getLogger().warning("Something went wrong, please notify sekwah and tell him about this version v:" + version);
this.getLogger().warning("Along with the above stacktrace");

View File

@ -1,8 +1,12 @@
package com.sekwah.advancedportals.compat;
import com.sekwah.advancedportals.AdvancedPortalsPlugin;
import org.bukkit.entity.Player;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by on 02/08/2016.
@ -14,41 +18,77 @@ import java.lang.reflect.Field;
*/
public class CraftBukkit {
private final String craftBukkitVer;
private final String craftBukkitPackage;
private final String minecraftPackage;
private final AdvancedPortalsPlugin plugin;
private Method chatMessageMethod;
private Class<?> craftPlayer;
private Class<?> chatPacket;
private Class<?> chatBaseComponent;
private Class<?> packet;
// Classes so it doesnt keep fetching them.
private Class<?> chatBaseComponent;
private Class<?> chatSerializer;
public CraftBukkit(String craftBukkitVer) throws ClassNotFoundException, NoSuchFieldException {
this.craftBukkitVer = craftBukkitVer;
this.craftBukkitPackage = "org.bukkit.craftbukkit." + craftBukkitVer;
this.minecraftPackage = "net.minecraft.server." + craftBukkitVer;
public CraftBukkit(AdvancedPortalsPlugin plugin, String craftBukkitVer) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
this.craftBukkitPackage = "org.bukkit.craftbukkit." + craftBukkitVer + ".";
this.minecraftPackage = "net.minecraft.server." + craftBukkitVer + ".";
this.plugin = plugin;
this.setupCompat();
}
private void setupCompat() throws ClassNotFoundException, NoSuchFieldException {
private void setupCompat() throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
this.craftPlayer = Class.forName(craftBukkitPackage + "entity.CraftPlayer");
this.chatBaseComponent = Class.forName(minecraftPackage + "IChatBaseComponent");
Field modfield = chatBaseComponent.getDeclaredField("modifiers");
chatBaseComponent.getDeclaredClasses();
this.chatMessageMethod = this.findClass(chatBaseComponent, "ChatSerializer").getMethod("a", String.class);
this.chatPacket = Class.forName(minecraftPackage + "PacketPlayOutChat");
this.packet = Class.forName(minecraftPackage + "Packet");
}
// Convert to reflection
public void sendRawMessage(String rawMessage, Player player) {
this.sendMessage(rawMessage,player, (byte) 1);
}
public void sendActionBarMessage(String rawMessage, Player player) {
this.sendMessage(rawMessage,player, (byte) 2);
}
public void sendMessage(String rawMessage, Player player, byte msgType) {
try {
Object comp = this.chatMessageMethod.invoke(null,rawMessage);
Class<?> nmsClass = Class.forName(minecraftPackage + "IChatBaseComponent");
Object handle = this.craftPlayer.getMethod("getHandle").invoke(player);
} catch (ClassNotFoundException e) {
Field playerConnectionObj = handle.getClass().getDeclaredField("playerConnection");
Constructor<?> packetConstructor = this.chatPacket.getConstructor(this.chatBaseComponent, byte.class);
Object packet = packetConstructor.newInstance(comp, msgType);
Object playerConnection = playerConnectionObj.get(handle);
playerConnection.getClass().getMethod("sendPacket", this.packet).invoke(playerConnection, packet);
} catch (IllegalAccessException |InvocationTargetException | NoSuchMethodException | NoSuchFieldException
| InstantiationException e) {
this.plugin.getLogger().warning("Error creating raw message, something must be wrong with reflection");
e.printStackTrace();
}
@ -58,11 +98,14 @@ public class CraftBukkit {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);*/
}
public void sendActionBarMessage(String rawMessage, Player player) {
/*IChatBaseComponent comp = IChatBaseComponent.ChatSerializer.a(rawMessage);
// "json message", position(0: chat (chat box), 1: system message (chat box), 2: above action bar)
PacketPlayOutChat packet = new PacketPlayOutChat(comp, (byte) 2);
((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);*/
public Class<?> findClass(Class<?> classObj, String className){
for(Class<?> classes : classObj.getDeclaredClasses()){
if(classes.getSimpleName().equals(className)){
return classes;
}
}
return null;
}