药水与药剂

基本信息

属性 值
药水枚举 greymerk.roguelike.treasure.loot.Potion(treasure/loot/Potion.java:10),9 个常量
药水 ID 表 Potion.getPotionID(Potion)(treasure/loot/Potion.java:71)
效果枚举 greymerk.roguelike.treasure.loot.PotionEffect(treasure/loot/PotionEffect.java:7),23 个常量
效果 ID 表 PotionEffect.getEffectID(PotionEffect)(treasure/loot/PotionEffect.java:33)
药剂枚举 PotionMixture(treasure/loot/PotionMixture.java:11),6 个常量
药水池类型 PotionType(treasure/loot/PotionType.java)
产出物 new ItemStack(Items.potionitem, 1, id)(treasure/loot/Potion.java:67)

⚠️ 本 mod 有两套药水 ID 表,其中一套与另一套逐项矛盾

本 mod 自带 net.minecraft.potion 的影子类,用来绕开原版 API 直接写药水 damage 值:

  • Potion —— 9 个常量,产出药水物品(Items.potionitem)
  • PotionEffect —— 23 个常量,写入自定义 NBT 效果列表

全树 grep -rn 'net\.minecraft\.potion' 只有 1 处命中(EntityJoinWorld.java:8 导入 PotionEffect)。SegmentTrap.java:10 与 PotionMixture.java(同包无 import)里的 Potion 一律解析到 mod 自己的枚举。

两套 ID 表的对照结果:

Potion 常量 getPotionID 产出 按 getEffectID 该 ID 实际是 应为(getEffectID) 结果
REGEN 1 SPEED 10 ❌
SWIFTNESS 2 SLOWNESS 1 ❌
FIRERESIST 3 HASTE 12 ❌
POISON 4 FATIGUE 19 ❌
HEALING 5 STRENGTH 6 ❌
WEAKNESS 8 JUMP 18 ❌
STRENGTH 9 NAUSEA 5 ❌
SLOWNESS 10 REGEN 2 ❌
HARM 12 FIRERESIST 7 ❌

9 个常量全部错位,无一命中。 证据完全来自仓库内部:Potion.getPotionID(treasure/loot/Potion.java:71-94)的返回值与 PotionEffect.getEffectID(treasure/loot/PotionEffect.java:33-85)的返回值逐项冲突,而后者是一张完整的 1–23 无缺口表,形态上就是 1.7.10 的注册顺序(SPEED=1 …… SATURATION=23),并被 PotionMixture 用来写自定义 NBT。

getPotionID 的表形态(INSTANT_HEALTH=1、SPEED=2、FIRE_RESISTANCE=3、POISON=4、INSTANT_DAMAGE=5、WEAKNESS=8、STRENGTH=9、SLOWNESS=10、REGEN=12)不属于 1.7.10 的 ID 体系。本仓库不含原版 Potion.java,故无法从本仓证明该表来自哪个旧版本;此处只主张「与本 mod 自己的另一张表矛盾」这一可验证事实。

位标记是正确的

尽管基础 ID 表错位,Potion 的位标记与位运算完全正确(treasure/loot/Potion.java:22-25):

常量 值 用途
SPLASH 16384 喷溅(:62)
REGULAR 8192 普通(:64)
UPGRADE 32 强化 I / II(:104)
EXTEND 64 延时(:115)

upgrade / extend 都先 id = id & 15 再或上位标记(:102-104、:113-115),与 1.7.10 把效果 ID 放在低 4 位的布局一致。FIRERESIST 不参与强化、HEALING 与 HARM 不参与延时(:98-100、:109-111),即瞬发型效果按原版规则处理。

药剂(Mixture)

PotionMixture 有 6 个常量(treasure/loot/PotionMixture.java:12-17),每个通过 PotionEffect.addCustomEffect 往 NBT 的 CustomPotionEffects 列表追加多个效果:

药剂 追加的效果(常量与强度) 来源
TEQUILA STRENGTH:3、FATIGUE:1 treasure/loot/PotionMixture.java:27-28
LAUDANUM REGEN:2、WEAKNESS:2、SLOWNESS:2、FATIGUE:2、NAUSEA:0 :35-39
MOONSHINE DAMAGE:2(时长 1)、BLINDNESS:1、RESISTANCE:2 :47-49
ABSINTHE POISON:1(时长 200–499)、NIGHTVISION:1、JUMP:2 :56-58
STOUT REGEN:1、FATIGUE:1、HEALTHBOOST:2 :65-67
VILE 遍历 PotionEffect.values() 随机一个,强度 rand.nextInt(3) :100,127

每种药剂都还叠加一个 Potion.getSpecific(...) 产出的基础药水(treasure/loot/PotionMixture.java:25,33,45,54,63,72),并用 Loot.setItemName 改名、ItemHideFlags.set(ItemHideFlags.EFFECTS, potion) 隐藏效果提示(:29-30 等)。

PotionEffect.addCustomEffect(treasure/loot/PotionEffect.java:87-116)写 NBT 时固定 Ambient = true(:110),Duration 按毫秒存(:109),Amplifier 按字节存(:108)。

数值

数值名 值 来源
Potion 常量数 9 treasure/loot/Potion.java:12-20
PotionEffect 常量数 23 treasure/loot/PotionEffect.java:9-31
PotionMixture 常量数 6 treasure/loot/PotionMixture.java:12-17
getPotionID 错误条目数 9 / 9 本页对照表
getPotionID 未覆盖的 Potion 常量 0 9 个常量全部有 case
AVIDYA(奶桶)出现概率 1/200 treasure/loot/Potion.java:29
NBT 列表键名 CustomPotionEffects treasure/loot/PotionEffect.java:89
NBT 列表类型 10(NBTTagList) treasure/loot/PotionEffect.java:98
SPLASH / REGULAR 位 16384 / 8192 treasure/loot/Potion.java:22-23
UPGRADE / EXTEND 位 32 / 64 treasure/loot/Potion.java:24-25
基础 ID 掩码 id & 15 treasure/loot/Potion.java:102,113

交互

触发 行为
战利品抽到 POTION 分类 ItemPotion.getRandom → Potion.getRandom(treasure/loot/provider/ItemPotion.java:23),1/200 出奶桶,否则随机 9 个 Potion 常量之一
地牢陷阱开火 SegmentTrap 发射 Potion.POISON 或 Potion.HARM 的喷溅瓶(dungeon/segment/part/SegmentTrap.java:101,103)—— 实际落入的分别是 Mining Fatigue II 与 Fire Resistance
Loot.POTION 分类 见 战利品表

意图证据

Potion.java 与 PotionEffect.java 内没有 TODO 或说明注释表明 getPotionID 是待替换的占位实现。仓库只有 1 个 commit(git rev-list --count HEAD = 1),无历史可考。本页据「两张表互相矛盾」这一可复现事实记录问题,不主张作者意图,也不主张这是运行时缺陷 —— 实际表现取决于原版 1.7.10 的 ID 体系,而本仓不含原版源码可作最终裁定(见上文说明)。

相关条目