魔杖等级系统(Wand Tier System)
BetterBuildersWands 的"等级"由两层机制共同决定,源码中并没有显式的 Tier 枚举:
- 单次操作的方块上限 —— 由
IWand实现 + 物品最大耐久共同决定 - 锁定模式的自由度 —— 由物品类(
ItemBasicWand的三个子类)决定
⚠️ Unbreakable Wand 的等级同时还体现在 ItemStack 的 meta(= 耐久值) 上,见下文专节。
单次放置方块上限对比
上限公式只有两条,分别对应两个 IWand 实现:
// RestrictedWand —— 耐久型魔杖
Math.min(itemStack.getMaxDamage() - itemStack.getItemDamage(), this.blocklimit)
// UnbreakingWand —— 永恒魔杖
(itemStack.getItemDamage() <= 0) ? 4096 : 1 << itemStack.getItemDamage()
| 属性 | Stone Wand | Iron Wand | Diamond Wand | Unbreakable Wand |
|---|---|---|---|---|
| 注册名 | wandStone |
wandIron |
wandDiamond |
wandUnbreakable |
| 物品类 | ItemRestrictedWandBasic |
ItemRestrictedWandAdvanced |
ItemUnrestrictedWand |
ItemUnrestrictedWand |
IWand 实现 |
RestrictedWand(5) |
RestrictedWand(9) |
RestrictedWand(EMERALD.getMaxUses()) = RestrictedWand(1561) |
UnbreakingWand() |
blocklimit |
5 | 9 | 1561 | 不适用 |
| 物品最大耐久 | ToolMaterial.STONE.getMaxUses() = 131 |
ToolMaterial.IRON.getMaxUses() = 250 |
配置文件 diamond_wand_durability,默认 10000 |
未设置(setMaxDamage 从未调用,保持 0) |
| 每次放置消耗耐久 | 1 | 1 | 1 | 0(永不消耗) |
| 满耐久时单次上限 | 5 | 9 | 1561 | 4096 |
| 破旧时单次上限 | 随耐久线性下降 | 随耐久线性下降 | 随耐久线性下降 | 1 << damage 指数变化 |
| 耗尽行为 | stackSize = 0(消失) |
stackSize = 0(消失) |
stackSize = 0(消失) |
不会消失 |
| 锁定模式数量 | 1 种 | 2 种 | 7 种 | 7 种 |
| 流体模式数量 | 1 种 | 1 种 | 2 种 | 2 种 |
关键结论:Diamond Wand 的 1561 才是它的实际天花板
Diamond Wand 配置文件里给的是 10000 耐久,但 blocklimit 被硬编码为
Item.ToolMaterial.EMERALD.getMaxUses() = 1561。因此:
- 耐久 0 ~ 8444 时:单次受物品数量限制,最多 1561 个方块
- 耐久 8445 ~ 9999 时:单次上限才开始由剩余耐久决定
- 把
diamond_wand_durability调到 1561 以下才会真正限制单次放置量
Stone / Iron Wand 的 blocklimit(5 / 9)远小于其耐久(131 / 250),
所以升级到满耐久对单次放置量毫无帮助 —— 上限永远是 5 和 9。
Unbreakable Wand 的 7 个 meta 等级
UnbreakingWand.getMaxBlocks 直接读 getItemDamage(),而 Unbreakable Wand 的
meta 就是 durability 字段(new ItemStack(itemUnbreakableWand, 1, damage))。
所以每个 meta 等级同时决定了它的方块上限:
| Meta | 方块上限(1 << meta 或特判) |
获得方式 |
|---|---|---|
| 0 | 4096(damage <= 0 特判) |
创造模式 / 默认形态 |
| 4 | 16 | ExtraUtilities builderswand + 木棒(Z 字形) |
| 5 | 32 | 2 × meta 4(无序) |
| 6 | 64 | 2 × meta 5(无序) |
| 12 | 4096 | ExtraUtilities creativebuilderswand + 木棒,或下界之星 + 木棒 |
| 13 | 8192 | 2 × meta 12(无序) |
| 14 | 16384 | 2 × meta 13(无序) |
⚠️ 常见误解:ExtraUtilities 合成链的 meta 4/5/6 方块上限只有 16/32/64, 远低于默认的 meta 0(4096)。ExtraUtilities 链不是"更强的魔杖", 而是一套形态更丰富的选择,真正的强度跃升在 meta 12 → 13 → 14。 meta 4/5/6 只有在安装了 ExtraUtilities 时才会通过
addSubMeta()注册进创造模式物品栏。
锁定模式自由度对比
每种魔杖支持的模式数量由物品类决定,与等级无关:
| 物品类 | 使用的魔杖 | nextMode 循环 |
支持模式数 |
|---|---|---|---|
ItemRestrictedWandBasic |
Stone Wand | 恒定 HORIZONTAL |
1 |
ItemRestrictedWandAdvanced |
Iron Wand | HORIZONTAL ⇄ VERTICAL |
2 |
ItemUnrestrictedWand |
Diamond Wand | 7 种全部轮转 | 7 |
ItemUnrestrictedWand |
Unbreakable Wand | 7 种全部轮转 | 7 |
循环顺序(ItemUnrestrictedWand.nextMode,从默认值 NOLOCK 起算):
NOLOCK → HORIZONTAL → VERTICAL → NORTHSOUTH → EASTWEST
→ VERTICALNORTHSOUTH → VERTICALEASTWEST → NOLOCK
| 切换次数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7+ |
|---|---|---|---|---|---|---|---|---|
| Diamond / Unbreakable | NOLOCK | HORIZONTAL | VERTICAL | NORTHSOUTH | EASTWEST | VERTICALNORTHSOUTH | VERTICALEASTWEST | NOLOCK |
| Iron | HORIZONTAL | VERTICAL | HORIZONTAL | VERTICAL | … | |||
| Stone | HORIZONTAL | HORIZONTAL | HORIZONTAL | — |
流体模式切换则由物品类决定:ItemUnrestrictedWand 在 STOPAT ⇄ IGNORE 间轮转,
ItemRestrictedWandBasic / ItemRestrictedWandAdvanced 的 nextFluidMode()
直接写死 STOPAT,按多少次都回不到 IGNORE。
面锁定(Face Lock)—— 第二根独立的轴
每根魔杖除方向锁定 getMode() 外,还有一根独立的 getFaceLock(),
决定"能不能在点中的那个面上放"。源码中它没有独立枚举,复用 EnumLock:
| 物品类 | getFaceLock() 返回值 |
效果 |
|---|---|---|
ItemRestrictedWandBasic |
恒定 HORIZONTAL |
Stone Wand 只能水平铺面,点顶面/底面时一个方块都不会放 |
ItemRestrictedWandAdvanced |
恒定 NOLOCK |
Iron Wand 不受面限制 |
ItemUnrestrictedWand |
当前模式是 HORIZONTAL 时返回 HORIZONTAL,否则 NOLOCK |
Diamond / Unbreakable 在 HORIZONTAL 模式下也不能点顶面铺层 |
Stone Wand 的
HORIZONTAL模式 +HORIZONTAL面锁定,是它只能盖平面的根本原因 —— 详见 BFS 方块扩展算法 的种子判定一节。
相关条目
- BFS 方块扩展算法 - 上限如何作用于 BFS 搜索
- 魔杖物品通用行为 - 耐久扣除与 NBT 结构
- EnumLock - 7 种方向锁定枚举定义
- EnumFluidLock - 2 种流体锁定枚举定义