Troll(巨魔)

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

基本信息

属性 值 来源
注册实体名 TwilightForest:Troll TwilightForestMod.java:730
实体 ID 常量 idMobTroll = 232 TwilightForestMod.java:1134
蛋色 主 0x9ea98f / 副 0xb0948e TwilightForestMod.java:730
注册形式 TFCreatures.registerTFCreature → 追踪 80 / 更新 3 TFCreatures.java:23、TwilightForestMod.java:730
类 twilightforest.entity.EntityTFTroll(287 行) entity/EntityTFTroll.java:36
父类 net.minecraft.entity.monster.EntityMob(implements IRangedAttackMob) 同上 :36
体型 setSize(1.4F, 2.4F) 同上 :49
所属结构 巨魔巢穴(特性 ID 18),权重 20、4~4 只 TFFeature.java:204
群系刷怪 高地群系地下刷怪表,权重 10、4~4 只 biomes/TFBiomeHighlands.java:61

地表那行是被注释掉的:TFBiomeHighlands.java:54 // this.spawnableMonsterList.add(new SpawnListEntry(EntityTFTroll.class, 10, 4, 4)); 但地下那行(第 61 行)是生效的,所以巨魔会在高地群系地下自然刷新。

数值

属性 值 来源
maxHealth 30.0 EntityTFTroll.java:75
movementSpeed 0.28 同上 :76
attackDamage 7.0 同上 :77
近战 AI 参数 EntityAITFCollideAttackFixed(this, EntityPlayer.class, 1.2D, false) 同上 :41-45
远程 AI 参数 EntityAIArrowAttack(this, 1.0D, 20, 60, 15.0F) 同上 :40
远程弹道初速 / 精度 0.75F / 12.0F 同上 :241
getDropItem null(不掉落) 同上 :223-225
dropRareDrop TFItems.magicBeans × 1 同上 :227-229
手臂挥动动画时长 6 tick 同上 :283-285
DataWatcher 索引 ROCK_FLAG = 16 同上 :38、:82
追踪距离 / 更新频率 80 / 3 TFCreatures.java:23

AI 行为 / 特殊机制

🚨 最重要的一条:hasRock() 在正常游戏中恒为 false,巨魔永远只用近战。 setHasRock(true) 在全 mod 中没有任何调用点 —— 唯一调用者是 readEntityFromNBT(:129-132),而它传入的 HasRock 值由 writeEntityToNBT 从 hasRock() 写出,初值就是 false(:123-126)。因此:

  • EntityAIArrowAttack(远程)与 attackEntityWithRangedAttack 里的 EntityTFIceBomb 投掷(:232-246)在正常游戏中不可达;
  • dropRareDrop 掉 magicBeans 的路径同理不可达。

远程分支仍会做两件事:把 followRange 提到 40.0(:104)、 按持石状态切换优先级 4 的 AI(:135-144)。

任务表(:51-62):1 EntityAISwimming;2 EntityAIRestrictSun; 3 EntityAIFleeSun(1.0D);5 EntityAIWander(1.0D); 6 EntityAIWatchClosest(EntityPlayer, 8.0F) 与 6 EntityAILookIdle(6 被占用两次, 后者覆盖前者);优先级 4 由 setCombatTask() 动态填入 —— 有石则 EntityAIArrowAttack,无石则 EntityAITFCollideAttackFixed。 目标表:1 EntityAIHurtByTarget(false)、2 EntityAINearestAttackableTarget(EntityPlayer)。 setCombatTask() 在构造函数(仅服务端)与每次 setHasRock 时调用。

挥臂广播:swingItem() 覆写,每次挥击向 WorldServer 的追踪器广播 S0BPacketAnimation(this, 0),并覆写 updateArmSwingProgress() 自行推进 6 tick 的动画 (:113-120、:248-277)。

死亡催熟浆果:onDeathUpdate 每 5 tick 调用 ripenTrollBerNearby(deathTime / 5) (:150-152),在以自身为中心的 24³ 格(range = 12 的三层三重循环)内把 TFBlocks.unripeTrollBer 变成 TFBlocks.trollBer,并用 |cx + cy + cz| % 5 == offset 做伪随机筛选(:159-184)。范围实际是 ±11 格, 死亡一次能催熟约 20³ 格的浆果。

死代码:makeTrollStoneInAABB(AxisAlignedBB)(把空气格换成 TFBlocks.trollSteinn) 定义在 :198-221,但唯一调用点在 :154-156 被整段注释,永不执行。 onLivingUpdate 是空覆写(:85-92)。

成就:暮色森林维度内被玩家击杀触发 twilightHunter(:187-195)。

掉落:本类 getDropItem() 返回 null,即巨魔本身不掉任何东西 (dropRareDrop 那条路见上,正常游戏不可达)。

相关条目