Core/src/main/java/eu/univento/core/api/gui/SignInputHandler.java

67 lines
2.3 KiB
Java

package eu.univento.core.api.gui;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import net.minecraft.server.v1_9_R1.NetworkManager;
import net.minecraft.server.v1_9_R1.Packet;
import net.minecraft.server.v1_9_R1.PacketPlayInUpdateSign;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import java.lang.reflect.Field;
import java.util.List;
/**
* @author joethei
* @version 0.1
*/
public class SignInputHandler {
private static Field channelField;
static{
for(Field filed : NetworkManager.class.getDeclaredFields()) {
if(channelField.getType().isAssignableFrom(Channel.class)) {
channelField = filed;
break;
}
}
}
public static void injectNetty(final Player player) {
try {
Channel channel = (Channel) channelField.get(((CraftPlayer) player).getHandle().playerConnection.networkManager);
if (channel != null) {
channel.pipeline().addAfter("decoder", "update_sign", new MessageToMessageDecoder<Packet>() {
@Override
protected void decode(ChannelHandlerContext chc, Packet packet, List<Object> out) throws Exception {
if (packet instanceof PacketPlayInUpdateSign) {
PacketPlayInUpdateSign usePacket = (PacketPlayInUpdateSign) packet;
Bukkit.getPluginManager().callEvent(new PlayerSignInputEvent(player, usePacket.b()));
}
out.add(packet);
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void ejectNetty(Player player) {
try {
Channel channel = (Channel) channelField.get(((CraftPlayer) player).getHandle().playerConnection.networkManager);
if (channel != null) {
if (channel.pipeline().get("update_sign") != null) {
channel.pipeline().remove("update_sign");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}