- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】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(属性)元素中“Attribute default base value”这一核心参数为对象,完整解释 Minecraft 属性体系中“基础值(base value)”与“最终值(value)”的区别、该参数在 MCreator 数据模型与编辑界面中的定义和校验规则,以及它在代码生成阶段如何落地为 NeoForge 的RangedAttribute。读完后你可以准确理解属性默认值的生效时机、合法取值范围、越界校验逻辑,并能在行为(Procedure)中正确读取与改写属性的基础值。
一、什么是属性的默认基础值
MCreator 帮助文档对该参数的原始定义见 default_value.md,其核心表述可归纳为三点:
- 它定义了属性(Attribute)的默认基础值(default base value)。在 Minecraft 中,
LivingEntity上的每个属性实例都持有一个“基础值”,默认基础值就是该属性被赋予给实体时初始使用的基础值。 - 除非游戏内有东西改变它,否则属性一直保留这个值。文档明确列出三类可改变属性值的机制:Procedure(行为/函数)、命令(Command)或修饰器(Modifier)。也就是说,默认基础值是“静态”的,只在实体获得该属性的时刻(或你显式修改时)起作用,运行时不会自动变化。
- 属性“值”与属性“基础值”是两个不同的量。属性最终呈现的数值(value)是在其基础值之上,应用了所有修饰器(Attribute Modifier)以及最小/最大限制(min/max restrictions)之后计算出来的数字。
这个区分正是理解该参数的关键:在 MCreator 中为一个 Attribute 元素填写的defaultValue,生成代码后直接决定了RangedAttribute的构造参数,也就是该属性对所有拥有它的实体的“出厂基础值”。
二、defaultValue 在 MCreator 数据模型中的定义
在 MCreator 主程序源码中,属性元素的字段定义位于 Attribute.java:
public class Attribute extends GeneratableElement { public String name; @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; @LimitedOptions({ "POSITIVE", "NEUTRAL", "NEGATIVE" }) public String sentiment; public boolean addToAllEntities; public boolean addToPlayers; @ModElementReference public List<EntityEntry> entities; ... }从这段结构可以确认几个事实:
defaultValue、minValue、maxValue都是double类型,通过@Numeric注解声明:默认初始值分别为 0、0、1,允许范围为[-Double.MAX_VALUE, Double.MAX_VALUE],步进(step)为1.0。@Numeric注解驱动了编辑界面中对应的数值旋转器(spinner)控件,注解中的init值就是新建元素时输入框的预填值。- 除数值参数外,属性元素还带
sentiment(POSITIVE / NEUTRAL / NEGATIVE,影响修饰器显示颜色)、addToAllEntities/addToPlayers/entities(决定属性赋予哪些实体)等参数,它们与默认基础值共同构成一个完整属性。
可被选用的原版属性清单由 attributes.yaml 数据列表提供,包括MAX_HEALTH、MOVEMENT_SPEED、ATTACK_DAMAGE、FLYING_SPEED、KNOCKBACK_RESISTANCE、SCALE等,行为编辑器中“属性”下拉框与自定义属性入口都基于这份列表。
三、编辑界面:默认值的填写与越界校验
属性编辑界面实现在 AttributeGUI.java。默认基础值控件由注解反射生成:
private final JSpinner defaultValue = ComponentFromAnnotation.spinner(Attribute.class, "defaultValue"); private final JMinMaxSpinner minMaxValue = ComponentFromAnnotation.minMaxSpinner(Attribute.class, "minValue", "maxValue");界面标签文本来自本地化资源 texts.properties 中的elementgui.attribute.default_value=Attribute default base value:,帮助按钮绑定的正是本文的 help 文档条目attribute/default_value。
更重要的是,界面内置了一条针对默认基础值的强校验,直接体现了“默认值必须落在 min/max 区间内”的规则:
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; });对应的报错文案为 “The default base value cannot be smaller than the minimum value.” 与 “The default base value cannot be higher than the maximum value.”。也就是说,MCreator 会在保存前强制保证minValue ≤ defaultValue ≤ maxValue,防止生成出一个基础值超出自身允许区间的属性——这与 Minecraft 对属性值按 min/max 截断的语义保持一致。
四、代码生成:defaultValue 如何变成 RangedAttribute
MCreator 将属性元素交给生成器后,由 FreeMarker 模板 attributes.java.ftl 产出注册类,模板映射规则定义在 attribute.definition.yaml(生成到@SRCROOT/@BASEPACKAGEPATH/init/@JavaModNameAttributes.java,并注册本地化键attribute.@modid.@registryname)。模板核心片段如下:
<#list attributes as attribute> public static final DeferredHolder<Attribute, Attribute> ${attribute.getModElement().getRegistryNameUpper()} = REGISTRY.register("${attribute.getModElement().getRegistryName()}", () -> new RangedAttribute("attribute.${modid}.${attribute.getModElement().getRegistryName()}", ${attribute.defaultValue}d, ${attribute.minValue}d, ${attribute.maxValue}d).setSyncable(true) <#if attribute.sentiment != "POSITIVE">.setSentiment(Attribute.Sentiment.${attribute.sentiment})</#if>); </#list>可以看到,编辑器中填写的defaultValue被原样作为RangedAttribute构造函数第二个参数写入生成代码(注意拼接了d后缀,表明生成的是double字面量)。RangedAttribute的构造签名正是(String descriptionId, double defaultValue, double minValue, double maxValue)——因此 MCreator 界面上的“default base value”就是 MinecraftRangedAttribute的“默认基础值”,两者是同一个概念的直接映射。
同一段模板还处理了属性归属逻辑:若勾选了“add to all entities”,则对所有能携带属性的实体类型调用event.add(entity, ...);否则仅对选定的实体列表(attribute.entities,会过滤掉没有该属性 supplier 的类型)以及勾选“add to players”时的EntityType.PLAYER添加属性。这解释了为什么文档说“实体在生成/加入世界时该属性存在且被设置为默认值”——注册阶段把属性绑定到实体类型上,实体实例创建时即以该defaultValue为基础值初始化。
五、运行时:默认值之后,属性值如何被改变
帮助文档提到“直到游戏内(Procedure、命令或 Modifier)改变它”,在 MCreator 的代码生成体系中,这几条路径分别对应可复用的行为片段:
1. 读取属性值与基础值
entity_get_attribute_value.java.ftl 生成:
(entity instanceof LivingEntity _livingEntity && _livingEntity.getAttributes().hasAttribute(Registries.ATTRIBUTE.get(...)) ? _livingEntity.getAttribute(...).getValue() : 0)entity_get_attribute_base_value对应生成.getBaseValue()调用。两者的返回值差异正印证了帮助文档第三句:getValue()是应用修饰器和 min/max 限制后的计算结果,getBaseValue()则是尚未受修饰的底层基础值。
2. 直接改写基础值
entity_set_attribute_base_value.java.ftl 生成:
if (entity instanceof LivingEntity _livingEntity && _livingEntity.getAttributes().hasAttribute(...)) _livingEntity.getAttribute(...).setBaseValue(value);setBaseValue即“改变默认基础值”的直接手段:此后该实体这个属性的计算起点变为value,且受RangedAttribute的 min/max 截断约束。注意该行为会覆盖实体获得属性时的初始默认值,是持久性的修改。
3. 通过修饰器叠加修改(不改变基础值)
entity_add_modifier.java.ftl 生成带命名AttributeModifier并附加到实体属性上,修饰运算方式对应 operation.md 中定义的三种操作:
ADD_VALUE:按固定量增减;ADD_MULTIPLIED_BASE:按基础值(base value)的百分比增减——这里的基础值正是defaultValue设定的那个数;ADD_MULTIPLIED_TOTAL:在所有其他运算应用后的总量上按百分比增减。
也就是说,即使使用修饰器而非setBaseValue,“默认基础值”依然是ADD_VALUE与ADD_MULTIPLIED_BASE两种运算的计算基准,这从侧面再次说明了该参数在整个属性体系中的枢纽地位。
六、参数配合与配置建议
结合 min_max_value.md、entities.md 等相关帮助文档,配置默认基础值时的注意事项可整理如下:
| 参数 | 作用 | 与 defaultValue 的关系 |
|---|---|---|
| min / max value | 属性值可被设置的最小/最大边界 | 默认值必须落在[min, max]内,否则界面校验直接报错 |
| sentiment | POSITIVE / NEUTRAL / NEGATIVE,并决定修饰器颜色 | 独立参数,不影响数值计算 |
| add to all entities | 所有可携带属性的实体生成时都拥有该属性并设为默认值 | 决定默认值“广播”给全体实体 |
| add to players | 所有玩家加入世界时拥有该属性并设为默认值 | 决定默认值“广播”给玩家 |
| entities | 指定实体列表在生成时获得该属性并设为默认值 | 决定默认值作用的具体实体范围 |
实战上的几个要点:
- 默认值一旦越出 min/max 无法保存:这是界面级硬校验(见第三节源码),不是建议性提示。
defaultValue写入的是 double 字面量:生成模板拼接d后缀,因此即使步进为 1.0,也可以填写小数。- 修改默认值只对“尚未被运行时改变”的实体生效:已存在的实体其基础值若要更新,需要通过
setBaseValue一类的行为显式设置,或移除/重新附加属性修饰器(permanent 修饰器会随实体 NBT 持久化)。 - 依赖该属性的其他逻辑应读取区分好的值:判断“玩家当前速度”应使用
entity_get_attribute_value(含修饰器与截断),而计算“装备加成百分比”等场景更适合基于entity_get_attribute_base_value的原始基础值。
小结
MCreator 属性元素中的 “Attribute default base value” 是一个看似简单、实际贯穿整个属性机制的参数:它在数据模型中定义为带范围注解的double字段(Attribute.java),在界面中受min ≤ default ≤ max的硬校验约束(AttributeGUI.java),在代码生成阶段被直接映射为 NeoForgeRangedAttribute构造函数的默认基础值参数(attributes.java.ftl),并在运行时作为ADD_VALUE/ADD_MULTIPLIED_BASE修饰运算与setBaseValue修改操作的计算基准。理解它,就理解了 MCreator 属性系统里“基础值—修饰器—最终值”三层结构的起点。
- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】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 属性默认基值(Default Base Value)详解:从界面配置到 NeoForge 代码生成
MCreator 属性默认基值(Default Base Value)详解:从界面配置到 NeoForge 代码生成 导读 在 MCreator 中新建"属性(
低代码代码生成桌面应用游戏开发MCreator 自定义属性(Attribute)默认基值深度指南:从 UI 配置到生成代码的完整解析
MCreator 自定义属性(Attribute)默认基值深度指南:从 UI 配置到生成代码的完整解析 导读 本文以 MCreator 官方本地化帮助文档(德文
低代码代码生成桌面应用游戏开发MCreator 游戏规则默认值(Game Rule Default Value)配置完全指南:字段语义、源码实现与代码生成解析
MCreator 游戏规则默认值(Game Rule Default Value)配置完全指南:字段语义、源码实现与代码生成解析 游戏规则(Game Rule)
低代码代码生成桌面应用游戏开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考