☰
MCreator Attribute 默认基础值(default base value)详解:从 defaultValue 到 RangedAttribute 代码生成
2026/10/17 5:59:49 网站建设 项目流程
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】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(属性)元素中“Attribute default base value”这一核心参数为对象,完整解释 Minecraft 属性体系中“基础值(base value)”与“最终值(value)”的区别、该参数在 MCreator 数据模型与编辑界面中的定义和校验规则,以及它在代码生成阶段如何落地为 NeoForge 的RangedAttribute。读完后你可以准确理解属性默认值的生效时机、合法取值范围、越界校验逻辑,并能在行为(Procedure)中正确读取与改写属性的基础值。

一、什么是属性的默认基础值

MCreator 帮助文档对该参数的原始定义见 default_value.md,其核心表述可归纳为三点:

  1. 它定义了属性(Attribute)的默认基础值(default base value)。在 Minecraft 中,LivingEntity上的每个属性实例都持有一个“基础值”,默认基础值就是该属性被赋予给实体时初始使用的基础值。
  2. 除非游戏内有东西改变它,否则属性一直保留这个值。文档明确列出三类可改变属性值的机制:Procedure(行为/函数)、命令(Command)或修饰器(Modifier)。也就是说,默认基础值是“静态”的,只在实体获得该属性的时刻(或你显式修改时)起作用,运行时不会自动变化。
  3. 属性“值”与属性“基础值”是两个不同的量。属性最终呈现的数值(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]内,否则界面校验直接报错
sentimentPOSITIVE / NEUTRAL / NEGATIVE,并决定修饰器颜色独立参数,不影响数值计算
add to all entities所有可携带属性的实体生成时都拥有该属性并设为默认值决定默认值“广播”给全体实体
add to players所有玩家加入世界时拥有该属性并设为默认值决定默认值“广播”给玩家
entities指定实体列表在生成时获得该属性并设为默认值决定默认值作用的具体实体范围

实战上的几个要点:

  1. 默认值一旦越出 min/max 无法保存:这是界面级硬校验(见第三节源码),不是建议性提示。
  2. defaultValue写入的是 double 字面量:生成模板拼接d后缀,因此即使步进为 1.0,也可以填写小数。
  3. 修改默认值只对“尚未被运行时改变”的实体生效:已存在的实体其基础值若要更新,需要通过setBaseValue一类的行为显式设置,或移除/重新附加属性修饰器(permanent 修饰器会随实体 NBT 持久化)。
  4. 依赖该属性的其他逻辑应读取区分好的值:判断“玩家当前速度”应使用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.

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

相关推荐

上一篇:如何实现从歌词到散文:GPT2-Chinese跨领域模型迁移学习终极指南
下一篇:PDFMathTranslate 教程:5 分钟保留排版与公式的 PDF 全文翻译

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

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

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

立即咨询