- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】MCreator
MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.
导读
本文围绕 MCreator 方块编辑器中「Enable block output comparator data」(启用方块输出比较器数据)这一参数展开,说明如何让自定义方块在容纳物品(具备物品栏)时,向红石比较器输出基于物品数量的模拟红石信号。读者将掌握该参数在 GUI 中的位置与依赖关系、底层数据模型字段、NeoForge 端生成代码的原理,以及一套可直接落地的红石自动化设计思路。
一、参数是什么:一句话定位
MCreator 官方的中文帮助文档对block/comparator_data给出的说明非常精炼:
如果勾选该参数,红石比较器将会根据方块内存储的物品数量来输出红石信号。
(英文原文:Check this parameter if you want the block to work with comparators.,德文原文:Aktivieren Sie diesen Parameter, wenn der Block mit Vergleichern arbeiten soll.)
也就是说,这是一个布尔开关(checkbox):当自定义方块拥有物品栏(inventory)时,勾选它可以让该方块成为红石比较器的"模拟信号源",比较器输出的信号强度与方块内物品的数量/占用程度成正比。
该帮助文档在多语言目录下同步维护,中文版位于 plugins/mcreator-localization/help/zh_CN/block/comparator_data.md,德语版即本次关联文档位于 plugins/mcreator-localization/help/de_DE/block/comparator_data.md。
二、GUI 中的位置与操作步骤
在 MCreator 中编辑方块(Block)元素时,该参数位于方块 GUI 的"Advanced"(高级)页签、Tile Entity 相关区块中。
2.1 界面实现证据
在方块编辑器源码 BlockGUI.java 中,该选项由复选框控件承载:
private final JCheckBox inventoryComparatorPower = L10N.checkbox("elementgui.common.enable");它被放置在一个 8 行 × 2 列的属性面板中,并配有一个帮助按钮,帮助按钮直接绑定到本文所述的帮助文档条目:
props.add(HelpUtils.wrapWithHelpButton(this.withEntry("block/comparator_data"), L10N.label("elementgui.block.comparator_data"))); props.add(inventoryComparatorPower);界面标签文案来自本地化文件 plugins/mcreator-localization/lang/texts.properties:
elementgui.block.comparator_data=Enable block output comparator data:2.2 操作步骤
- 打开(或新建)一个方块元素,进入Advanced页签;
- 在 Tile Entity 属性区域勾选"Has inventory"(有物品栏)—— 这是本参数生效的前提条件;
- 勾选"Enable block output comparator data"(启用方块输出比较器数据);
- 按需配置物品栏大小(
Inventory size)、堆叠上限(Inventory stack size)等参数; - 保存并生成代码,将 mod 编译后放入游戏测试。
2.3 依赖关系与默认值
从源码看,该复选框的可用性与"有物品栏"强绑定。当未勾选 Has inventory 时,refreshFieldsTileEntity()会将其置灰禁用:
private void refreshFieldsTileEntity() { boolean hasInventorySelected = hasInventory.isSelected(); ... inventoryDropWhenDestroyed.setEnabled(hasInventorySelected); inventoryComparatorPower.setEnabled(hasInventorySelected); ... }(见 BlockGUI.java)
同时,在新建方块时该选项默认被勾选:
inventoryComparatorPower.setSelected(true);(见 BlockGUI.java)
保存元素时,GUI 状态写入数据模型:
block.inventoryComparatorPower = inventoryComparatorPower.isSelected();加载元素时则反向回填:
inventoryComparatorPower.setSelected(block.inventoryComparatorPower);(分别见 BlockGUI.java 与 BlockGUI.java)
三、数据模型:Block 元素中的字段
该开关在方块数据模型类 Block.java 中对应一个布尔字段,紧邻物品栏相关字段:
public boolean hasInventory; @ModElementReference(acceptedTypes = { GUI.class }) @Nullable public String guiBoundTo; public boolean openGUIOnRightClick; @Numeric(init = 9, min = 0, max = 256, step = 1) public int inventorySize; @Numeric(init = 99, min = 1, max = 1024, step = 1) public int inventoryStackSize; public boolean inventoryDropWhenDestroyed; public boolean inventoryComparatorPower;(见 Block.java)
需要注意的字段约束:
inventorySize取值范围 0–256,默认 9(对应原版一行的物品栏);inventoryStackSize取值范围 1–1024,默认 99;inventoryComparatorPower为纯布尔开关,无数值参数——比较器输出强度由物品栏内容自动计算,无需手动指定。
在集成测试中,该字段也被纳入随机化测试数据,用于验证生成器的健壮性:
block.inventoryComparatorPower = random.nextBoolean();(见 TestWorkspaceDataProvider.java)
四、生成代码原理:NeoForge 端的模拟信号实现
勾选该参数后,MCreator 的代码生成器会在生成的方块 Java 类中写入两个方法重写。以 1.21.1 NeoForge 生成模板 block.java.ftl 为例:
<#if data.inventoryComparatorPower> @Override public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override public int getAnalogOutputSignal(BlockState blockState, Level world, BlockPos pos) { BlockEntity tileentity = world.getBlockEntity(pos); if (tileentity instanceof ${name}BlockEntity be) return AbstractContainerMenu.getRedstoneSignalFromContainer(be); else return 0; } </#if>(见 block.java.ftl)
在 26.3.x 新版 NeoForge 模板 block.java.ftl 中,getAnalogOutputSignal签名多了一个Direction direction参数(NeoForge 新版 API 的变化):
@Override public boolean hasAnalogOutputSignal(BlockState state) { return true; } @Override public int getAnalogOutputSignal(BlockState blockState, Level world, BlockPos pos, Direction direction) { BlockEntity tileentity = world.getBlockEntity(pos); if (tileentity instanceof ${name}BlockEntity be) return AbstractContainerMenu.getRedstoneSignalFromContainer(be); else return 0; }(见 block.java.ftl)
4.1 关键 API 含义
hasAnalogOutputSignal()返回true:声明该方块具备"模拟输出"能力,红石比较器可以读取它;getAnalogOutputSignal():返回 0–15 的信号强度;AbstractContainerMenu.getRedstoneSignalFromContainer(be):Minecraft 原版提供的方法,它根据容器中已占用槽位的数量计算信号强度,公式为信号强度 = 占用槽位数 ÷ 总槽位数 × 14(有物品的槽计 1,满堆叠可计 2,上限 15)。这正是"比较器根据方块内存储的物品数量输出红石信号"这一描述在引擎层面的实现。
4.2 与容器物品变化联动
需要留意:模拟信号并不会凭空刷新。容器内容发生变化后,方块需要通知周围方块"重新读取信号"。生成模板中与物品栏销毁相关的onRemove/affectNeighborsAfterRemoval逻辑会调用world.updateNeighbourForOutputSignal(pos, this)(1.21.1 模板,见 block.java.ftl)或Containers.updateNeighboursAfterDestroy(26.3.x 模板),保证比较器读数在物品变化后同步刷新。在游戏内,漏斗、投掷器或玩家手动放入/取出物品时,原版容器逻辑同样会触发邻居信号更新。
五、实战应用:信号读取与两种比较器模式
勾选该参数后,将红石比较器对准自定义方块即可读取信号。玩家可结合实际玩法设计:
5.1 经典应用场景
| 场景 | 设计思路 |
|---|---|
| 物品储量指示 | 用比较器读取箱子类方块,配合红石灯/信号强度解码器显示储量百分比 |
| 自动熔炉/自动合成控制 | 当容器内物品达到阈值时输出信号,控制投掷器或活塞启停 |
| 自动补货系统 | 信号低于阈值时激活漏斗链,向容器补充原料 |
| 存储统计 | 多个方块经比较器汇总,配合减法模式计算差额 |
5.2 比较器的两种模式
- 比较模式(默认):比较器输出信号强度 = 方块模拟信号强度。适合做"储量指示"——物品越多信号越强;
- 减法模式(右键点击比较器切换):输出 =
max(0, 侧向输入信号 − 后方方块信号)。适合做"差值检测",例如检测容器是否未满。
5.3 应用前提与限制
- 必须勾选 "Has inventory":
inventoryComparatorPower仅在方块具备物品栏时生效,GUI 也会在未勾选物品栏时禁用该选项(见上文refreshFieldsTileEntity); - 信号基于槽位占用而非物品总数:
getRedstoneSignalFromContainer按占用槽位比例计算,因此物品栏越大,信号分辨率越高——例如 9 格物品栏每格约贡献 1–2 级信号,而 27 格物品栏可提供更细腻的梯度; - 需要容器内容变化时自动刷新:生成代码依赖容器的
setChanged()通知机制,确保比较器读数实时准确; - 该参数只影响"模拟信号输出",与方块自身的红石强/弱充能(
emittedRedstonePower等参数)是两套独立机制,不要混淆。
六、与其他红石相关参数的配合
在 BlockGUI.java 的属性面板中,该参数与以下选项同处 Tile Entity 区块,可组合出完整的红石交互方案:
- Has inventory / Inventory size / Inventory stack size:定义物品栏本身,是比较器信号的基础;
- Drop inventory items when destroyed:控制方块被破坏时是否掉落物品,同时触发邻居信号更新;
- GUI binding:为方块绑定 GUI,让玩家可以手动存取物品从而改变比较器读数;
- Input slots / Output slots:配合自动化(漏斗)定义哪些槽位可进/可出,影响"占用槽位"的计算结果。
七、小结
inventoryComparatorPower是 MCreator 方块元素中一个体积小但作用关键的开关:它通过生成hasAnalogOutputSignal与getAnalogOutputSignal两个方法,并复用原版AbstractContainerMenu.getRedstoneSignalFromContainer容器信号算法,让自定义方块无缝接入原版红石比较器生态。理解它的依赖前提(必须拥有物品栏)、默认开启行为以及基于槽位占用比例的信号计算规则,可以帮助你在做自动化存储、资源管理和红石机械时准确设计信号阈值,避免"信号跳变"或"读数不准"等常见问题。
延伸阅读
- 中文帮助文档:plugins/mcreator-localization/help/zh_CN/block/comparator_data.md
- GUI 实现:src/main/java/net/mcreator/ui/modgui/BlockGUI.java
- 数据模型:src/main/java/net/mcreator/element/types/Block.java
- 1.21.1 NeoForge 生成模板:plugins/generator-1.21.1/neoforge-1.21.1/templates/block/block.java.ftl
- 26.3.x NeoForge 生成模板:plugins/generator-26.3.x/neoforge-26.3/templates/block/block.java.ftl
- 集成测试:src/test/java/net/mcreator/integration/TestWorkspaceDataProvider.java
- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】MCreator
MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.
相关推荐
SilentPatch:终极GTA三部曲兼容性修复方案深度解析
SilentPatch:终极GTA三部曲兼容性修复方案深度解析 在现代操作系统上重温经典GTA游戏时,技术兼容性问题常常成为玩家最大的障碍。游戏崩溃、分辨率不兼
游戏开发逆向工程极客时间电子书:构建技术开发者完整知识体系的最佳路径
极客时间电子书:构建技术开发者完整知识体系的最佳路径 在技术快速迭代的今天,开发者面临着知识碎片化、学习路径模糊的普遍挑战。GitHub_Trending/ge
终极Katana输出模块指南:5种自定义数据格式轻松掌握
终极Katana输出模块指南:5种自定义数据格式轻松掌握 Katana作为下一代爬虫和蜘蛛框架,其强大的输出模块允许用户灵活定制数据格式以满足不同场景需求。本文
网页爬虫网络安全CLI应用安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考