☰
MCreator 方块“斧削皮结果“参数(Stripping Result)全面解析:从界面配置到源码生成原理
2026/10/16 2:03:29 网站建设 项目流程
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】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 中方块(Block)与植物(Plant)元素的高级属性"斧削皮结果"(stripping result)展开,讲解如何让自定义方块在使用斧头右键时被"剥皮"并转化为另一个方块(例如原木变成去皮原木)。你将掌握该参数在 BlockGUI 中的配置位置、底层数据模型与hasStrippingResult()判定逻辑,以及它在 1.21.1 与 26.3.x 两代生成器中分别对应的 Java 代码生成与数据驱动(transformables)实现原理,并了解 MCreator 木材包生成器如何自动化配置这一属性。

参数语义:方块被斧头削皮后变成什么

MCreator 的帮助文档体系按语言分目录存放,其中对 "stripping result" 这一参数的定义在各语言版本中保持一致的语义:

  • 默认英文版(default/block/stripping_result.md):"This parameter controls what this block turns into when it's stripped with an axe."
  • 简体中文版(zh_CN/block/stripping_result.md):"此参数控制该方块被斧削皮后的方块。"
  • 捷克语版(即本任务关联文档 cs_CZ/block/stripping_result.md):"Tento parametr určuje, do jakého bloku se blok promění, když je oloupán."(此参数决定方块被削皮后转化为何种方块。)

一句话概括:stripping result 用于声明"当玩家手持斧头右键点击该方块时,方块会变成哪一个方块"。这与原版 Minecraft 中"原木/木头 → 去皮原木/去皮木头"的机制完全一致,是自定义方块模拟木质(或可削皮)方块行为的关键开关。

配套的语言文件 texts.properties 中给出了界面提示的完整文案:"Block can be stripped into: Leave empty if block cannot be stripped",明确指出了该参数的另一个重要约定——留空即表示该方块不可被削皮。

界面配置:在哪里设置这一参数

在 MCreator 中,该参数位于方块(Block)与植物(Plant)元素的Advanced properties(高级属性)面板。以方块为例,相关 UI 逻辑集中在 BlockGUI.java:

  1. 控件创建:strippingResult是一个MCItemHolder类型的方块选择控件,并通过ElementUtil::loadBlocks限定只能从"方块"中选择结果项:
// src/main/java/net/mcreator/ui/modgui/BlockGUI.java#L185 private final MCItemHolder strippingResult = new MCItemHolder(mcreator, ElementUtil::loadBlocks);
  1. 挂接帮助与标签:控件右侧带有帮助按钮,帮助条目 ID 正是block/stripping_result,与帮助文档目录一一对应:
