- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】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 中 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>从模板结构可以看出:
- min/max 直接传入 Minecraft 的
RangedAttribute构造函数——构造签名为RangedAttribute(key, defaultValue, minValue, maxValue),四个数值参数按“默认值、最小值、最大值”的顺序以double字面量(后缀d)写入生成代码; - 生成的属性默认调用
.setSyncable(true),属性值可同步到客户端; - 同目录生成的
...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.defaultValue | RangedAttribute第 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.
相关推荐
MCreator 自定义属性(Attribute)最小/最大值参数解析:取值范围设置、界面校验与代码生成
MCreator 自定义属性(Attribute)最小/最大值参数解析:取值范围设置、界面校验与代码生成 本文围绕 MCreator 中「属性(Attribut
低代码代码生成桌面应用游戏开发Psalm 的 InternalProperty 问题详解:如何用 @internal 与 @psalm-internal 约束属性访问范围
Psalm 的 InternalProperty 问题详解:如何用 @internal 与 @psalm internal 约束属性访问范围 InternalP
开发工具代码质量质量保障Layui日期范围选择面板的min/max属性与默认显示问题解析
Layui日期范围选择面板的min/max属性与默认显示问题解析 问题现象 在使用Layui的日期范围选择组件时,开发者可能会遇到一个特殊现象:当设置了min和
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考