大家好, 能听到吗——?
为了给 @CR_019 的教程索引凑教程,我决定写一个魔咒系统的教程。
前言
随着新版本 1.21 的更新,数据包得以编辑和添加新的魔咒。本文旨在介绍魔咒系统的可能性以及编写方法。阅读本文需要一定的数据包基础,至少需要知道怎么创建、编辑和加载数据包。
为了表达和理解方便,本文可能会使用一些现场编造的名词私货,请自行分辨。
简介
魔咒系统由「魔咒数据」和「魔咒提供器」两个部分组成。
前者定义了一个魔咒自身的所有内容,包括附魔的名称、效果、附魔参数等等。而后者能够将魔咒应用在游戏的各个环节。
魔咒驱动器
魔咒提供器不能新建,只能修改,因此我们先把魔咒提供器一笔带过。
目前我们能修改的主要是:
- 生物生成时的装备
- 掠夺者和袭击中敌人的武器
- 村民售卖的附魔装备
这三种情况下,物品可能拥有的魔咒。
魔咒数据
与其他数据文件一样,魔咒数据同样是 JSON 格式文件,由许多键值对构成。
请看 VCR:
{
"anvil_cost": 8,
"description": {
"translate": "enchantment.minecraft.silk_touch"
},
"exclusive_set": "#minecraft:exclusive_set/mining",
"max_cost": {
"base": 65,
"per_level_above_first": 0
},
"max_level": 1,
"min_cost": {
"base": 15,
"per_level_above_first": 0
},
"slots": [
"mainhand"
],
"supported_items": "#minecraft:enchantable/mining_loot",
"weight": 1
},
"effects": {
"minecraft:block_experience": [
{
"effect": {
"type": "minecraft:set",
"value": 0.0
}
}
]
}
虽然内容看起来一时间眼花缭乱,不过其实可以简单分为三块。
- 魔咒定义 - 描述了魔咒本身的基本参数
- supported_items | 支持的物品:能够施加该附魔的物品
- 附魔描述 - 描述了魔咒的附魔相关参数
- anvil_cost | 铁砧消耗:合并魔咒时每一级魔咒对消耗经验等级的增加量
- 魔咒效果 - 描述了魔咒将会产生的效果。
除去少数简单的需求外,就我们日常的使用来说,上述最重要的部分无疑是魔咒的效果。而整个魔咒数据中最庞大最复杂部分亦是这一部分。
魔咒效果组件可以在使用物品、持有物品、消耗耐久、攻击、受伤、移动、装备物品等各种场景下触发,并提供不同的上下文。然后,魔咒效果组件可以对相关的物品、实体或方块施与相应的效果。这些触发场景和效果,有的是往常的手段(函数、进度等)难以甚至无法达成的;有的则比起往常的方法更加简单,能够省下一些性能和工时。
譬如:
- 在玩家手持附魔物品点击方块时,直接在点击的位置执行函数
- 使玩家免疫特定类型的伤害
- 对玩家攻击的目标,或者攻击玩家的敌人进行一些处理
- 生成圆柱形的方块结构
- 强制修改盔甲的减伤比例为任意值。
- armor_effectiveness | 疑似在计算完盔甲韧性、护甲值和攻击伤害后结算
- 触发魔咒效果时执行函数
- run_function
上面仅列了一部分能做到的功能。此外,所有你能想到的,原版魔咒做到了的功能,都可以在一定程度内修改和拆分重组出新的魔咒。
详解
魔咒定义
要定义一个魔咒,我们至少需要提供以下信息:
* 下文的 {}[]"" 表示支持的数据类型。[""] 表示该列表是字符串列表。
* 简单来说,如果这一项的基本介绍中包括 [""] ,那么你只需要写成 :"name":[""] 的格式就行了、如果有很多种,表示这几项都可以。
- 魔咒的简介
- {}[]"" | description | 文本组件,用于在物品提示框中显示魔咒名称信息
- 也就是「时运 III」中的『时运』
- 魔咒支持的物品
- []"" | supported_items | 一个或多个物品 id 或物品标签
- 顾名思义,你的魔咒能附魔在哪些物品上
- 魔咒生效的槽位
- [""] | slots | 物品装备在指定槽位上时魔咒才会生效。该列表的元素为字符串,必须为:
- "mainhand", "offhand", "head", "chest" .. | 装备槽位,类似物品的属性修饰符。
- "any" | 任意槽位生效
- 魔咒的最大等级
此外,还有一个可选项
- 魔咒的排斥集
- [""] | exclusive_set | 一个或多个魔咒 id 或标签。指定这个魔咒会与哪些魔咒冲突。
- 构造类似时运和精准采集、无限和经验修补的互斥关系。
一个最基本的魔咒定义大概如下:
..
"description": {
"translate": "ifer.items.enchantment.deepspace_echo",
"fallback":"深空回响"
},
"supported_items": "#ifer_items:deepspace_echo_valiable",
"slots": ["mainhand"],
"exclusive_set": "#minecraft:exclusive_set/damage",
..
需要注意的是所谓魔咒定义、附魔描述,都是编者为了便于读者理解,人工捏造出来的概念私货。因此实际的数据文件中并不存在实际的结构区分。『魔咒定义』的项目和『附魔描述』的项目其实是放在同一层级之下的。
附魔描述
完成魔咒定义后,我们已经能看到一个魔咒的雏形了。但是想让它参与到游戏的过程中,我们还需要为其添加附魔描述。
(只添加带 附魔物品或附魔书 的战利品、奖品或配方当然也可以)
附魔描述最基本的参数有:
魔咒的修正附魔等级
- 包含两个键值对
- 本质是个等差数列
1.1. {} | min_cost | 最小修正附魔等级
- base | 魔咒为 I 级时的附魔等级(a1)
- per_level_above_first | 公差。每增长 1 级增加的数值(d)
1.2. {} | max_cost | 最大修正附魔等级
- 同上
- 当魔咒等级参数导致 1.1 比 1.2 大时,该魔咒等级无法自然产生。
也就是说你想限制你的魔咒不能超过 x 级,则需要设置两个等差数列,使得 min 数列在 n=x+1 处小于 max 数列在此的值。要计算一个简单的追及问题。
铁砧合并消耗系数
- int | anvil_cost | ≥0 的整数。合并附魔时消耗的经验等级的系数。
- 是系数,不要设置得太高。除非你不想让玩家能够通过铁砧达到其最大等级。
- 效率、锋利、保护等基础附魔的铁砧系数为 1
- 亡灵杀手、致密、火焰保护等较高价值的魔咒,这个数值为 2
- 火焰附加、火矢、冲击、时运、抢夺等珍贵、最大等级较低的魔咒,系数为 4
- 经验修补系数为 4
- 消失诅咒、迅捷潜行、灵魂潜行等魔咒的系数为 8
挑选权重
- int | weight | 魔咒的挑选权重。影响到生物天然装备、战利品表和附魔台附魔等。
- 权重越高附魔到该附魔的概率越大。具体概率要看该物品所有可能附魔的权重之和。
- 效率、锋利、保护权重为 10
- 耐久、亡灵杀手权重为 5
- 时运权重为 2
- 精准采集权重为 1
除去上述必要的参数外,还有一个可选参数。
基本物品(自然附魔物品)
- []"" | primary_items | 一个或多个物品 id 或物品标签。
- 决定这个魔咒能被哪些物品自带或通过附魔台附魔(参与附魔机制)
- 这个标签不存在时,与 supported_items 的内容相同。
- 必须为 supported_item 的子集。
魔咒效果
终于讲到魔咒数据驱动系统的重点了。
编写笔记
