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);
}
提前致谢。
我不完全确定你的代码出了什么问题,但由于你在官方渠道中也问过这个问题但没有找到答案,我将向你介绍我的一个项目工作自定义网络数据包设置。我注意到我们构建通道和注册自定义数据包的方式有所不同,所以可能那里有问题。
- Shared network manager(共享的意思是在客户端和服务器端使用)
- Client packet handler
- Server packet handler
- Shared packets
我发现我做错了什么。
显然它与我的数据包无关,而是与我的自定义配方类型有关。
我没有从导致问题的缓冲区中读取所有内容。
我正在 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);
}
提前致谢。
我不完全确定你的代码出了什么问题,但由于你在官方渠道中也问过这个问题但没有找到答案,我将向你介绍我的一个项目工作自定义网络数据包设置。我注意到我们构建通道和注册自定义数据包的方式有所不同,所以可能那里有问题。
- Shared network manager(共享的意思是在客户端和服务器端使用)
- Client packet handler
- Server packet handler
- Shared packets
我发现我做错了什么。 显然它与我的数据包无关,而是与我的自定义配方类型有关。 我没有从导致问题的缓冲区中读取所有内容。