跳转至

数据包

该部分对FML提供的Packet接收事件做了封装,无需进行繁琐的定义,更不需要进行手动变量序列化/反序列化。

定义一个简单数据包

用法

  • 使用@SkillPacket来标记数据包类,并使该类继承AbstractPacket
  • run函数中填写接收数据包后所执行的内容
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SkillPacket
public class DemoPacket extends AbstractPacket {
    private String testString;

    @Override
    protected void run(EntityPlayer player, Side from) {
        Message.send(player, testString)
    }
}

默认的序列化工具是Jackson,所有对象将会转换成Json格式文本进行传输,因此需要定义一个空的构造器和Getter/Setter方法。示例使用了lombok的注解去自动生成了上述内容。

自定义序列化器

以下代码为本模组的默认序列化器,可参照该内容自定义特殊的序列化器

public class JsonPacketSerializer implements PacketSerializer<AbstractPacket> {
    @Override
    public void serialize(AbstractPacket packet, ByteBuf buffer) throws Exception {
        PacketSerializer.writeString(buffer, JsonUtils.getMapper().writeValueAsString(packet));
    }

    @Override
    public AbstractPacket deserialize(Class<?> packetClass, ByteBuf buffer) throws Exception {
        return (AbstractPacket) JsonUtils.getMapper().readValue(PacketSerializer.readString(buffer), packetClass);
    }
}

使用时只需要在注解中填写该类即可

@SkillPacket(serializer = JsonPacketSerializer.class)