前言

3.7.8版本,AoA3更新到了MC1.21,也跟进了MC原版的更新内容,将AoA3的魔咒改为数据驱动。这意味着玩家也可以使用数据包对AoA3的魔咒进行了。

为了实现魔咒的效果,AoA3也添加了一些属于自己的魔咒效果组件,本教程会介绍这些魔咒效果组件的信息,简单介绍用法。

为了实现用数据包定制魔咒,读者也需要基本如下知识:

魔咒效果组件介绍

AoA3添加的魔咒效果组件均为带条件的魔咒效果组件,其信息如下:

组件注册名战利品上下文效果输入参数行为
aoa3:crit_damageenchanted_damage初始输入为0影响暴击伤害
aoa3:spirit_consumptionenchanted_item初始输入为1影响精神力的消耗量(倍率)
aoa3:rune_costenchanted_item初始输入为0影响符文的消耗量
aoa3:recoilenchanted_item初始输入为1影响后坐力(倍率)
aoa3:pellet_spreadenchanted_item初始输入为1影响霰弹的扩散程度(倍率)
aoa3:ammo_costenchanted_item初始输入为0影响弹药的消耗数量

分别结合使用这些组件的魔咒介绍如下:

crit_damage

该组件的上下文为 enchanted_damage,即影响有该魔咒的物品的攻击力

使用该组件的魔咒为断绝3.7.12版本前),其效果组件为:

  "effects": {
    "aoa3:crit_damage": [                                     ←效果组件
      {
        "effect": {
          "type": "minecraft:add",                           ←魔咒效果
          "value": {
            "type": "minecraft:linear",                      ←等级依赖函数
            "base": 1.15,
            "per_level_above_first": 1.15
          }
        }
      }
    ]
  },

在效果组件中,魔咒的效果为 minecraft:add,这是值效果中的加效果,即将魔咒得到的值与输入的值(暴击伤害)相加

初始输入为0,因此没有该魔咒(该魔咒等级为0时),攻击力 + 0,与默认值相同。

与输入值相加的值通过等级依赖函数计算,该等级依赖函数为 minecraft:linear(线性函数)。base 为1.15,即魔咒为1级时,与输入值相加的值 = 1.15。per_level_above_first 为1.15,魔咒等级每增加1级,这个值增加1.15。

通过以上分析即可看出,该魔咒的效果为每级增加1.15点暴击伤害

spirit_consumption

该组件的上下文为 enchanted_item,即影响有该魔咒的物品本身

使用该组件的魔咒为充能,其效果组件为:

  "effects": {
    "aoa3:spirit_consumption": [
      {
        "effect": {
          "type": "aoa3:clamp",
          "max": 9999.0,
          "min": 0.0,
          "value": {
            "type": "minecraft:multiply",
            "factor": {
              "type": "minecraft:linear",
              "base": 0.93,
              "per_level_above_first": -0.07
            }
          }
        }
      }
    ]
  },

在效果组件中,魔咒的效果为 minecraft:multiply,这是值效果中的乘效果,即将魔咒得到的值与输入的值(精神力消耗)相乘

初始输入为1,因此没有该魔咒(该魔咒等级为0时),消耗量 × 1,与默认值相同。

相加的值的等级依赖函数为 aoa3:clamp,该等级依赖函数是对原版的 minecraft:clamp 进行了重新编码并注册,功能与之相同,对另一个等级依赖函数计算出的值进行钳制,在这里就是钳制在0到9999之间。

另一个等级依赖函数为上文介绍过的线性,不难看出,是每级减少0.07倍精神力消耗,即每级减少7%精神力消耗

再根据前文的钳制,通过此方法计算出的值如果 < 0,就设为0;> 9999,就设为9999,得到最终的值。

rune_cost

上下文为 enchanted_item,不再赘述。

使用该组件的魔咒为法术,其效果组件为:

  "effects": {
    "aoa3:rune_cost": [
      {
        "effect": {
          "type": "aoa3:clamp",
          "max": 255.0,
          "min": 1.0,
          "value": {
            "type": "minecraft:add",
            "value": {
              "type": "minecraft:linear",
              "base": -1.0,
              "per_level_above_first": -1.0
            }
          }
        }
      }
    ]
  },

效果为加效果,等级依赖函数是钳制和线性函数的组合,上文也已经介绍过,不再赘述。

效果为,每级减少1个符文消耗量,并将结果钳制在1到255之间。试试自己解读并分析出这个效果吧!

recoil

