附魔:FlimFlam / 爆炸 / 背水一战

基本信息

OpenBlocks 注册 3 个附魔,全部是 OpenBlocks.java:508-513 的 Enchantments 类中的裸静态字段。

附魔 本地化名 类 适用装备 最大等级 字段声明
FlimFlam openblocks.flimflam EnchantmentFlimFlam EnumEnchantmentType.all(全部) 4 OpenBlocks.java:512
爆炸 openblocks.explosive EnchantmentExplosive EnumEnchantmentType.armor 3 OpenBlocks.java:510
背水一战 openblocks.laststand EnchantmentLastStand EnumEnchantmentType.armor 2 OpenBlocks.java:511

三个字段都是裸 public static Enchantment,没有任何注解(OpenBlocks.java:508-513)——实际实例化与注册由 OpenModsLib 的 ModStartupHelper 反射完成,不在 openblocks 仓库内,故此处只声明字段位置。

功能

FlimFlam:随机「幸运事件」系统

FlimFlam 是本模组最有特色的系统:当一名玩家用附魔的手持物品攻击另一名玩家时,按幸运值随机触发一个效果。

  • 等级差计算:flimFlamDiff = 目标护甲等级 / 3 - 源手持等级(FlimFlamEnchantmentsHandler.java:91)
  • 触发时遍历 FlimFlamRegistry.instance.getFlimFlams(),筛出 canApply(luck) 且不在 BLACKLIST 中的效果,按 weight 加权抽取(:130-132、:144-147)
  • 触发后聊天栏显示 openblocks.flim_flammed(:159)
  • 源等级读手持物(getFlimFlamToolLevel,:199-200),目标等级读全身护甲求和(getFlimFlamArmorLevel,:203-206),底层都是 getFlimFlamLevel(ItemStack)(:212)
  • canFlimFlam(Luck) 决定哪些幸运值类别可触发(:185)

FlimFlamRegistry.BLACKLIST 是一个 FlimFlamChecker(FlimFlamRegistry.java:36-38),在 postInit 末尾统一初始化(OpenBlocks.java:783)。

17 个 FlimFlam 效果

全部在 OpenBlocks.java:760-781 于 postInit 注册,且整段包在 if (Enchantments.flimFlam != null) 里(OpenBlocks.java:759)——即在配置中关掉 FlimFlam 附魔时,这 17 个效果一个都不存在。

注册名 cost weight 标记 实现类 行
inventory-shuffle -50 100 safe InventoryShuffleFlimFlam :760-761
useless-tool -125 50 safe UselessToolFlimFlam :762
bane -125 100 safe BaneFlimFlam :763
epic-lore -10 100 safe LoreFlimFlam :764
living-rename -10 100 safe RenameFlimFlam :765
squid -75 50 safe SquidFilmFlam :766
sheep-dye -5 50 safe SheepDyeFlimFlam :767
invisible-mobs -25 10 safe InvisibleMobsFlimFlam :768-769
sound -5 150 silent + safe SoundFlimFlam :770
snowballs -50 50 — SnowballsFlimFlam :772
teleport -100 30 — TeleportFlimFlam :773
mount -150 25 — MountFlimFlam :774
encase -50 50 覆写 range EncaseFlimFlam :775-776
creepers -60 50 — DummyCreepersFlimFlam :777
disarm -50 50 — ItemDropFlimFlam :778
effect -75 75 — EffectFlimFlam :779
skyblock -100 150 覆写 range SkyblockFlimFlam :780-781

common/recipe/ 下的 7 个自定义配方中,EpicEraserRecipe 名字与 epic-lore 呼应——史诗橡皮擦用于清除装备的附魔 lore。

FlimFlamDescriptionSimple 的 cost/range 语义

这是本系统里一处看起来反直觉但自洽的设计(api/FlimFlamDescriptionSimple.java):

  • 构造器里 cost < 0 时 setRange(Integer.MIN_VALUE, cost),否则 setRange(cost, Integer.MAX_VALUE)(:19-20)
  • canApply(luck) 是 lowerLuck <= luck && luck <= upperLuck(:75-77)
  • 也就是说:cost 是幸运值区间的右端点。cost = -50 意为「只在 luck ≤ -50 时可能触发」,即越负越稀有
  • setRange(a, b) 在 a < b 时不交换,否则交换(:33-42)——所以 encase 的 setRange(Integer.MIN_VALUE, -300) 把区间压到 luck ∈ [-300, -50],而 skyblock 同理压到 [-400, -100](OpenBlocks.java:776、:781)

命名反直觉(cost 实际是上界、setRange 会自动交换参数),但调用侧与实现侧完全自洽:改任何一侧都会破坏匹配。仓库内没有注释、测试或提交信息声明「cost 就是幸运上界」这一意图,仅有上述代码本身。因此此处不作为缺陷报告。

markSafe() / markSilent() 返回 this,支持链式调用(:23-31)。sound 是唯一同时标记两者的效果(OpenBlocks.java:770)。

数值

数值名 公式 位置
FlimFlam 最大等级 常量 4(EnchantmentFlimFlam.java:15)
FlimFlam 最低附魔力 31 + level * 10 EnchantmentFlimFlam.java:20
FlimFlam 最高附魔力 最低 + 10 EnchantmentFlimFlam.java:25
爆炸最大等级 常量 3(EnchantmentExplosive.java:15)
爆炸最低附魔力 Lv1 / Lv2 / Lv3+ 15 / 25 / 100 EnchantmentExplosive.java:22、:24、:26
背水一战最大等级 常量 2(EnchantmentLastStand.java:15)
背水一战最低附魔力 Lv1 / Lv2 15 / 25 EnchantmentLastStand.java:22、:24
三个附魔的权重 常量 2(三处 super(id, 2, ...))
目标等级折算 目标护甲等级 / 3 FlimFlamEnchantmentsHandler.java:91
17 个效果的 weight 范围 — 10 ~ 150(OpenBlocks.java:768 至 :780)

「爆炸」附魔的 Lv3 最低附魔力返回 100,源码注释写明 // unavailable through enchanting(EnchantmentExplosive.java:26)——即三级只能靠命令/物品获得。最高附魔力是最低 +10(:32),所以 Lv3 仍可被强制施加。

「17 个效果」经两种方式核对,结论一致:

  1. OpenBlocks.java:755-784(整个 postInit 方法)中 registerFlimFlam( 的调用次数 = 17
  2. enchantments/flimflams/ 目录下的 .java 文件数 = 18,减去 FlimFlamRegistry.java = 17

注意:用 *FlimFlam.java 通配会得到 16,因为 SquidFilmFlam.java 命名为 FilmFlam 而非 FlimFlam。这是本项目里唯一一个文件名与类名后缀不一致的 FlimFlam 实现。

交互

触发 行为
FlimFlam 等级差满足条件 按幸运值加权抽取 1 个效果
sound 效果 markSilent() —— 不显示聊天提示(OpenBlocks.java:770)
护甲上 爆炸 ExplosiveEnchantmentsHandler 处理
护甲上 背水一战 LastStandEnchantmentsHandler 处理
/flimflam 指令 强制触发,见游戏规则与指令

合成配方

3 个附魔均没有配方——通过附魔台、指令或物品 NBT 获得。

相关条目