Hey everyone, I have a question about an issue I'm having with netty, I've used it before and this is the first time I've ever encountered a bug quite like this.
io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?]
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?]
at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?]
at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?]
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?]
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?]
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?]
at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?]
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?]
Caused by: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel
at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:73) ~[FMLIndexedMessageToMessageCodec.class:?]
at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?]
at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?]
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?]
... 13 more
[00:27:35] [server thread/ERROR] [FML]: SimpleChannelHandlerWrapper exception
io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?]
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?]
at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?]
at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?]
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?]
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?]
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?]
at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?]
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?]
Caused by: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel
at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:73) ~[FMLIndexedMessageToMessageCodec.class:?]
at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?]
at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?]
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?]
... 13 more
[00:27:35] [server thread/ERROR] [FML]: SimpleChannelHandlerWrapper exception
io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?]
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?]
at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?]
at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?]
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?]
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?]
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?]
at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?]
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?]
Caused by: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel
at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:73) ~[FMLIndexedMessageToMessageCodec.class:?]
at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?]
at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?]
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?]
... 13 more
[00:27:35] [server thread/ERROR] [FML]: There was a critical exception handling a packet on channel xan_prChannel
io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?]
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) ~[DefaultChannelPipeline.class:?]
at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) ~[EmbeddedChannel.class:?]
at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?]
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?]
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?]
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?]
at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?]
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?]
Caused by: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel
at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:73) ~[FMLIndexedMessageToMessageCodec.class:?]
at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?]
at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?]
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?]
... 13 more
Clearly it has an issue with discriminator 21, which makes sense, because I have no discriminator 21 registered, here's my packet registration (and yes it is being called)
public static void initialize() {
NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel(References.MOD_CHANNEL_ID);
NETWORK.registerMessage(ServerReceiveNewRecipe.Handler.class, ServerReceiveNewRecipe.class, 0, Side.SERVER);
NETWORK.registerMessage(ServerRemoveOldRecipe.Handler.class, ServerRemoveOldRecipe.class, 1, Side.SERVER);
NETWORK.registerMessage(ClientReceiveAllRecipesFromServer.Handler.class, ClientReceiveAllRecipesFromServer.class, 2, Side.CLIENT);
NETWORK.registerMessage(ClientReceiveNewRecipeFromServer.Handler.class, ClientReceiveNewRecipeFromServer.class, 3, Side.CLIENT);
NETWORK.registerMessage(ClientReceiveRecipeRemovalFromServer.Handler.class, ClientReceiveRecipeRemovalFromServer.class, 4, Side.CLIENT);
}
All of the packets seem to work fine minus the ServerRemoveOldRecipe packet
//Imports removed to save space
public class ServerRemoveOldRecipe implements IMessage {
private int handlerID = 0;
private int recipeID = 0;
public ServerRemoveOldRecipe() {}
public ServerRemoveOldRecipe(int handlerID, int recipeID){
this.handlerID = handlerID;
this.recipeID = recipeID;
}
@Override
public void fromBytes(ByteBuf byteBuf) {
handlerID = byteBuf.getInt(0);
recipeID = byteBuf.getInt(1);
}
@Override
public void toBytes(ByteBuf byteBuf) {
byteBuf.setInt(0, handlerID);
byteBuf.setInt(1, recipeID);
}
public static class Handler implements IMessageHandler<ServerRemoveOldRecipe, IMessage> {
@Override
public IMessage onMessage(ServerRemoveOldRecipe message, MessageContext ctx) {
if(ctx.side.isServer()) {
RecipeRegistry.INSTANCE.removeRecipe(message.handlerID, message.recipeID);
NetworkHandler.NETWORK.sendToAll(new ClientReceiveRecipeRemovalFromServer(message.handlerID, message.recipeID));
}
return null;
}
}
}
Here is the ClientReceiveRecipeRemovalFromServer class, although we never get this far as the crash happens before it, but for the sake of completeness.
//imports and package info removed to save space
public class ClientReceiveRecipeRemovalFromServer implements IMessage {
private int handlerID = 0, position = 0;
public ClientReceiveRecipeRemovalFromServer() {}
public ClientReceiveRecipeRemovalFromServer(int handlerID, int position) {
this.handlerID = handlerID;
this.position = position;
}
@Override
public void fromBytes(ByteBuf byteBuf) {
handlerID = byteBuf.getInt(0);
position = byteBuf.getInt(1);
}
@Override
public void toBytes(ByteBuf byteBuf) {
byteBuf.setInt(0, handlerID);
byteBuf.setInt(1, position);
}
public static class Handler implements IMessageHandler<ClientReceiveRecipeRemovalFromServer, IMessage> {
@Override
public IMessage onMessage(ClientReceiveRecipeRemovalFromServer message, MessageContext ctx) {
if(ctx.side.isClient()) {
RecipeRegistry.INSTANCE.removeRecipe(message.handlerID, message.position);
}
return null;
}
}
}
And finally here's the code that actually sends the packet to the server
//Some context for this code: It's within a GUI screen under actionPerformed(GuiButton) so this code is called from a client telling the server to remove a recipe, the server then tells all the clients to remove the same recipe.
if(FMLCommonHandler.instance().getMinecraftServerInstance() == null) {
//getMinecraftServerInstance() is null only if you're a client connected to a remote server I've found, which is when I want to send the packet, if theres a better way to detect that please let me know.
NetworkHandler.NETWORK.sendToServer(new ServerRemoveOldRecipe(RecipeRegistry.INSTANCE.getAliasIntID(handler.getID()), selected));
} else {
handler.deleteRecipe(selected);
}
I really have absolutely no idea why this is happening and I've spent probably 5 hours trying to figure it out now. Some help would be greatly appreciated, and if I've made a dumb mistake that I'm just blind to then I apologize but I really can't see one.