// src/main/java/net/mcreator/ui/modgui/BlockGUI.java#L1032-L1034 advancedProperties.add(HelpUtils.wrapWithHelpButton(this.withEntry("block/stripping_result"), L10N.label("elementgui.block.stripping_result"))); advancedProperties.add(PanelUtils.centerInPanel(strippingResult));
  1. 读写模型:打开已有元素时从模型读取(strippingResult.setBlock(block.strippingResult),BlockGUI.java#L1890),保存时回写(block.strippingResult = strippingResult.getBlock(),BlockGUI.java#L2064)。

实操提示:在高级属性面板中找到 "Block can be stripped into" 输入框,点击右侧的方块选择器选取目标方块(自定义方块或原版方块均可);如果希望该方块不可被削皮,保持该字段为空即可。从源码可以看出,结果被限定为"方块"类目,因此不能填入物品、流体等非方块元素。

数据模型:字段与判定逻辑

字段定义

方块与植物元素在数据模型层面都拥有该字段,类型为MItemBlock(MCreator 的方块/物品引用类型):

// src/main/java/net/mcreator/element/types/Block.java#L157 public MItemBlock strippingResult; // src/main/java/net/mcreator/element/types/Plant.java#L117 public MItemBlock strippingResult;

判定逻辑

两个元素类都提供了统一的空值判定方法,用于判断"该方块是否配置了削皮结果":

// src/main/java/net/mcreator/element/types/Block.java#L367-L369 public boolean hasStrippingResult() { return strippingResult != null && !strippingResult.isEmpty(); }

值得注意的是,Block.java在收集元素的 BaseType(生成器特性的基础类型集合)时会根据该判定结果动态追加类型:

// src/main/java/net/mcreator/element/types/Block.java#L558-L562 if (hasStrippingResult() && ModuleDescriptor.Version.parse(getModElement().getGenerator().getGeneratorMinecraftVersion()) .compareTo(ModuleDescriptor.Version.parse("26.3")) >= 0) { baseTypes.add(BaseType.TRANSFORMABLE); }

这段代码揭示了关键事实:从 Minecraft 26.3 版本起,配置了削皮结果的方块会被标记为TRANSFORMABLE基础类型,从而触发新版本生成器中"可变形方块"(transformables)的数据生成流程(见下文)。

代码生成:1.21.1 时代的 Java 实现

在 1.21.1 代 NeoForge 生成器中,削皮行为通过覆写方块类的getToolModifiedState方法实现。相关模板位于 plugins/generator-1.21.1/neoforge-1.21.1/templates/block/block.java.ftl#L548-L555:

<#if data.strippingResult?? && !data.strippingResult.isEmpty()> @Override public BlockState getToolModifiedState(BlockState blockstate, UseOnContext context, ItemAbility itemAbility, boolean simulate) { if (ItemAbilities.AXE_STRIP == itemAbility && context.getItemInHand().canPerformAction(itemAbility)) { return ${mappedBlockToBlock(data.strippingResult)}.withPropertiesOf(blockstate); } return super.getToolModifiedState(blockstate, context, itemAbility, simulate); } </#if>

生成的 Java 代码逻辑包含三个要点:

  1. 能力判定:仅当工具行为(ItemAbility)为ItemAbilities.AXE_STRIP(即"斧头剥皮")时才触发转换;
  2. 工具匹配:context.getItemInHand().canPerformAction(itemAbility)校验玩家手中物品确实支持该动作,确保只有斧类工具能触发;
  3. 属性保留:withPropertiesOf(blockstate)会把原方块的状态属性(如朝向、含水状态等)复制给结果方块,避免剥皮后丢失方位信息。

植物元素的实现完全相同,见 plant.java.ftl#L187-L194,因此该参数对 Block 与 Plant 两类元素均生效。

数据驱动:26.3.x 的 transformables 实现

在 26.3.x 代 NeoForge 生成器中,削皮行为改由数据驱动方式声明,模板为 plugins/generator-26.3.x/neoforge-26.3/templates/elementinits/transformables.json.ftl:

{ "values": { "${modid}:${block.getModElement().getRegistryName()}": { "transformer": "minecraft:axe", "transform_data": { "block_state_provider": { "type": "minecraft:rule_based", "rules": [ { "if_true": { "type": "minecraft:matching_blocks", "blocks": "${modid}:${block.getModElement().getRegistryName()}" }, "then": { "type": "minecraft:copy_properties", "source": { "id": "${mappedMCItemToRegistryName(block.strippingResult)}" } } } ] }, "sound": "minecraft:item.axe.strip" } } } }

该模板通过遍历transformables集合(正是上文BaseType.TRANSFORMABLE标记的元素集合)生成注册表数据:

  • transformer声明触发工具为minecraft:axe;
  • block_state_provider采用rule_based规则,匹配本方块后将方块状态转换为strippingResult指向的目标方块;
  • 通过copy_properties保留原始方块属性;
  • sound固定使用原版的剥皮音效minecraft:item.axe.strip。

这解释了为什么Block.java只在 Minecraft 版本 >= 26.3 时才添加TRANSFORMABLE类型——因为数据驱动方案是该版本起的生成器能力。

实战案例:木材包生成器如何自动配置削皮结果

MCreator 内置的木材包生成工具(Wood Pack Maker)是把"削皮结果"用到极致的自动化场景。在 src/main/java/net/mcreator/ui/dialogs/tools/WoodPackMakerTool.java 中:

  1. 先自动生成Stripped<name>Log与Stripped<name>Wood两个去皮方块(WoodPackMakerTool.java#L302-L342),包括自动生成剥皮后的侧面/顶部纹理(使用降低饱和度的深色调,见 #L121-L161)以及合适的硬度、抗爆性、斧头破坏工具等属性;
  2. 在所有去皮方块全部生成完成后,才把削皮结果写回原始方块(WoodPackMakerTool.java#L344-L346):
// we update stripping results of log blocks *after* we add the stripped variants to the workspace logBlock.strippingResult = new MItemBlock(workspace, "CUSTOM:Stripped" + name + "Log"); woodBlock.strippingResult = new MItemBlock(workspace, "CUSTOM:Stripped" + name + "Wood");

这里有两个值得注意的工程细节:

  • 引用方式:MItemBlock使用"CUSTOM:Stripped" + name + "Log"形式的注册名引用工作区中的自定义元素,说明削皮结果可以直接指向同工作区的其他自定义方块;
  • 执行顺序:源码注释明确强调必须先添加去皮方块到工作区、再设置削皮结果,保证引用不会悬空——这提醒我们在手工配置时,也应确保目标方块元素已存在于工作区。

测试覆盖:自动化验证削皮配置

集成测试数据提供器TestWorkspaceDataProvider.java会对生成的测试工作区随机填充该属性,用于验证不同生成器配置下的代码生成正确性:

  • 植物元素:plant.strippingResult = new MItemBlock(modElement.getWorkspace(), getRandomMCItem(random, blocks).getName());(TestWorkspaceDataProvider.java#L1196)
  • 方块元素:block.strippingResult = new MItemBlock(modElement.getWorkspace(), getRandomMCItem(random, blocks).getName());(TestWorkspaceDataProvider.java#L2328)

从测试可见,该属性既可配置为自定义方块,也可配置为原版方块,随机填充的方式保证了生成器模板在多种取值下都能产出可编译代码。

最佳实践与注意事项

综合上述源码事实,使用 stripping result 参数时建议遵循以下原则:

  1. 留空即禁用:不需要削皮行为的方块应保持该字段为空(界面提示语明确如此约定),此时生成器不会生成任何削皮相关代码。
  2. 目标必须是方块:MCItemHolder通过ElementUtil::loadBlocks限定候选范围,只能选择方块类元素。
  3. 确保目标方块已存在:参考木材包生成器的做法,先在元素列表中创建去皮后的方块,再回到原方块配置削皮结果,避免空引用。
  4. 属性会保留:由于生成代码/数据使用了withPropertiesOf与copy_properties,削皮后目标方块的朝向、含水等属性会沿用原方块,配置时无需为属性差异担忧。
  5. 版本差异:1.21.1 及更早代生成器采用 Java 代码覆写getToolModifiedState;26.3 起改用数据驱动的 transformables 注册表方式,但配置语义完全一致——只要在界面上设置好"削皮结果",生成器会自动选择对应版本的实现路径(BaseType.TRANSFORMABLE的追加由 Block.java 依据 Minecraft 版本自动判断)。
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】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
点击查看免费下载

相关推荐

上一篇:CANN/metadef SetData函数
下一篇:Android组件化架构评审 checklist:Atlas关键指标

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

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

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

立即咨询