怪物装备(Mob Equipment)
基本信息
| 属性 | 值 |
|---|---|
| 事件监听器 | greymerk.roguelike.EntityJoinWorld(EntityJoinWorld.java:14) |
| 事件 | net.minecraftforge.event.entity.EntityJoinWorldEvent(:9) |
| 订阅注解 | @SubscribeEvent(:16) |
| 注册 | MinecraftForge.EVENT_BUS.register(new EntityJoinWorld())(Roguelike.java:39) |
| 处理方法 | OnEntityJoinWorld(EntityJoinWorldEvent)(:17) |
| 目标方法 | Loot.addEquipment(World, int level, Entity mob)(treasure/loot/Loot.java:109) |
| 当前可达性 | 不可达 —— 见下文 |
注册链路(已核实)
@Mod preInit → GameRegistry.registerWorldGenerator(worldGen, 0) Roguelike.java:34
@Mod modInit → MinecraftForge.EVENT_BUS.register(new EntityJoinWorld()) Roguelike.java:39
@Mod serverStart → serverCommand.registerCommand(new CommandSpawnDungeon()) Roguelike.java:47
监听器本身确实注册成功,@SubscribeEvent 也在位。但它处理的事件在本 mod 内永远不会被触发。
⚠️ 触发条件不可满足
EntityJoinWorld.OnEntityJoinWorld 的完整触发条件(EntityJoinWorld.java:17-34):
| 步骤 | 条件 | 来源 |
|---|---|---|
| 1 | event.entity 是 EntityMob 或 EntitySlime |
:20-22 |
| 2 | 实体身上存在药水效果,且 getPotionID() == 4 |
:26-28 |
| 3 | 该效果的 getAmplifier() > 0(即等级 ≥ II) |
:29-30 |
| 4 | 调用 Loot.addEquipment(event.world, level, event.entity) 后 return |
:31-32 |
第 1 步通过,地牢确实会生成 EntityMob。
第 2 步无法由本 mod 自身满足:全树 grep -rn 'addPotionEffect' src/main/java 命中 0 处。本 mod 从不给任何实体施加药水效果,也不注册任何自定义实体。grep -rn 'registerBlock|registerItem|registerTileEntity|registerEnchantment|registerPotion|addRecipe' 同样命中 0 处 —— 本 mod 不注册任何内容对象,因此没有别的地方会给怪物挂buff。
至于 ID 4 究竟是什么效果,取决于原版 1.7.10 的 ID 体系;本 mod 自带的 PotionEffect.getEffectID 把 4 映射为 FATIGUE(treasure/loot/PotionEffect.java:42-43),但本仓不含原版源码可作最终裁定。无论它是什么效果,本 mod 都不会施加它。
结论:Loot.addEquipment 及其 6 件彩蛋装备产出分支(treasure/loot/Loot.java:118-185)在正常游戏流程中不可达。外部 mod 或指令若主动给怪物挂上 ID 4 且等级 ≥ II 的效果,可以激活它——这属于参考性触发条件,不是本 mod 的设计输出。
addEquipment 会做什么(若被激活)
| 步骤 | 行为 | 来源 |
|---|---|---|
| 等级封顶 | if (level > 4) level = 4; |
treasure/loot/Loot.java:111 |
| 槽 0 主手 | 僵尸分支 :118-140、骷髅分支 :143-169,含 6 件彩蛋装备分支 |
treasure/loot/Loot.java:118-169 |
| 槽 1–4 护甲 | 蜘蛛强制给靴子(Slot.FEET),其余按 Slot.getSlotByNumber(i) |
treasure/loot/Loot.java:171-180 |
| 掉落率 | 5 个槽全部设为 looting 配置值(默认 0.085) |
treasure/loot/Loot.java:182-185 |
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 监听的 Forge 事件数 | 1 | EntityJoinWorld.java:9,17 |
| 接受的实体基类数 | 2(EntityMob / EntitySlime) |
EntityJoinWorld.java:20 |
| 要求的药水效果 ID | 4 | EntityJoinWorld.java:28 |
| 要求的最低等级 | amplifier > 0(II 级及以上) | EntityJoinWorld.java:29-30 |
| 装备槽位数 | 5(0 主手 + 1–4 护甲) | treasure/loot/Loot.java:172,183 |
本 mod 内 addPotionEffect 调用点数 |
0 | grep -rn 'addPotionEffect' src/main/java |
本 mod 内 addEquipment 调用点数 |
1 | EntityJoinWorld.java:31 |
addEquipment 自身声明数 |
1 | treasure/loot/Loot.java:109 |
交互
| 触发 | 行为 |
|---|---|
| 任意实体进入世界 | 监听器先做 instanceof 早退;非 EntityMob/EntitySlime 立即返回(EntityJoinWorld.java:20-22),性能开销可忽略 |
| 怪物带 ID 4 且 II 级以上效果 | 赋予 5 槽装备并压低掉落率(当前无本 mod 内部来源) |
与死代码的区别
本条不是「未注册的死类」:监听器已注册、订阅注解在位、调用点存在。缺的是触发条件的数据来源。两者都导致 Loot.addEquipment 实际不执行,但成因不同,修复点也不同。
源码中没有相关 TODO 或说明注释;仓库只有 1 个 commit,无历史可考。此处仅记录可复现的事实,不主张这是作者有意的设计。