本篇教程由作者设定使用 CC BY-NC 协议。
Anno原理
Anno本质上采用了运行时注解+反射的方式从(Registration|注册表)类中获取静态字段,然后进行各种操作。
其中操作过程整合到(解析器|Resolver)接口实现,在AnnoResolvers注册以供调用。
具体流程:
模组相关加载方法中调用AnnoResolvers中的解析方法,解析指定类 ->
获取字段,实例,RegistrationClass -> 尝试包装字段(该过程判断是否有注解和判断是否为期望类型)
已注册Resolvers循环解析(解析过程具体化取决于对应Resolver)
注册表
示例
简述
(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实现自动生成。
而我们的注册表生效就需要解析,具体操作如下:
在模组主类的onInitialize()方法调用AnnoResolvers.resolve(Class<?> registration);
在模组DataGeneration类的onInitializeDataGenerator(arg...)调用AnnoResolvers.dataGen(arg...)。
其中Class<?> registration为注册表的类。
示例