资讯动态

MCreator 进度(Achievement)奖励函数参数详解:从 GUI 选择到数据包 JSON 的生成原理

发布时间:2026/10/16 6:37:29 来源:尧图企业网站定制
低代码代码生成桌面应用游戏开发【免费下载链接】MCreatorMCreator 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 的「进度Achievement」元素中的**奖励函数Reward function**参数展开说明该参数的作用当玩家完成进度时MCreator 会按你的选择执行一个自定义函数。文章将以德文帮助文档及其英文原文为起点结合仓库中的界面实现AchievementGUI、数据模型Achievement和 FreeMarker 生成模板完整还原该参数从「工作台里选一个函数」到「数据包中生成rewards.function字段」的完整链路帮助读者理解如何配置、为什么会生成这样的 JSON以及旧版本数据迁移时的注意事项。参数是什么一句话定义德文帮助文档对该参数的描述非常精炼Mit diesem Parameter kannst du eine Funktion auswählen, die ausgeführt werden soll, wenn der Spieler den Fortschritt erhalten hat.即通过该参数你可以选择一个函数当玩家获得完成该进度时执行它。英文默认文档reward_function.md同样表述为 You can choose a function to execute when the player completes the advancement with this parameter.在 MCreator 中进度Achievement 元素是可自定义触发条件的成就系统。除了常见的 XP、战利品表、配方奖励之外奖励函数提供了一种更灵活的扩展方式你可以把一个 MCreator 的Function函数元素挂到进度上玩家完成进度后函数内编排的命令序列就会被执行。界面中的位置与交互方式在 MCreator 工作台编辑「Advancement」元素时Rewards奖励区域位于元素编辑器的逻辑面板logic panel中。从界面源码 AchievementGUI.java 可以看到奖励区共有四项界面字段本地化键说明Reward XPelementgui.advancement.reward_xp完成进度时给予玩家的经验值rewardXP范围 0–64000Reward functionelementgui.advancement.reward_functions完成进度时执行的函数rewardFunction本文主题Reward loot tableselementgui.advancement.reward_loot_tables完成进度时给予的战利品表rewardLoot可多选Reward recipeselementgui.advancement.reward_recipes完成进度时解锁的配方rewardRecipes可多选上述提示文案在 texts.properties 中定义其中奖励函数的完整界面文案为Reward function: Executed when advancement is completed在界面实现上奖励函数使用SingleModElementSelector单选控件且类型被限定为ModElementType.FUNCTIONrewardFunction new SingleModElementSelector(mcreator, ModElementType.FUNCTION); rewardFunction.setDefaultText(L10N.t(elementgui.advancement.no_reward_function));也就是说你只能从当前工作区中已经创建好的 Function 元素里选择一个未选择时的占位文案为 No reward function本地化键elementgui.advancement.no_reward_function。与之配套帮助按钮通过this.withEntry(advancement/reward_function)链接到本文所对应的帮助文档条目。操作步骤实战在 MCreator 工作区中新建一个Function元素数据包函数生成路径见下文并在其中用命令方块/命令流程编写好希望奖励触发的逻辑打开Advancement元素的编辑界面滚动到 Rewards 区域点击Reward function右侧的选择器从列表中选择刚创建的 Function 元素保存并重新生成Build工作区代码函数引用便会出现在进度的 JSON 定义中。数据模型rewardFunction 字段在数据层奖励函数对应Achievement类型中的一个可空字段定义于 Achievement.javaModElementReference(acceptedTypes { LootTable.class }) public ListString rewardLoot; ModElementReference(acceptedTypes { Recipe.class }) public ListString rewardRecipes; ModElementReference(acceptedTypes { Function.class }) Nullable public String rewardFunction; Numeric(init 0, min 0, max 64000, step 1) public int rewardXP;关键点ModElementReference(acceptedTypes { Function.class })注解把该字段标记为对 Function 类型元素的引用MCreator 会据此在界面中约束可选范围并在工作区引用分析、重命名、删除时自动维护引用关系字段是可空Nullable的未配置时保存为nullhasRewards()方法Achievement.java把rewardFunction ! null与经验值、战利品表、配方一同纳入判断决定生成的 JSON 是否需要携带rewards节点。也就是说只要配置了奖励函数即使其他奖励都是空的进度也会拥有rewards块。生成原理从字段到 advancement.json进度元素的最终产物是数据包中的advancementJSON 文件。MCreator 使用 FreeMarker 模板生成奖励函数相关的生成逻辑位于advancement.json.ftlgenerator-1.21.1 数据包advancement.json.ftlgenerator-26.3.x 数据包两个模板的rewards段逻辑一致核心片段如下以 1.21.1 数据包模板为例#if data.hasRewards(), rewards: { experience: ${data.rewardXP} #if data.rewardFunction?has_content, function: ${generator.getResourceLocationForModElement(data.rewardFunction)} /#if #if data.rewardLoot?has_content, loot: [ #list data.rewardLoot as value ${generator.getResourceLocationForModElement(value)}#sep, /#list ] /#if #if data.rewardRecipes?has_content, recipes: [ #list data.rewardRecipes as value ${generator.getResourceLocationForModElement(value)}#sep, /#list ] /#if } /#if生成的典型 JSON 形如{ display: { ... }, criteria: { ... }, rewards: { experience: 100, function: my_mod:my_reward_function, loot: [ ... ], recipes: [ ... ] } }要点解读只有当data.rewardFunction有内容?has_content时才会输出function键避免生成空引用generator.getResourceLocationForModElement(...)负责把元素名解析为数据包资源位置详见下文rewards整体由data.hasRewards()门控四项奖励XP/函数/战利品表/配方只要有一项非空即会输出。资源位置Resource Location是如何计算的模板中调用的getResourceLocationForModElement实现在 GeneratorWrapper.java它先按名字在工作区中查找对应的ModElement然后返回工作区ModID : 元素的注册名对于支持命名空间的元素则使用其ResourceLocation。因此你在界面中选择的 Function 元素最终会以类似your_mod_id:function_registry_name的形式写进 JSON 的function字段。函数元素本身生成到哪里被引用的函数元素自身由 function.definition.yaml 定义生成templates: - template: function.mcfunction.ftl writer: file name: RESROOT/data/[getNamespace()]/function/[getName()].mcfunction即每个函数元素会生成一个.mcfunction文件位于数据包data/命名空间/function/函数名.mcfunction。这与advancement.json中的function引用在资源位置上是一一对应的——玩家完成进度时Minecraft 会通过该资源位置定位并执行对应的函数文件。旧版本数据兼容AdvancementFunctionConverter由于历史版本中「未选择函数」这一状态曾以字符串No function存储在rewardFunction字段中仓库提供了专门的转换器 AdvancementFunctionConverter.java 处理老工作区的数据if (No function.equals(achievement.rewardFunction)) { achievement.rewardFunction null; }该转换器将版本号提升到 71getVersionConvertingTo()返回 71属于 v2024_4 阶段的迁移逻辑。在 GeneratableElement.java 的加载流程中当工作区元素的存储格式版本低于转换目标版本时转换器会被自动依次执行。也就是说如果你从旧版本 MCreator 打开包含进度元素的工作区只要原奖励函数字段存的是 No function 占位字符串加载时会被自动清空为null避免生成出非法的 JSON。这一细节也提醒开发者rewardFunction的合法取值应当是工作区中实际存在的 Function 元素名而不是任意字符串——它既是界面选择器约束的对象也是生成模板和迁移逻辑共同处理的引用字段。注意事项与最佳实践必须提前创建 Function 元素奖励函数是元素级引用不能在进度编辑器中直接内联编写命令需先在工作区创建 Function 元素再挂载空引用不会进入 JSON模板通过?has_content判断未选择函数时rewards中不会出现function键但若同时配置了 XP、战利品表或配方rewards块仍然会生成函数会在玩家完成进度的瞬间执行与奖励 XP奖励战利品表解锁配方并行生效可用于实现自定义奖励逻辑例如传送、召唤实体、设置计分板、触发其他命令等命名空间由工作区 ModID 决定生成的函数资源位置为ModID:函数注册名在 1.21.1 与 26.3.x 两套数据包生成器中行为一致可放心跨版本参考。综上MCreator 的「奖励函数」参数是一把通往数据包函数系统的钥匙界面上一句简洁的帮助文案背后是「界面单选 → 元素引用字段 → FreeMarker 模板 → 数据包 JSON 资源位置」的完整工程链路理解这条链路有助于你在自己的 Mod 中更精准地设计进度奖励体系。赞分享低代码代码生成桌面应用游戏开发【免费下载链接】MCreatorMCreator 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 进度Advancement经验值奖励详解reward_xp 配置与生成原理MCreator 进度Advancement经验值奖励详解reward_xp 配置与生成原理 导读 在 MCreator 中创建进度Advancemen低代码代码生成桌面应用游戏开发MCreator 维度矿脉生成参数generate ore veins详解原理、配置与数据包生成实现MCreator 维度矿脉生成参数generate ore veins详解原理、配置与数据包生成实现 开启本文前先明确主题本文讲解 MCreator低代码代码生成桌面应用游戏开发MCreator 方块绑定 GUIBind GUI详解从参数配置到容器菜单生成原理MCreator 方块绑定 GUIBind GUI详解从参数配置到容器菜单生成原理 导读 在 MCreator 中制作带有交互界面的方块如箱子、工作台这低代码代码生成桌面应用游戏开发上一篇SMUDebugTool终极指南3个简单方法优化你的AMD Ryzen系统性能下一篇如何快速解密NCM音频文件ncmdumpGUI完整使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