ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MCreator 自定义属性:min/max value 参数如何约束属性取值范围

MCreator 自定义属性:min/max value 参数如何约束属性取值范围
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】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 中 Attribute(自定义属性)元素的min/max value参数——它决定了属性值被修改、叠加修饰器(modifier)之后允许落入的取值边界。读完本篇,你能理解该参数在数据模型中的定义、在属性编辑界面中的校验规则,以及它最终如何被写入生成的 NeoForge 模组代码(RangedAttribute构造),从而为自己的实体设计一个“永远不会越界”的属性。

参数语义:属性值的硬性上下限

官方帮助文档 plugins/mcreator-localization/help/default/attribute/min_max_value.md 对这一参数的完整定义只有一句话:

This parameter controls the minimum and maximum values the attribute's value can be set to. (该参数控制属性值可以被设置到的最小值和最大值。)

这句话的隐含前提可以在同目录的另一篇帮助文档 default_value.md 中找到,它解释了属性值与基值(base value)的区别:

The value of an attribute is the number that is calculated after modifiers and min/max restrictions are applied on its base value. (属性的“值”是在其基值上应用修饰器以及 min/max 限制之后计算得到的数字。)

也就是说,min/max value并不改变属性本身的基值,而是作为一道“钳制”边界:当游戏内通过命令、过程(procedure)或修饰器改变属性基值并叠加各类 modifier 后,最终生效的属性值会被限制在[minValue, maxValue]区间内。

数据模型:minValue 与 maxValue 字段

在 MCreator 的元素类型定义中,该参数对应 Attribute.java 中的两个double字段:

@Numeric(init = 0, min = -Double.MAX_VALUE, max = Double.MAX_VALUE, step = 1.0) public double minValue; @Numeric(init = 1, min = -Double.MAX_VALUE, max = Double.MAX_VALUE, step = 1.0) public double maxValue; @Numeric(init = 0, min = -Double.MAX_VALUE, max = Double.MAX_VALUE, step = 1.0) public double defaultValue;

从注解可以读出该参数的取值特性:

项目说明
字段类型double,支持小数
合法范围-Double.MAX_VALUE ~ Double.MAX_VALUE,即理论上不限
步进1.0(数值编辑器按步长递增)
新建时的初始值minValue = 0、maxValue = 1、defaultValue = 0(由@Numeric(init = ...)决定)

值得注意的细节是:初始值min=0、max=1恰好让默认的defaultValue=0落在区间内,因此新建一个属性时界面校验是天然通过的。

编辑器界面:JMinMaxSpinner 与两条校验规则

在属性编辑界面中,min/max value 并不是两个独立的输入框,而是一个成对的“最小-最大”联动控件。AttributeGUI.java 中可以看到:

private final JMinMaxSpinner minMaxValue = ComponentFromAnnotation.minMaxSpinner(Attribute.class, "minValue", "maxValue");

控件上的帮助按钮指向的正是本文的主题文档条目attribute/min_max_value(AttributeGUI.java),界面标签在中文语言包中翻译为“属性值的范围:”(texts_zh_CN.properties)。

更重要的是,界面为该参数注册了两条实时校验规则(AttributeGUI.java):

minMaxValue.setValidator(() -> { if (minMaxValue.getMinValue() > (double) defaultValue.getValue()) return new ValidationResult(ValidationResult.Type.ERROR, L10N.t("elementgui.attribute.default_lower_than_min")); else if (minMaxValue.getMaxValue() < (double) defaultValue.getValue()) return new ValidationResult(ValidationResult.Type.ERROR, L10N.t("elementgui.attribute.default_higher_than_max")); return ValidationResult.PASSED; });

对应中文语言包中的错误文案(texts_zh_CN.properties):

  • elementgui.attribute.default_lower_than_min→ “默认基值不能小于最小值。”
  • elementgui.attribute.default_higher_than_max→ “默认基值不能大于最大值。”

