2016-08-03 00:47:26 +02:00
|
|
|
package com.sekwah.advancedportals.compat;
|
|
|
|
|
2016-08-03 05:30:59 +02:00
|
|
|
import com.sekwah.advancedportals.AdvancedPortalsPlugin;
|
2018-08-29 01:26:23 +02:00
|
|
|
import org.bukkit.block.Block;
|
2016-08-03 00:47:26 +02:00
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
|
2016-08-03 05:30:59 +02:00
|
|
|
import java.lang.reflect.Constructor;
|
2016-08-03 00:47:26 +02:00
|
|
|
import java.lang.reflect.Field;
|
2016-08-03 05:30:59 +02:00
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
import java.lang.reflect.Method;
|
2016-08-03 00:47:26 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Created by on 02/08/2016.
|
|
|
|
*
|
|
|
|
* I don't think there will be any others supported other than bukkit but if there are its not just the compat that will
|
2016-11-20 06:37:41 +01:00
|
|
|
* need to change unless it has a different package for the minecraft server parts
|
2016-08-03 00:47:26 +02:00
|
|
|
*
|
2016-11-21 09:50:26 +01:00
|
|
|
* @author sekwah41 maxqia
|
2016-08-03 00:47:26 +02:00
|
|
|
*/
|
|
|
|
public class CraftBukkit {
|
|
|
|
|
2016-08-03 05:30:59 +02:00
|
|
|
private final AdvancedPortalsPlugin plugin;
|
2018-04-07 04:30:55 +02:00
|
|
|
private Constructor<?> reallyOldChatConstructor;
|
2017-05-19 07:09:57 +02:00
|
|
|
|
|
|
|
private Method chatMessageTypeMethod;
|
|
|
|
|
2016-11-21 09:50:26 +01:00
|
|
|
private Method serializeMessage;
|
|
|
|
private Constructor<?> chatPacketConstructor;
|
2016-08-03 05:30:59 +02:00
|
|
|
|
2016-11-21 09:50:26 +01:00
|
|
|
private Method playerGetHandle;
|
|
|
|
private Field playerConnection;
|
|
|
|
private Method sendPacket;
|
2016-08-03 05:30:59 +02:00
|
|
|
|
2017-05-25 12:16:18 +02:00
|
|
|
private boolean useEnumType = false;
|
2017-05-19 07:09:57 +02:00
|
|
|
|
2018-08-29 01:26:23 +02:00
|
|
|
// Data for beacon
|
|
|
|
private Class<?> endGatewayClass;
|
|
|
|
private Class<?> tileEntityEndGatewayClass;
|
|
|
|
private Constructor<?> blockPositionConstructor;
|
|
|
|
private Method getWorldHandleMethod;
|
|
|
|
private Method getTileEntityMethod;
|
|
|
|
|
2016-08-03 05:30:59 +02:00
|
|
|
|
|
|
|
// Classes so it doesnt keep fetching them.
|
|
|
|
|
2016-11-21 09:50:26 +01:00
|
|
|
public CraftBukkit(AdvancedPortalsPlugin plugin, String bukkitImpl) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
|
2016-08-03 05:30:59 +02:00
|
|
|
|
|
|
|
this.plugin = plugin;
|
2016-08-03 00:47:26 +02:00
|
|
|
|
2016-11-21 09:50:26 +01:00
|
|
|
try {
|
|
|
|
String craftBukkitPackage = "org.bukkit.craftbukkit." + bukkitImpl + ".";
|
|
|
|
String minecraftPackage = "net.minecraft.server." + bukkitImpl + ".";
|
|
|
|
|
2018-04-07 04:30:55 +02:00
|
|
|
this.plugin.getLogger().info("Bukkit version detected " + bukkitImpl);
|
|
|
|
|
2016-11-21 09:50:26 +01:00
|
|
|
Class<?> chatBaseComponent = Class.forName(minecraftPackage + "IChatBaseComponent"); // string to packet methods
|
2017-05-13 19:19:08 +02:00
|
|
|
Class<?> chatSerialClass = this.findClass(chatBaseComponent, "ChatSerializer");
|
|
|
|
|
2017-05-19 07:12:32 +02:00
|
|
|
try{
|
|
|
|
Class<?> chatMessageTypeClass = Class.forName(minecraftPackage + "ChatMessageType");
|
2017-05-19 07:09:57 +02:00
|
|
|
|
|
|
|
this.chatMessageTypeMethod = chatMessageTypeClass.getMethod("a", byte.class);
|
|
|
|
|
|
|
|
this.chatPacketConstructor = Class.forName(minecraftPackage + "PacketPlayOutChat").getConstructor(chatBaseComponent, chatMessageTypeClass);
|
2017-05-25 12:16:18 +02:00
|
|
|
|
2017-05-21 04:35:29 +02:00
|
|
|
useEnumType = true;
|
2017-05-19 07:09:57 +02:00
|
|
|
}
|
2017-05-19 07:12:32 +02:00
|
|
|
catch(ClassNotFoundException e) {
|
|
|
|
plugin.getLogger().info("Old version detected, changing chat method");
|
2017-05-19 07:09:57 +02:00
|
|
|
this.chatPacketConstructor = Class.forName(minecraftPackage + "PacketPlayOutChat").getConstructor(chatBaseComponent, byte.class);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(chatSerialClass != null){
|
|
|
|
this.serializeMessage = chatSerialClass.getMethod("a", String.class);
|
2017-05-13 19:19:08 +02:00
|
|
|
}
|
|
|
|
else{
|
2018-04-07 04:30:55 +02:00
|
|
|
plugin.getLogger().info("Attempting support for 1.8");
|
|
|
|
try {
|
|
|
|
this.reallyOldChatConstructor = Class.forName(minecraftPackage + "ChatMessage").getConstructor(String.class, Object[].class);
|
|
|
|
}
|
|
|
|
catch (ClassNotFoundException e) {
|
|
|
|
plugin.getLogger().info("Fallback (I forget what version uses this but it was here for a reason)");
|
|
|
|
this.serializeMessage = chatBaseComponent.getMethod("a", String.class);
|
|
|
|
}
|
2017-05-13 19:19:08 +02:00
|
|
|
}
|
|
|
|
|
2016-11-21 09:50:26 +01:00
|
|
|
this.playerGetHandle = Class.forName(craftBukkitPackage + "entity.CraftPlayer").getMethod("getHandle");
|
|
|
|
this.playerConnection = Class.forName(minecraftPackage + "EntityPlayer").getField("playerConnection"); // get player connection
|
|
|
|
Class<?> packet = Class.forName(minecraftPackage + "Packet");
|
|
|
|
this.sendPacket = playerConnection.getType().getMethod("sendPacket", packet);
|
2018-08-29 01:26:23 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Data for beacon
|
|
|
|
this.endGatewayClass = Class.forName(craftBukkitPackage + "block.CraftEndGateway");
|
|
|
|
this.tileEntityEndGatewayClass = Class.forName(minecraftPackage + "TileEntityEndGateway");
|
|
|
|
|
|
|
|
Class<?> blockPos = Class.forName(minecraftPackage + "BlockPosition");
|
|
|
|
|
|
|
|
this.blockPositionConstructor = blockPos.getConstructor(int.class, int.class, int.class);
|
|
|
|
|
|
|
|
getWorldHandleMethod = Class.forName(craftBukkitPackage + "CraftWorld").getMethod("getHandle");
|
|
|
|
|
|
|
|
getTileEntityMethod = Class.forName(minecraftPackage + "WorldServer").getMethod("getTileEntity", blockPos);
|
2016-11-21 09:50:26 +01:00
|
|
|
} catch (Exception e) {
|
2017-05-13 19:19:08 +02:00
|
|
|
e.printStackTrace();
|
|
|
|
plugin.getLogger().warning("Attempting to use backup porekit locations");
|
2016-11-21 09:50:26 +01:00
|
|
|
// Fall back on your Porekit
|
|
|
|
Class<?> textBaseComponent = Class.forName("net.minecraft.util.text.ITextComponent"); // string to packet methods
|
|
|
|
this.serializeMessage = this.findClass(textBaseComponent, "Serializer").getMethod("func_150699_a", String.class); // md: jsonToComponent
|
|
|
|
this.chatPacketConstructor = Class.forName("net.minecraft.network.play.server.SPacketChat").getConstructor(textBaseComponent, byte.class);
|
|
|
|
|
|
|
|
this.playerGetHandle = Class.forName("blue.lapis.pore.impl.entity.PorePlayer").getMethod("getHandle");
|
|
|
|
this.playerConnection = Class.forName("net.minecraft.entity.player.EntityPlayerMP").getField("field_71135_a"); // get player connection fd: connection
|
|
|
|
Class<?> packet = Class.forName("net.minecraft.network.Packet");
|
|
|
|
this.sendPacket = playerConnection.getType().getMethod("func_147359_a", packet); //md: sendPacket
|
|
|
|
}
|
2016-08-03 00:47:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void sendRawMessage(String rawMessage, Player player) {
|
2016-08-03 05:30:59 +02:00
|
|
|
this.sendMessage(rawMessage,player, (byte) 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void sendActionBarMessage(String rawMessage, Player player) {
|
|
|
|
this.sendMessage(rawMessage,player, (byte) 2);
|
|
|
|
}
|
2016-08-03 00:47:26 +02:00
|
|
|
|
2016-08-03 05:30:59 +02:00
|
|
|
public void sendMessage(String rawMessage, Player player, byte msgType) {
|
2016-08-03 00:47:26 +02:00
|
|
|
try {
|
2018-04-07 04:30:55 +02:00
|
|
|
Object comp;
|
|
|
|
if(this.reallyOldChatConstructor != null) {
|
|
|
|
comp = this.reallyOldChatConstructor.newInstance(rawMessage,new Object[]{});
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
comp = this.serializeMessage.invoke(null,"{\"text\":\"" + rawMessage + "\"}");
|
|
|
|
}
|
2017-05-19 07:09:57 +02:00
|
|
|
Object packet;
|
2018-04-07 04:30:55 +02:00
|
|
|
if(this.useEnumType){
|
2017-05-19 07:09:57 +02:00
|
|
|
packet = this.chatPacketConstructor.newInstance(comp, this.chatMessageTypeMethod.invoke(null,msgType)); // convert bytes into packet
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
packet = this.chatPacketConstructor.newInstance(comp, msgType); // convert bytes into packet
|
|
|
|
}
|
2016-08-03 05:30:59 +02:00
|
|
|
|
2016-11-21 09:50:26 +01:00
|
|
|
Object handle = this.playerGetHandle.invoke(player);
|
|
|
|
Object playerConnection = this.playerConnection.get(handle); // get players connection
|
|
|
|
sendPacket.invoke(playerConnection, packet); // send packet
|
|
|
|
} catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
|
2016-08-03 05:30:59 +02:00
|
|
|
this.plugin.getLogger().warning("Error creating raw message, something must be wrong with reflection");
|
2016-08-03 00:47:26 +02:00
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*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) 1);
|
|
|
|
((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);*/
|
|
|
|
}
|
|
|
|
|
2016-08-03 05:30:59 +02:00
|
|
|
|
|
|
|
public Class<?> findClass(Class<?> classObj, String className){
|
|
|
|
for(Class<?> classes : classObj.getDeclaredClasses()){
|
|
|
|
if(classes.getSimpleName().equals(className)){
|
|
|
|
return classes;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
2016-08-03 00:47:26 +02:00
|
|
|
}
|
|
|
|
|
2018-08-29 01:26:23 +02:00
|
|
|
public void setGatewayAgeHigh(Block block) {
|
|
|
|
if(block.getState().getClass().isAssignableFrom(this.endGatewayClass)) {
|
|
|
|
try {
|
|
|
|
Object tileEntity = this.getTileEntityMethod.invoke(this.getWorldHandleMethod.invoke(block.getWorld()),
|
|
|
|
this.blockPositionConstructor.newInstance(block.getX(), block.getY(), block.getZ()));
|
|
|
|
if(tileEntity.getClass().isAssignableFrom(this.tileEntityEndGatewayClass)) {
|
|
|
|
Field g = tileEntity.getClass().getDeclaredField("g");
|
|
|
|
g.setAccessible(true);
|
|
|
|
g.set(tileEntity, Integer.MAX_VALUE);
|
|
|
|
}
|
|
|
|
} catch (IllegalAccessException| InvocationTargetException | InstantiationException | NoSuchFieldException e) {
|
|
|
|
this.plugin.getLogger().warning("Error setting gateway time");
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-08-03 00:47:26 +02:00
|
|
|
|
|
|
|
}
|