Questing Ram(谜题羊)

事实基准:/Users/evlos/a/mirror/twilightforest(minecraftVersion = 1.7.10)逐行读源码。

基本信息

属性 值 来源
注册实体名 TwilightForest:Questing Ram TwilightForestMod.java:545-548
实体 ID 常量 idMobQuestRam = 198 TwilightForestMod.java:1101
蛋色 无 走 3 参数重载 TFCreatures.java:44-50,不写 entityEggs
刷怪蛋 无 同上
类 twilightforest.entity.passive.EntityTFQuestRam(382 行) entity/passive/EntityTFQuestRam.java:31
父类 net.minecraft.entity.passive.EntityAnimal(不是 EntitySheep) EntityTFQuestRam.java:31
体型 setSize(1.25F, 2.9F) EntityTFQuestRam.java:38
所属结构 试炼林 / Quest Grove(TFFeature ID 9) structures/ComponentTFQuestGrove.java:96

走的是 registerTFCreature(Class, String, int) 三参数重载,该重载不写 entityEggs(TFCreatures.java:44-50),所以没有刷怪蛋, 只能靠试炼林结构生成。同批走三参数重载的还有 Lich Minion、Upper Goblin Knight、 Loyal Zombie。

数值

属性 值 来源
maxHealth 70.0 EntityTFQuestRam.java:63
movementSpeed 0.23000000417232513 EntityTFQuestRam.java:64
染色上限 16 种颜色 EntityTFQuestRam.java:314
完成阈值 countColorsSet() > 15(即 16 种全齐) EntityTFQuestRam.java:118、:210
领地半径 setHomeArea(..., 13) EntityTFQuestRam.java:112
领地铁块采样间隔 70 + rand.nextInt(50) tick EntityTFQuestRam.java:96
声音音量 5.0F(极大) EntityTFQuestRam.java:335-337
惊吓逃跑速度 1.38F EntityTFQuestRam.java:43
canDespawn() 恒 false —— 永不消失 EntityTFQuestRam.java:85-88
attackDamage 被动生物,源码中未设置,沿用 EntityAnimal 链上的父类默认 —

AI 行为 / 特殊机制

染色任务:手持未染过该色的羊毛右键即可为它上色 (interact,:161-187)。isColorPresent / setColorPresent 用一个 int 的第 0~15 位做位掩码,存于 dataWatcher 索引 16; 是否已发过奖励存于索引 17(:67-72)。成功染色时 animateAddColor(damage, 50) 生成 50 个对应羊毛颜色的 mobSpell 粒子并 播放羊叫(:169-170、:289-305)。创造模式玩家不消耗羊毛(:172-178)。

完成奖励(rewardQuest,:129-141):集齐 16 色后 ① 各掉 1 个钻石块、铁块、绿宝石块、金块、青金石块; ② 掉 1 个 TFItems.crumbleHorn; ③ 掉 1 个 trophy,元数据 8(new ItemStack(TFItems.trophy, 1, 8))。 奖励只发一次(setRewarded(true),:120),Rewarded 与 ColorFlags 都写进 NBT(:218-233)。

成就:16 格范围内的玩家全部获得 twilightQuestRam (成就名「Consumate Baaahs」,rewardNearbyPlayers,:146-156; lang/en_US.lang:665-666)。

自带采食 AI:优先级 3 EntityAITFEatLoose(吃地上的掉落羊毛)、 优先级 4 EntityAITFFindLoose(捡掉落羊毛),都指向 Blocks.wool (:45-46)—— 所以地上有散落的羊毛时它会自己走过去吃。

未奖励时的炫彩:每 tick 若已集齐但未发奖,就随机挑一个颜色撒 5 个 mobSpell 粒子(checkAndAnimateColors,:209-213)。

回不了家就游荡:updateAITick 周期性检查最近的 TFFeature, 不是 questGrove 就 detachHome()(:98-115)—— 被带离试炼林后不再固守,但也因为 canDespawn() == false 而永不消失。

死代码:

  • EntityTFQuestRam.java:48 注释掉的 // this.tasks.addTask(4, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); —— 本类不注视玩家。
  • EntityTFQuestRam.java:167-168、:180-182 注释掉的 bucketMilk 交换分支与调试输出。
  • EntityTFQuestRam.java:197-202 整段注释掉的 onLivingUpdate 粒子代码。
  • EntityTFQuestRam.java:23-24、:114、:262-265 多处注释掉的调试输出。
  • 三个未实现的 createChild 返回 null(:52-55)—— 不能繁殖。

相关条目