使用该组件的魔咒为支配,效果组件为:

  "effects": {
    "aoa3:recoil": [
      {
        "effect": {
          "type": "minecraft:multiply",
          "factor": {
            "type": "minecraft:linear",
            "base": 0.85,
            "per_level_above_first": -0.15
          }
        }
      }
    ]
  },

都是熟悉的影子!效果为乘效果,等级依赖函数为线性函数。

已经阅读到这里,相信读者不难看出效果为每级减少15%的后坐力

pellet_spread

使用该组件的魔咒为集束,效果组件为:

  "effects": {
    "aoa3:pellet_spread": [
      {
        "effect": {
          "type": "minecraft:multiply",
          "factor": {
            "type": "minecraft:linear",
            "base": 0.85,
            "per_level_above_first": -0.15
          }
        }
      }
    ]
  },

效果为乘效果,等级依赖函数为线性函数,每级减少15%的霰弹扩散程度

ammo_cost

使用该组件的魔咒为贪噬诅咒,效果组件为:

  "effects": {
    "aoa3:ammo_cost": [
      {
        "effect": {
          "type": "minecraft:add",
          "value": {
            "type": "minecraft:linear",
            "base": 1.0,
            "per_level_above_first": 1.0
          }
        }
      }
    ]
  },

效果为加效果,等级依赖函数为线性函数,每级使弹药消耗量 + 1

如何使用这些魔咒效果组件

从上文中可以看到,AoA3的魔咒总体上实现逻辑还是比较简单的,而且这些魔咒效果的内容也并不复杂。这些魔咒效果组件只负责提供生效的效果,具体的效果值和等级依赖函数都依然使用原版的魔咒数据格式

因此玩家也可以这些组件为载体,结合原版提供的方法,写出自己的魔咒。

在此浅举一个例子作为启发:


设计一个魔咒,让枪械有一定的概率不消耗弹药,等级越高,概率越高。

首先分析一下需求,并根据每个需求推断出需要使用什么。

行为是弹药消耗,而负责弹药消耗的魔咒效果组件是 aoa3:ammo_cost,即为我们所需的魔咒效果组件。

效果是降低概率,但该组件的行为是影响弹药的消耗数量。似乎并不相同?

但考虑到枪械每次开火,只消耗1个弹药,如果让消耗数量有概率 -1,就实现了我们所需的效果。而原版提供的魔咒效果中的二项减少(minecraft:remove_binomial)刚好符合我们的要求!

而等级越高,概率越高,几乎打了明牌,需要等级依赖函数!

根据以上的分析,我们写出了如下效果组件:

  "effects": {
    "aoa3:ammo_cost": [
      {
        "effect": {
          "type": "minecraft:remove_binomial",
          "chance": {
            "type": "minecraft:linear",
            "base": 0.07,
            "per_level_above_first": 0.07
          }
        }
      }
    ]
  },

得到效果组件之后,其他的魔咒json中所需的参数,例如最大等级、适用物品等,就比较好写了。

题外话

上文中还有一些AoA3的魔咒没有介绍到,在此补充介绍。

炮弹魔咒直接使用了原版的魔咒效果组件。

  "effects": {
    "minecraft:damage": [
      {
        "effect": {
          "type": "minecraft:multiply",
          "factor": {
            "type": "minecraft:linear",
            "base": 1.1,
            "per_level_above_first": 0.1
          }
        }
      }
    ]
  },

组件为 minecraft:damage,上下文为 enchanted_damage,即影响物品的攻击力。效果组件的效果为每级增加10%攻击力。

3.7.12版本后断绝魔咒被重做。新的断绝魔咒也使用原版的魔咒效果组件。

  "effects": {
    "minecraft:attributes": [
      {
        "amount": {
          "type": "minecraft:linear",
          "base": 0.035,
          "per_level_above_first": 0.035
        },
        "attribute": "aoa3:critical_hit_multiplier",
        "id": "aoa3:enchantment.sever",
        "operation": "add_value"
      }
    ]
  },

组件是minecraft:attributes,即魔咒给予玩家一个属性修饰,影响玩家的属性值

属性修饰符,即影响的属性值由 attribute 给出,为 aoa3:critical_hit_multiplier,是AoA3新定义的一种属性值,该属性值影响玩家的暴击伤害倍率

修饰值由 amount 给出,依然是我们熟悉的等级依赖函数。属性修饰的运算方式由 operation 给出,为增量操作。不难看出效果为每级令暴击伤害倍率增加0.035,即增加0.035倍(3.5%)的暴击伤害。

干预攥紧魔咒由于其效果较为特殊,没有包含魔咒效果组件,其效果依然在代码内实现。