☰
MCreator 自定义方块与红石比较器数据输出:inventoryComparatorPower 参数完全指南
2026/10/16 1:45:11 网站建设 项目流程
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】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.

项目地址:https://gitcode.com/gh_mirrors/mc/MCreator
点击查看免费下载

导读

本文围绕 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 操作步骤

  1. 打开(或新建)一个方块元素,进入Advanced页签;
  2. 在 Tile Entity 属性区域勾选"Has inventory"(有物品栏)—— 这是本参数生效的前提条件;
  3. 勾选"Enable block output comparator data"(启用方块输出比较器数据);
  4. 按需配置物品栏大小(Inventory size)、堆叠上限(Inventory stack size)等参数;
  5. 保存并生成代码,将 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.

项目地址:https://gitcode.com/gh_mirrors/mc/MCreator
点击查看免费下载

相关推荐

上一篇:Capacitor国际化方案:多语言支持与地区适配全指南
下一篇:极致压缩!OpenAI Baselines模型瘦身指南:从512MB到64MB的推理加速实践

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询