精华赋值与注册

基本信息

属性 值
实体数据类 iguanaman.thaumcraftmobaspects.ThaumcraftEntity
注册入口 ThaumcraftApi.registerEntityTag(String, AspectList)(ThaumcraftMobAspects.java:131)
触发时机 FMLPostInitializationEvent#post
注册条件 aspectList.size() > 0——空精华列表不注册
精华值类型 HashMap<String, Integer>,键是 Aspect#getTag()(字符串)

ThaumcraftEntity 的相等性只看名字

public boolean equals(Object obj) {
    if (obj == null || !(obj instanceof ThaumcraftEntity)) return false;
    return entityName.equals(((ThaumcraftEntity) obj).entityName);
}
public int hashCode() { return entityName.hashCode(); }

aspects 内容不参与相等判定。所有容器都是 HashSet / HashMultimap, 所以"同名实体后写入的精华表不会替换先写入的"——先到先得。

类里还有三个从未被序列化使用的字段:_HEADER、_FOOTER、_COMMENT (都是 41 个 * 或说明文字),本意应是写进配置文件当注释, 但 saveToFile 用的是 Gson toJson(mobs, ...),这些字段会被当作普通成员输出。

两个精华表构造助手的语义不同

方法 固定精华 数量语义
creatureAspects(int size, Aspect...) 必带 BEAST = size sizeMod = max(round(size / aspects.length), 1),传入的每个精华各 sizeMod
bossAspects(int amount, Aspect...) 必带 6 个基础精华:EARTH、AIR、FIRE、ENTROPY、WATER、ORDER,各 amount 传入的每个精华各 amount

creatureAspects 的除法有下限保护:max(..., 1) 保证不会算出 0。 例如 creatureAspects(4, Aspect.FIRE) → BEAST 4 + FIRE 4; creatureAspects(2, Aspect.ENTROPY) → BEAST 2 + ENTROPY 2(round(2/1)=2)。

bossAspects 传的精华数不影响基础六精华,只影响额外精华各自的数值。 例如 bossAspects(10, Aspect.UNDEAD, Aspect.MAGIC, Aspect.MIND) → 六个基础精华各 10,UNDEAD/MAGIC/MIND 各 10。

这四个辅助方法在 4 个插件里各被转发了一次(PluginMoCreatures、 PluginLycanitesMobs、PluginTwilightForest 的 static 转发), 最终都落到 ThaumcraftMobAspects 的实现。

注册前的名称与精华双重校验

for (Entry<String, Integer> entry : mob.aspects.entrySet()) {
    Aspect aspect = Aspect.aspects.get(entry.getKey());
    if (aspect != null) aspectList.add(aspect, entry.getValue());
}
if (aspectList.size() > 0) ThaumcraftApi.registerEntityTag(mob.entityName, aspectList);

配置里写了不存在的精华 tag 时会被静默跳过(aspect != null 判空), 但如果因此导致列表全空,该实体就完全不注册——不报错、不提示。

玩家实体的两个硬编码条目

post 里无条件写入两个玩家名,与是否装了其他 mod 无关:

实体名 精华
the_iguana_man bossAspects(5, MAN, MIND, SOUL, LIFE, MAGIC, ELDRITCH, ENERGY, HUNGER)
XanderGryphon 同上(完全相同的一组)

即 EARTH/AIR/FIRE/ENTROPY/WATER/ORDER 各 5, 加上 MAN/MIND/SOUL/LIFE/MAGIC/ELDRITCH/ENERGY/HUNGER 各 5。 两者都不是通过 EntityPlayer 的类或名字匹配的,而是靠配置里以 字符串形式存在(见 实体精华配置文件)。

相关条目