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 那条路见上,正常游戏不可达)。
相关条目
- Trollber(巨魔浆果) - 死亡时被催熟的方块
- Magic Beans(魔法豆) -
dropRareDrop的唯一掉落物(正常游戏不可达) - Giant Miner(巨人矿工) - 巨魔巢穴的空中怪
- Armored Giant(装甲巨人) - 巨魔巢穴的另一种空中怪