附魔: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 个效果」经两种方式核对,结论一致:
OpenBlocks.java:755-784(整个postInit方法)中registerFlimFlam(的调用次数 = 17enchantments/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 获得。
相关条目
- 模组 API 与扩展点 -
IFlimFlamRegistry/IFlimFlamAction/IFlimFlamDescription三个扩展接口 - 游戏规则与指令 -
/flimflam指令 - 集成 / 外部模组 - FlimFlam 效果的软依赖