> For the complete documentation index, see [llms.txt](https://enchantedmobs.superiormc.cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://enchantedmobs.superiormc.cn/enchantedmobs-zhong-wen-wen-dang/features/bian-ji-guai-wu-neng-li.md).

# 编辑怪物能力

所有的怪物能力的配置文件全部储存在 `plugins/EnchantedMobs/powers` 文件夹中。

* 这些配置文件的名称（不含文件名称后缀）就是这个能力的 ID，每个 ID 都应该保持唯一性。
* 如果需要创建新的能力，就直接创建新的文件，并将对应的配置文本复制到该文件中即可。所有更改都需要重启插件以生效。部分功能还需要重启服务器生效。
* 怪物能力的配置文本遵循 YAML 格式。

### 动态数值

在怪物能力的配置文件中，几乎每个数字类型作为值的选项都支持数学公式和 `{level}` 变量符（代表怪物的等级值）。同时，也支持这样的格式：

```yaml
  random:
    ">=15;;<23": 0.3
    ">=23": 0.6
```

这样的格式代表当怪物的等级大于等于 **15** 而又小于 **23** 时，取值 **0.3**，当怪物的等级大于 **23** 时，取值 **0.6**。

### 配置示例

一个比较完整的能力示例文件如下：

```yaml
# Web Trap
# The projectile launched by a monster with this ability will generate a temporary spider web upon landing.

enabled: true
placeholder: '{lang:power.web_arrow}'

apply-rules:
  group: ranged_projectile
  group-unique: true
  weight: 5
  match-entity:
    equip:
      main-hand:
        material:
          - bow
          - crossbow
          - trident
  level-weight: 15~25

limit:
  random:
    ">=15;;<23": 0.3
    ">=23": 0.6
  cooldown:
    ">=15;;<22": 10
    ">=22": 5

on-projectile-hit:
  abilities:
    1:
      type: delay
      delay:
        ">=15;;<20": 20
        ">=20": -1
      abilities:
        1:
          type: place_block
          block: cobweb
          duration: '{level} * 4'
        2:
          type: sound
          sound: BLOCK_WOOL_PLACE
        3:
          type: particle
          particle: BLOCK
          count: 20
          block: cobweb
        4:
          type: remove

on-shoot-bow:
  abilities:
    1:
      type: mark

on-projectile-tick:
  abilities:
    1:
      type: particle
      particle: WHITE_ASH
      count: 6
      offset-x: 0.05
      offset-y: 0.05
      offset-z: 0.05
```

该配置内容中的部分选项介绍如下：

* enabled：是否启用该能力。
* placeholder：该能力的显示名称。
* apply-rules：该能力的抽取规则。在 [机制](/enchantedmobs-zhong-wen-wen-dang/start/ji-zhi.md) 一节中，我们已经介绍了这部分选项的内容。
* limit：该能力释放的限制：
  * random：该能力释放的几率，`1.0` 代表百分之百。
  * cooldown：该能力每次释放的冷却时间，以秒为单位。
  * times：该能力最多释放的次数。
* 其他以 on 开头的选项部分：触发该事件后拥有此能力的怪物将会执行的动作。如果不满足 `limit` 选项部分设置的限制，则动作不会执行，所有的动作共用一个限制。

### 能力触发事件

拥有能力的怪物可以在触发指定的事件后执行指定的动作。所有触发事件都包含这 4 种属性：

* 触发实体：哪个实体触发了这一事件。
* 传递实体：哪个实体传递这一事件的过程。
* 目标实体：这一事件最终作用于哪个实体。
* 位置：这个事件在哪个位置触发。

1事件只能由实体自身触发，能力造成的效果不会触发事件。

一个事件不一定全部包含这四种属性，所有事件如这四种属性的信息表如下所示：

<table><thead><tr><th width="198.5999755859375">事件</th><th>触发实体</th><th>传递实体</th><th>目标实体</th><th>位置</th></tr></thead><tbody><tr><td><code>on-projectile-hit</code><br>当抛掷物击中或者落地后触发。</td><td>射出抛掷物的实体</td><td>射出的抛掷物（如箭）</td><td>抛掷物击中的实体<br>⚠若未击中则不存在</td><td>抛掷物击中位置</td></tr><tr><td><code>on-shoot-bow</code><br>实体发射抛掷物后触发。</td><td>射出抛掷物的实体</td><td>射出的抛掷物（如箭）</td><td>射出的抛掷物（如箭）</td><td>射出的抛掷物的位置</td></tr><tr><td><code>on-projectile-tick</code><br>抛掷物射出后尚未击中这一过程，每 tick 都会触发 1 次。</td><td>射出抛掷物的实体</td><td>射出的抛掷物（如箭）</td><td>射出的抛掷物（如箭）</td><td>射出的抛掷物的位置</td></tr><tr><td><code>on-tick</code><br>实体存活期间每 tick 都会触发 1 次。<br>⚠需要在 <code>config.yml</code> 中启用这个功能。</td><td>实体本身</td><td>实体本身</td><td>实体本身</td><td>实体当前所在的位置</td></tr><tr><td><code>on-spawn</code><br>实体生成时触发。</td><td>实体本身</td><td>实体本身</td><td>实体本身</td><td>实体当前所在的位置</td></tr><tr><td><code>on-combust</code><br>实体燃烧时触发。</td><td>实体本身</td><td>实体本身</td><td>实体本身</td><td>实体当前所在的位置</td></tr><tr><td><code>on-damage</code><br>实体受到伤害时触发。</td><td>造成伤害的实体<br>⚠若伤害不是由其他实体触发则不存在</td><td>实体本身</td><td>实体本身</td><td>实体当前所在的位置</td></tr><tr><td><code>on-regain</code><br>实体回血时触发。</td><td>实体本身</td><td>实体本身</td><td>实体本身</td><td>实体当前所在的位置</td></tr><tr><td><code>on-melee-attack</code><br>近战攻击时触发。</td><td>实体本身</td><td>实体本身</td><td>受到攻击的实体</td><td>受到攻击的实体当前所在的位置</td></tr><tr><td><code>on-death</code><br>实体死亡时触发。</td><td>实体本身</td><td>实体本身</td><td>实体本身</td><td>实体当前所在的位置</td></tr><tr><td><code>on-target</code><br>实体具有仇恨目标时触发。</td><td>实体本身</td><td>实体本身</td><td>受到仇恨的实体</td><td>受到仇恨的实体当前所在的位置</td></tr><tr><td><code>on-untarget</code><br>实体不再具有仇恨目标是触发。</td><td>实体本身</td><td>实体本身</td><td>实体本身</td><td>实体当前所在的位置</td></tr><tr><td><code>on-target-tick</code><br>实体具有仇恨目标时每 tick 都会触发 1 次。<br>⚠需要在 <code>config.yml</code> 中启用这个功能。</td><td>实体本身</td><td>实体本身</td><td>受到仇恨的实体</td><td>受到仇恨的实体当前所在的位置</td></tr><tr><td><code>on-explode</code><br>实体爆炸时触发。</td><td>实体本身</td><td>实体本身</td><td>实体本身</td><td>实体当前所在的位置</td></tr></tbody></table>

### 事件配置

每个事件的配置由 `abilities、modifier、conditions` 三个部分组成。

* abilities：配置事件执行后将要执行哪些动作。
* modifier：配置对事件要执行哪些修改。
* conditions：配置执行动作需要的条件。

其中，有关 `abilities` 的部分会在下一节单独介绍，其他两个部分介绍如下。

### 修改事件

并不是所有的事件都支持修改，可修改的内容也是固定的，具体如下：

#### `on-shoot-bow`

可以修改射出的抛掷物类型：

```yaml
on-shoot-bow:
  modifier:
    projectile: TNT
    fuse: 40
```

这个示例更改抛掷物类型是 TNT。

提供的配置选项如下：

* projectile：新的抛掷物类型，支持：
  * Arrow
  * BreezeWindCharge
  * DragonFireball
  * Egg
  * EnderPearl
  * Fireball
  * Firework
  * FishHook
  * LargeFireball
  * LingeringPotion
  * LlamaSpit
  * ShulkerBullet
  * SizedFireball
  * SmallFireball
  * Snowball
  * SpectralArrow
  * SplashPotion
  * ThrownExpBottle
  * TNT
  * Trident
  * WindCharge
  * WitherSkull
* fuse：如果设置抛掷物为 TNT，则可以通过这个选项设置点燃时间。
* fireball-yield：如果设置抛掷物为火球，则可以通过这个选项设置爆炸强度。
* fireball-incendiary：如果设置抛掷物为火球，则可以通过这个选项设置释放燃烧。

喷溅药水的支持示例如下：

```yaml
on-shoot-bow:
  modifier:
    projectile: SPLASH_POTION
    potion-type: HARMING
    potion-effects:
      SLOW:
        duration: "60 + {level} * 20"
        amplifier: 1
      POISON:
        duration: 100
        amplifier: 0
```

#### `on_combust`

可以修改燃烧的持续时间。

{% hint style="info" %}
除非特别说明，本文所有的“持续时间”全部以 tick 为单位。20 tick = 1秒。
{% endhint %}

```yml
on-combust:
  modifier:
    duration: '60'
```

#### `on_damage`

可以修改受到的伤害的值，支持使用 `{original}` 代表原伤害值。

```yml
on-damage:
  modifier:
    damage: '{original} * (0.8 - {level} / 500)'
```

#### `on_regain`

可以修改回血的值。

```yaml
on-regain:
  modifier:
    amount: 15
```

#### `on_melee_attack`

可以修改造成的近战伤害值，支持使用 `{original}` 代表原伤害值。

```yml
on-melee-attack:
  modifier:
    damage: '{original} * (1.2 + {level} / 50)'
```

#### `on_death`  - 仅 Paper

可以复活并获得对应血量，支持使用 `{original}` 代表原最大血量。

```yaml
on-death:
  modifier:
    revive-health: '{original} / 2'
```

#### `on-explode`

可以修改爆炸强度。

```yaml
on-death:
  modifier:
    yield: 5
```

### 触发条件

{% hint style="info" %}
除非另有说明，否则所有条件如果没有在配置内容中写明，都视为不使用此条件。
{% endhint %}

#### 血量

除 `on-death` 触发事件外，其他触发事件都支持检查触发实体的血量，你可以设置某些动作只有在怪物剩余百分之 50 的血量时才会触发，增加游戏趣味性。

```yaml
on-melee-attack:
  conditions:
    now-health:
      compare: '>='
      value: '{max-health} / 2'
    max-health:
      compare: '>='
      value: 200
```

* compare: 比较的规则，支持：
  * \>
  * \>=
  * <
  * <=
  * != （不等于）
  * \=
* value：比较的值。支持使用 `{health}` 代表当前血量，`{max-health}` 代表最大血量。

#### `on-combust`

```yaml
on-combust:
  conditions:
    by-block: false
    by-entity: false
    min-duration: 5
    max-duration: 10
```

* by-block：这次燃烧是由其他方块造成的。
* by-entity：这次燃烧是由其他实体造成的。
* min-duration：燃烧持续时间的最小值。
* max-duration：燃烧持续时间的最大值。

#### `on-damage`

```yaml
on-damage:
  conditions:
    by-block: false
    by-entity: false
    min-damage: 5
    max-damage: 10
    match-damager:
      entity-types:
        - 'PLAYER'
    damage-cause:
      - 'BLOCK_EXPLOSION'
    ignore-damage-cause:
      - 'BLOCK_EXPLOSION'
```

* by-block：这次伤害是由其他方块造成的。
* by-entity：这次伤害是由其他实体造成的。
* min-duration：伤害的最小值。
* max-duration：伤害的最大值。
* match-damager：伤害必须由匹配的实体造成。使用 Match Entity Format。在此示例中，要求伤害必须是由玩家类型实体造成的。
* damage-cause：伤害来源必须来自这些情况，可用的伤害来源见此 [页面](/enchantedmobs-zhong-wen-wen-dang/features/bian-ji-guai-wu-neng-li/shang-hai-lai-yuan.md)。
* ignore-damage-cause：伤害来源不能来自这些情况，可用的伤害来源见此 [页面](/enchantedmobs-zhong-wen-wen-dang/features/bian-ji-guai-wu-neng-li/shang-hai-lai-yuan.md)。

#### `on-regain`

```yaml
on-regain:
  conditions:
    min-amount: 0
    max-amount: 5
```

* min-amount：回血的最小值。
* max-amount：回血的最大值。

#### `on-melee-attack`

```yaml
on-melee-attack:
  conditions:
    accept-source: false
    min-amount: 0
    max-amount: 20
```

* accept-source：默认情况下此条件启用且为 `false`。如果设置为 `true`，则远程攻击手段也会触发此事件。（⚠尚在测试。）
* min-amount：攻击的最小值。
* max-amount：攻击的最大值。

#### `on-explode`

```yaml
on-explode:
  conditions:
    from-creeper: false
    min-yield: 0
    max-yield: 5
```

* from-creeper：爆炸是否由苦力怕造成。
* min-yield：最小爆炸威力。
* max-yield：最大爆炸威力。

#### **`on-tag/on-untag`**

```yaml
on-tag: # 或者 on-untag
  conditions:
    reason:
      - 'TARGET_DIED'
    ignored-reason:
      - 'NEARBY_PLAYER'
```

* reason：必须由这些原因导致实体仇恨目标变成自己。
* ignored-reason：这些原因导致实体仇恨目标变成自己将无视。

可能的原因如下：

```yaml
TARGET_DIED,
CLOSEST_PLAYER,
TARGET_ATTACKED_ENTITY,
FORGOT_TARGET,
TARGET_ATTACKED_OWNER,
OWNER_ATTACKED_TARGET,
RANDOM_TARGET,
DEFEND_VILLAGE,
TARGET_ATTACKED_NEARBY_ENTITY,
REINFORCEMENT_TARGET,
COLLISION,
CUSTOM,
CLOSEST_ENTITY,
FOLLOW_LEADER,
TEMPT,
TARGET_OTHER_LEVEL,
TARGET_INVALID,
UNKNOWN
```