实操含义:min/max value与default value是强耦合的——默认基值必须落在[min, max]区间内,否则该元素无法通过校验、不能保存生成。调整上下限时务必同步检查默认基值,这是使用此参数最常见的坑。

代码生成:min/max 如何进入 RangedAttribute

在 MCreator 的 NeoForge 生成器中,属性元素会由全局模板 attributes.java.ftl 生成一个注册类(26.3 生成器使用同构模板 plugins/generator-26.3.x/neoforge-26.3/templates/elementinits/attributes.java.ftl)。关键片段为:

<#list attributes as attribute> public static final DeferredHolder<Attribute, Attribute> ${...REGISTRYNAME...} = REGISTRY.register("${...}", () -> new RangedAttribute("attribute.${modid}.${...}", ${attribute.defaultValue}d, ${attribute.minValue}d, ${attribute.maxValue}d) .setSyncable(true) <#if attribute.sentiment != "POSITIVE">.setSentiment(Attribute.Sentiment.${attribute.sentiment})</#if>); </#list>

从模板结构可以看出:

  1. min/max 直接传入 Minecraft 的RangedAttribute构造函数——构造签名为RangedAttribute(key, defaultValue, minValue, maxValue),四个数值参数按“默认值、最小值、最大值”的顺序以double字面量(后缀d)写入生成代码;
  2. 生成的属性默认调用.setSyncable(true),属性值可同步到客户端;
  3. 同目录生成的...Attributes.java文件头部带有MCreator note: This file will be REGENERATED on each build注释,提示该文件每次构建会重新生成,不应手工修改。

因此,从源码结构看,取值范围的强制执行发生在 Minecraft 自身的RangedAttribute/属性实例逻辑中:MCreator 的职责是把你界面上填写的minValue、maxValue原样落到构造函数里,属性叠加 modifier 后是否被钳制回区间内,由RangedAttribute的实现保证。若需要验证实际效果,可参考 default_value.md 所述:属性“值” = 基值 + modifiers,再经 min/max 限制。

参数速查

参数数据字段生成目标约束
最小值Attribute.minValue(Attribute.java)RangedAttribute第 3 个构造参数必须 ≤ 默认基值,否则界面报default_lower_than_min
最大值Attribute.maxValue(Attribute.java)RangedAttribute第 4 个构造参数必须 ≥ 默认基值,否则界面报default_higher_than_max
默认基值(关联参数)Attribute.defaultValueRangedAttribute第 2 个构造参数必须位于[min, max]内

与相邻参数的配合

min/max value通常与同一编辑页的其他参数一起决策(AttributeGUI.java):

  • default value(默认基值):属性的初始数值,详见 default_value.md;
  • sentiment(属性性质):POSITIVE/NEUTRAL/NEGATIVE,影响属性修饰器在原版界面中的颜色,对应 sentiment.md;
  • entities / add to players / add to all entities:决定该属性挂载到哪些实体(Attribute.java),详见 entities.md、add_to_players.md、add_to_all_entities.md。生成器会在EntityAttributeModificationEvent回调中为所选实体类型逐个注册该属性(见 attributes.java.ftl)。

小结

MCreator 的min/max value参数是自定义属性取值边界的“最后一公里”:它在数据层由 Attribute.java 的两个双精度字段承载,在界面层由JMinMaxSpinner提供成对编辑并对默认基值做区间校验,最终由 FreeMarker 模板原样写入RangedAttribute构造函数。设计属性时,只要记住“默认基值必须落在 min/max 区间内,越界值会在运行时被 RangedAttribute 钳制回区间”这一条,就能正确使用该参数。

  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

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

相关推荐

上一篇:Spacebot消息绑定(Bindings)详解:如何把不同平台的群聊精准路由给同一个AI Agent
下一篇:LongCat-Video Triton GPU内核优化:TMA描述符与自动调优策略全解析

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进