本篇教程由作者设定使用 CC BY-NC 协议。

Anno原理

Anno本质上采用了运行时注解+反射的方式从(Registration|注册表)类中获取静态字段,然后进行各种操作。

其中操作过程整合到(解析器|Resolver)接口实现,在AnnoResolvers注册以供调用。


具体流程:

模组相关加载方法中调用AnnoResolvers中的解析方法,解析指定类 ->

获取字段,实例,RegistrationClass -> 尝试包装字段(该过程判断是否有注解和判断是否为期望类型)

已注册Resolvers循环解析(解析过程具体化取决于对应Resolver)

注册表

示例

[Anno注解库]基础使用教程-第1张图片示例注册表简述

(Registration|注册表)也是一个(Class|类),里面以静态变量的形式存放着相关元素的实例。

注册表必须使用@ID(String namespace),作为该注册表的命名空间,大多数时候就是modid。

核心注解

  • @ID(String value)用于绑定id。(一切字段必须有@ID才能被解析)

一般注解

  • @Reg(String registryName)用于注册;(registryName应该对应Registries中的字段名)

  • @Burnable(int time)用来添加新的燃料。

生成型注解(DataGeneration生效)

  • @Parented(String path)用于生成1个parent为<path>的模型;(命名空间为注册表@ID)

  • @Generated用于生成1个一般模型的物品;(材质路径来自注册表@ID和物品@ID)

  • @Handheld用于生成1个手持模型的物品;(材质路径同@Generated)(手持模型有如剑镐斧之类)

  • @CubeAll用于生成1个六面相同的简单方块模型以及BlockState;

  • @Lang(String langCode, String value)用于生成语言文件,<langCode>为语言代码,<value>为值。(语言代码有如zh_cn之类)

解析

简述

解析过程会获取字段实例和对应的注解,

在此过程中可结合其他操作,例如结合DataGeneration实现自动生成。

而我们的注册表生效就需要解析,具体操作如下:

  1. 在模组主类的onInitialize()方法调用AnnoResolvers.resolve(Class<?> registration);

  2. 在模组DataGeneration类的onInitializeDataGenerator(arg...)调用AnnoResolvers.dataGen(arg...)。

其中Class<?> registration为注册表的类。

示例

[Anno注解库]基础使用教程-第2张图片

[Anno注解库]基础使用教程-第3张图片