- 9
- 1
Всем привет.
У меня есть пару проблем, которые не могу решить.
1) Не могу понять, почему не регистрируется пакет, который отправляется на сервер по нажатию клавиши.
Почему-то ошибка в packetPipeline, но я не могу понять почему.
Сам packetPipeline:
Main class:
2) Так-же не могу понять, почему IThreadListener не может импортироваться под net.minecraft.utils.IThreadListener
И так-же почему proxy - ошибка.
Main:
У меня есть пару проблем, которые не могу решить.
1) Не могу понять, почему не регистрируется пакет, который отправляется на сервер по нажатию клавиши.
Почему-то ошибка в packetPipeline, но я не могу понять почему.
Сам packetPipeline:
Java:
import java.util.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.INetHandler;
import net.minecraft.network.NetHandlerPlayServer;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.network.FMLEmbeddedChannel;
import cpw.mods.fml.common.network.FMLOutboundHandler;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.internal.FMLProxyPacket;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ChannelHandler.Sharable
public class PacketPipeline extends MessageToMessageCodec<FMLProxyPacket, AbstractPacket>{
private EnumMap<Side, FMLEmbeddedChannel> channels;
private LinkedList<Class<? extends AbstractPacket>> packets = new LinkedList<Class<? extends AbstractPacket>>();
private boolean isPostInitialised = false;
public boolean registerPacket(Class<? extends AbstractPacket> clazz) {
if(packets.size() > 256){
return false;
}
if(packets.contains(clazz)){
return false;
}
if(isPostInitialised){
return false;
}
packets.add(clazz);
return true;
}
//Кодирование пакета, в том числе настройки дискриминатора.
@Override
protected void encode(ChannelHandlerContext ctx, AbstractPacket msg, List<Object> out) throws Exception {
ByteBuf buffer = Unpooled.buffer();
Class<? extends AbstractPacket> clazz = msg.getClass();
if (!packets.contains(msg.getClass())) {
throw new NullPointerException("No Packet Registered for: " + msg.getClass().getCanonicalName());
}
byte discriminator = (byte) this.packets.indexOf(clazz);
buffer.writeByte(discriminator);
msg.encodeInto(ctx, buffer);
FMLProxyPacket proxyPacket = new FMLProxyPacket(buffer.copy(), ctx.channel().attr(NetworkRegistry.FML_CHANNEL).get());
out.add(proxyPacket);
}
//Декодирования и обработка пакета
@Override
protected void decode(ChannelHandlerContext ctx, FMLProxyPacket msg, List<Object> out) throws Exception {
ByteBuf payload = msg.payload();
byte discriminator = payload.readByte();
Class<? extends AbstractPacket> clazz = this.packets.get(discriminator);
if (clazz == null) {
throw new NullPointerException("No packet registered for discriminator: " + discriminator);
}
AbstractPacket pkt = clazz.newInstance();
pkt.decodeInto(ctx, payload.slice());
EntityPlayer player;
switch(FMLCommonHandler.instance().getEffectiveSide()){
case CLIENT:
player = this.getClientPlayer();
pkt.handleClientSide(player);
break;
case SERVER:
INetHandler netHandler = ctx.channel().attr(NetworkRegistry.NET_HANDLER).get();
player = ((NetHandlerPlayServer) netHandler).playerEntity;
pkt.handleServerSide(player);
break;
default:
}
out.add(pkt);
}
public void initialise() {
channels = NetworkRegistry.INSTANCE.newChannel("InventoryPacket", this);
registerPackets();
}
public void registerPackets() {
registerPacket(OpenGuiPacket.class);
registerPacket(SyncPlayerPropsPacket.class);
}
public void postInitialise(){
if (isPostInitialised){
return;
}
isPostInitialised = true;
Collections.sort(packets, new Comparator<Class<? extends AbstractPacket>>(){
public int compare(Class<? extends AbstractPacket> clazz1, Class<? extends AbstractPacket> clazz2){
int com = String.CASE_INSENSITIVE_ORDER.compare(clazz1.getCanonicalName(), clazz2.getCanonicalName());
if (com == 0){
com = clazz1.getCanonicalName().compareTo(clazz2.getCanonicalName());
}
return com;
}
});
}
@SideOnly(Side.CLIENT)
private EntityPlayer getClientPlayer(){
return Minecraft.getMinecraft().thePlayer;
}
public void sendToAll(AbstractPacket message){
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL);
channels.get(Side.SERVER).writeAndFlush(message);
}
public void sendTo(AbstractPacket message, EntityPlayerMP player){
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER);
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player);
channels.get(Side.SERVER).writeAndFlush(message);
}
public void sendToAllAround(AbstractPacket message, NetworkRegistry.TargetPoint point){
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT);
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point);
channels.get(Side.SERVER).writeAndFlush(message);
}
public void sendToDimension(AbstractPacket message, int dimensionId){
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION);
channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId);
channels.get(Side.SERVER).writeAndFlush(message);
}
public void sendToServer(AbstractPacket message){
channels.get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
channels.get(Side.CLIENT).writeAndFlush(message);
}
}
Java:
@Instance("Main")
public static Main instance;
public static final PacketPipeline packetPipeline = new PacketPipeline();
@EventHandler
public void initialise(FMLInitializationEvent event){
packetPipeline.initialise();
packetPipeline.registerPacket(OpenGuiPacket.class); // Пакет открытия инвентаря.
}
@EventHandler
public void postInitialise(FMLPostInitializationEvent eventt){
packetPipeline.postInitialise();
}
2) Так-же не могу понять, почему IThreadListener не может импортироваться под net.minecraft.utils.IThreadListener
И так-же почему proxy - ошибка.
Java:
private static final <T extends AbstractMessage<T>> void checkThreadAndEnqueue(final AbstractMessage<T> msg, final MessageContext ctx) {
IThreadListener thread = Main.proxy.getThreadFromContext(ctx);
// pretty much copied straight from vanilla code, see {@link PacketThreadUtil#checkThreadAndEnqueue}
thread.addScheduledTask(new Runnable() {
public void run() {
msg.process(Main.proxy.getPlayerEntity(ctx), ctx.side);
}
});
}
Main: