药水与药剂
基本信息
| 属性 | 值 |
|---|---|
| 药水枚举 | 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 体系,而本仓不含原版源码可作最终裁定(见上文说明)。