1.16.5 中 Minecraft forge 包的问题

Issues with minecraft forge packages in 1.16.5

我正在 minecraft 1.16.5 forge 中制作 mod

我有一个用于制作的图块实体,但我不希望它每次都制作东西。

为了实现这一点,我添加了一个按钮,可以在需要制作时向服务器发送一个包。

我不知道我现在做错了什么,我无法在 minecraft 代码中找到问题的原因,因为异常堆栈没有引用我的任何 classes。

我对 minecraft modding 和 java 比较陌生,一般来说这也不是很有帮助。但是我已经完成了作业并且有足够的知识知道我实际上在做什么,而不是盲目地从教程中复制粘贴代码所以叫我出去学习 java 对我没有任何帮助。

我被这个问题困扰了大约一个星期,这是我能想到的最后一个可以帮助我的地方

它在单人游戏中运行完美,但每当我尝试加入安装了此 mod 的服务器时,我的屏幕上都会收到一条错误消息,显示

Internal Exception: io.netty.handler.codec.DecoderException: io.netty.handler.codec.EncoderException: java.io.UTFDataFormatExcpetion: malformed input around byte 5

Debug.log里面写着

[25Nov2021 20:17:50.906] [Render thread/FATAL] [net.minecraft.util.concurrent.ThreadTaskExecutor/]: Error executing task on Client java.util.NoSuchElementException: packet_handler

我已经比较了我在 curseforge 上发现的多个 mod 制作数据包的方法,大多数与我做的方法相同。

我在多个 forge 和 modding 相关的 discord 服务器上询问过,但没有人能够帮助我解决我的问题。

youtube 上的所有教程都和我做的一样。

我的 PacketHandler class 看起来像这样:

public static final String PROTOCOL_VERSION = "1";
public static SimpleChannel CHANNEL;


public static void init() {
    int index =0;
    CHANNEL = NetworkRegistry.ChannelBuilder
            .named(new ResourceLocation("pepsimc","simple_network"))
            .clientAcceptedVersions(PROTOCOL_VERSION::equals)
            .serverAcceptedVersions(PROTOCOL_VERSION::equals)
            .networkProtocolVersion(()->PROTOCOL_VERSION)
            .simpleChannel();
    
    CHANNEL.messageBuilder(ProcessingCraftPacket.class, index++, NetworkDirection.PLAY_TO_SERVER)
    .encoder(ProcessingCraftPacket::encode)
    .decoder(ProcessingCraftPacket::new)
    .consumer(ProcessingCraftPacket::handle)
    .add();
}

我的数据包 class 看起来像这样:

public final BlockPos Pos;

public ProcessingCraftPacket(BlockPos Pos) {
    this.Pos = Pos;
}

public ProcessingCraftPacket(PacketBuffer buffer) {
    this(buffer.readBlockPos());
}

public void encode(PacketBuffer buffer) {
    buffer.writeBlockPos(this.Pos);
}

public static void handle(ProcessingCraftPacket message, Supplier<NetworkEvent.Context> ctx) {
    ctx.get().enqueueWork(()->{
        final TileEntity TE = ctx.get().getSender().level.getBlockEntity(message.Pos);
        if(TE instanceof ProcessingTile) {
            final ProcessingTile PT = (ProcessingTile) TE;
            PT.process(ctx.get().getSender().level);
        }
    });
    ctx.get().setPacketHandled(true);
}

提前致谢。

我不完全确定你的代码出了什么问题,但由于你在官方渠道中也问过这个问题但没有找到答案,我将向你介绍我的一个项目工作自定义网络数据包设置。我注意到我们构建通道和注册自定义数据包的方式有所不同,所以可能那里有问题。

我发现我做错了什么。 显然它与我的数据包无关,而是与我的自定义配方类型有关。 我没有从导致问题的缓冲区中读取所有内容。