模板(OpenBlocks:stencil)与颜料刷(OpenBlocks:paintBrush)

基本信息

物品 注册名 类 声明位置
模板 OpenBlocks:stencil openblocks.common.item.ItemStencil OpenBlocks.java:452(textureName = "stencilcover_full")
颜料刷 OpenBlocks:paintBrush openblocks.common.item.ItemPaintBrush OpenBlocks.java:449(unlocalizedName = "paintbrush")

另有 OpenBlocks:generic 里的 unpreparedStencil(未加工模板坯)与 sketchingPencil(素描铅笔)——见通用 meta 物品。

功能:15 种模板

openblocks.common.Stencil 是一个 15 项枚举(common/Stencil.java:9-25),每个常量带一个贴图名:

# 枚举常量 贴图名 中文名
0 CREEPER_FACE creeperface 苦力怕脸
1 BORDER border 边框
2 STRIPES stripes 条纹
3 CORNER corner 角
4 CORNER2 corner2 角 2
5 CORNER3 corner3 角 3
6 HOLE hole 洞
7 SPIRAL spiral 螺旋
8 THICKSTRIPES thickstripes 粗条纹
9 SPLAT splat 泼溅
10 STORAGE storage 存储
11 HEART heart 心
12 HEART2 heart2 心 2
13 MUSIC music 音符
14 BALLOON balloon 气球

每个模板注册两张贴图(Stencil.java:35-39):

  • openblocks:stencil_<name> —— 用于 getBlockIcon()
  • openblocks:stencilcover_<name> —— 用于 getCoverBlockIcon()

物品图标取 cover 图标,为 null 时回退到 itemIcon(ItemStencil.java:36-39)。创造模式子物品按 stencil.ordinal() 逐个生成(:41-47)。

模板的使用流程

ItemStencil.onItemUse(ItemStencil.java:49-74):

  1. 若 PaintUtils.instance.isAllowedToReplace(...) 允许,先把目标方块就地换成画布(BlockCanvas.replaceBlock,:53-55)
  2. 取 TE,若是 TileEntityCanvas 则取 stack.getItemDamage() 作为 stencilId(:61)
  3. stencil = Stencil.VALUES[stencilId],越界时 catch (ArrayIndexOutOfBoundsException) 返回 false(:62-67)——损坏数据不会崩客户端
  4. canvas.useStencil(side, stencil) 成功则消耗 1 个模板(:69)

useStencil 的细节(TileEntityCanvas.java:181-190):若该面已是最后一层模板且新模板与旧模板相同则返回 false(拒绝同一模板叠加);否则旧的顶层模板以 new ItemStack(Items.stencil, 1, oldStencil.ordinal()) 完整退还(:187)——所以换模板不会丢失。

颜料刷

ItemPaintBrush 的关键常量(ItemPaintBrush.java:30-40):

常量 值 含义
SINGLE_COLOR_THRESHOLD 16 低于此数视为单色,走纯色渲染路径
TAG_COLOR "color" 颜色存 NBT
MAX_USES 24 耐久 24
堆叠 1 setMaxStackSize(1)

其他颜料类物品

OpenBlocks:tastyClay(ItemTastyClay extends ItemFood,ItemTastyClay.java:12)是可食用的黏土块。OpenBlocks:infoBook(ItemInfoBook,:12)打开信息书。

数值

数值名 来源 值
模板种类 Stencil 枚举 15(Stencil.java:9-25)
每种模板贴图数 registerBlockIcons 2(Stencil.java:37-38)
模板 meta 范围 Stencil.VALUES[dmg] 0 ~ 14(ItemStencil.java:38)
颜料刷耐久 MAX_USES 24(ItemPaintBrush.java:34)
颜料刷单色阈值 SINGLE_COLOR_THRESHOLD 16(ItemPaintBrush.java:30)
颜料刷堆叠 硬编码 1(ItemPaintBrush.java:40)

15 这个数字经两种方式核对:Stencil.java 中 ^\s+[A-Z][A-Z0-9]*\(" 形式的常量声明行计数,以及 }, / ; 分隔的枚举体手工清点,结果一致。

交互

触发 行为
模板右键方块 允许替换时先转成画布,再贴模板;成功消耗 1 个
对同一面重复贴同一模板 拒绝(TileEntityCanvas.java:184-186)
换模板 旧模板作为物品退还(TileEntityCanvas.java:187)
模板物品损坏 / meta 越界 ArrayIndexOutOfBoundsException 被捕获,返回 false(ItemStencil.java:63-67)
颜料刷用尽 24 次后损坏

合成配方

模板在 Config.registerCraftingRecipes 中没有直接合成配方——它由绘图桌用「未加工模板坯 + 素描铅笔」制作(Config.java:1073-1088)。这是 OpenBlocks 唯一的内容创作型配方。

颜料刷的配方位于 Config.java 的物品段(未逐条核对,故不在此断言字符表)。

相关条目