网络包
与其他教程可能略有不同的是,我们将会使用T88的网络包注解处理器来完成这一部分。
信息
如果你更喜欢使用纯原版内容来编写网络包,Fledge的Boson教程是一个非常不错的选择。不过你需要注意其中使用的是mcp表。
在服务端与客户端一章提到过,数据并不会自己在两端之间同步,而在MC没有提供对应的同步方法的情况下,我们就需要编写自己的网络包来实现同步。
- 1.20.4
- 1.21
随着Minecraft的改动,NeoForge对网络包系统进行了重构,现在网络包必须实现CustomPacketPayload接口,而且采用了与之前不同的注册系统。
幸运的是,T88的注解处理器将会为你完成大部分的变更,你也不需要自己实现CustomPacketPayload(不过这样会使得你只能使用NetWorkHelper来帮助你把网络包转换为生成的代理网络包类来进行发包)。需要你手动进行的变更将在下文提到。
信息
将你的网络包转换为生成的代理网络包的过程可能会出现问题,你需要在开发时关注日志中有无报错信息。另外这个转换步骤将会消耗一点点性能,你可能需要关注其具体的影响。
警告
需要注意,T88的注解处理器目前只支持play阶段的网络包,暂不支持配置阶段的网络包。
在1.21,Codec得到了大规模应用。T88也加入了对record-codec形式网络包的支持,写出一个网络包变得更加简单:
@NetPacket(modid = SignMeUp.MODID)
public record SetWaypointPacket(String name, String description, BlockPos pos) {
@Codec
public static final StreamCodec<ByteBuf, SetWaypointPacket> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.STRING_UTF8,
SetWaypointPacket::name,
ByteBufCodecs.STRING_UTF8,
SetWaypointPacket::description,
BlockPos.STREAM_CODEC,
SetWaypointPacket::pos,
SetWaypointPacket::new
);
@ClientHandler
public void clientHandler(IPayloadContext context){
var waypoint = new Waypoints.WayPoint(name, description, pos.getX(), pos.getY(), pos.getZ());
ConfigHelper.getConfigWrite(Waypoints.class, waypoints -> waypoints.waypoints.add(waypoint));
}
}
不再需要@Encoder和@Decoder,@Codec就能承担起两者的作用。
信息
此处使用了秦千久的K9Tools插件来生成codec。
信息
Codec是一种更加面向对象的序列化/反序列化工具。你可以在以下两处了解关于codec的更多信息:
同时NetworkHelper也有一些小改动,将各种发包目标具体化至不同方法。