怪物装备(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,无历史可考。此处仅记录可复现的事实,不主张这是作者有意的设计。

相关条目