当前位置: 首页 > 知识库问答 >
问题:

1.16中minecraft forge软件包的问题。5.

吴炎彬
2023-03-14

我正在Minecraft 1.16.5 forge中制作一个mod

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

为了实现这一点,我添加了一个按钮,每当服务器需要制作时,它都会向服务器发送一个包。

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

我是相对较新的minecraft moding和java一般也不是很有帮助。然而,我已经做了我的功课,有足够的知识知道我实际上在做什么,而不是盲目地从教程中复制粘贴代码,所以叫我出去学习java不会在任何能力上帮助我。

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

它在singleplayer中完美地工作,但每当我尝试加入安装了这个mod的服务器时,我会在屏幕上看到一条错误消息,上面写着

内部异常:io。内蒂。处理程序。编解码器。解码异常:io。内蒂。处理程序。编解码器。EncoderException:java。木卫一。UTFDataFormatException:字节5周围的输入格式不正确

内部调试。日志上写着

[25Nov2021 20:17:50.906][Render线程/FATAL][net.minecraft.util.concurrent.ThreadTaskExec导师/]:在客户端java.util.NoSuchElementExc0019上执行任务出错:packet_handler

我已经将我制作数据包的方法与我在curseforge上发现的多个MOD进行了比较,因为大多数MOD都与我的方法相同。

我在多个伪造和改装相关的不和谐服务器中询问过,但没有人能够帮助我解决问题。

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

我的PacketHandler类如下所示:

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();
}

我的数据包类如下所示:

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);
}

事先多谢。

共有2个答案

吴宝
2023-03-14

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

魏波娃
2023-03-14

我不完全确定你的代码出了什么问题,但是既然你在官方渠道也问了这个问题,却没有找到答案,我将向你介绍我的一个项目,该项目具有一个有效的自定义网络数据包设置。我注意到我们在如何构建通道和注册自定义数据包方面存在差异,所以可能有问题。

  • 共享网络管理器(共享意味着在客户端和服务器上使用)
  • 客户端数据包处理程序
  • 服务器数据包处理程序
  • 共享数据包
 类似资料:
  • 我正在使用SceneForm1.16和andriod Studio4.1,我正在尝试渲染,但它不工作。 问题: 生成分级文件

  • 问题内容: 我在安装PyAudio和portaudio时遇到问题。 当我收到此错误时: 因此,在查找了该错误之后,我读到我需要安装portaudio。所以我做到了,并得到了这个错误: 我不知道现在该从哪里去。 问题答案: 不是Python软件包,而是一个完全独立于Python的C库,因此您无法通过进行安装。 请参阅PortAudio网站以获得有关获取并将其安装在平台上的官方方法的详细信息。 在Wi

  • 我正在用纯Java创建一个2D自上而下的平铺游戏,现在我正在尝试实现一种实现照明的方法。 首先,关于如何渲染的一些细节:有一个screen类处理所有渲染。像素被放入一个数组中,该数组使用和。 我现在做照明的方法是通过创建第二个数组来保存所有应该从实际像素中减去的亮度。我试着只使用从到的浮点来表示RGB强度。 例如,环境照明为0.3f。我所做的是一个像素到像素的操作,对于将要绘制的每个像素,其RGB

  • Tazpkg - 软件包管理器 Slitaz提供一个小型软件包管理器,它能轻易在系统里安装许多软件。Tazpkg是一个由SHell脚本写的轻量级的软件包管理器,能安 装.tazpkg文件。它能在Busybox、ash shell和bash中正常运行。Tazpkg可以让你列出软件包列表、安装软件包、删除软件包、下载软件包、解压软件包、打包软件包、查找软件包或者取 得有关可用软件包或所有已安装软件包的

  • 问题内容: 我知道如何使用Anaconda安装软件包,以及如何安装PyPi上的软件包,如手册中所述。 但是,如何才能将软件包/文件夹永久包含在Anaconda环境中,以便可以导入当前正在使用的代码,并且在重新启动后仍然可用? 我当前的方法是使用: 这不是很方便。 有什么提示吗? 提前致谢! 问题答案: 我在Anaconda论坛中找到了两个问题的答案: 1.)将模块放入站点包中,即始终位于的目录中。