> 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/start/ji-zhi.md).

# 机制

### 玩家战力

怪物的强大程度取决于玩家的战力，玩家的战力越高，生成的怪物就越强大。玩家战力的计算方式在 `plugins/EnchantedMobs/player-power.yml` 文件中设定。

```yaml
formula: "({equipment_sum} / 4) + ({backpack_max} + {backpack_avg}) / 2"
incremental-slot-update: true

rules:
  diamond-sword:
    match-item:
      material: 
        - DIAMOND_SWORD
    add-weight: 10
  netherite-armor:
    match-item:
      material-tag: 
        - minecraft:netherite_armor
    add-weight: 12
```

其中：

* formula：设定战力计算的公式，支持以下变量：
  * {equipment\_sum}：玩家装备槽（头盔、胸甲、护腿、靴子）物品的总战力值。
  * {backpack\_max}：玩家背包（不含装备槽）物品的最大战力值。
  * {backpack\_avg}：玩家背包（不含装备槽）物品的平均战力值。
  * {backpack\_sum}：玩家背包（不含装备槽）的物品的总战力值。
  * 所有的 PlaceholderAPI 插件的变量符。
* incremental-slot-update：设定玩家战力值更新计算方式，支持以下模式：
  * true：代表在玩家加入服务器时计算拥有的所有物品的战力值，然后每次库存物品发生变动时，再扣除变动槽位先前物品的战力值，加上现在槽位物品的战力值。
  * false：代表玩家加入服务器和每次库存物品发生变动时，都会重新计算整个库存的物品的战力值。
  * 尽管是个人都能看出来，设定为 `true` 对于服务器的性能开销是尽可能低的，但是如果你的服务器有一些特殊情况导致插件不能检测到某个槽位的物品发生了变动，这时战力值可能就会计算错误，并且除非玩家重新进入服务器，这个错误将会无法得到修正。
  * 此功能在 Spigot 服务端上可能不能很好检测到每一次物品栏变化。Paper 服务端无此问题，
* rules：设定物品战力值计算规则。你可以按照示例模板继续创建新的规则，其中第一级如 `diamond_sword`、`netherite_armor` 代表的是规则 ID，每个规则 ID 都必须有唯一性。每个规则配置都由以下选项组成：
  * match-item：描述物品的匹配规则，填写 Match Item Format，满足规则的物品会被视为可以使用这个规则。
  * add-weight：满足这个规则的物品，会被添加多少战力值。
  * 如果一个物品能够满足多个规则，那么它将会进一步累加。
* placeholderapi-cache-ticks：设置 PlaceholderAPI 变量的缓存时长，每相隔一段时间更新 PlaceholderAPI 的值，以 tick 为单位。频繁的请求 PlaceholderAPI 的值可能会造成严重的性能问题，适时的设置缓存是非常有必要的。

你可以使用指令 `/es playerpower` 来查看自己的战力值，或者使用指令 `/es playerpower <玩家名称>` 来查看其他玩家的战力值。

如果您的服务器安装了 **PlaceholderAPI** 插件，那么也可以使用 `%enchantedmobs_player_power%` 变量来显示玩家的战力值。

### 怪物生成

您可以通过两种方式生成来自 **EnchantedMobs** 的怪物：

* 指令生成：您几乎不会使用这种方式。
* 自动生成：插件将会替换服务器上即将生成的新怪物为 **EnchantedMobs**。

有关自动生成：

* 有 `enchantedmobs.nodify` 权限的玩家在 **EnchantedMobs** 替换怪物时会收到提示。
* 有关自动生成的配置选项，可以在 config.yml 文件中找到，有关配置如下所示：

```yaml
mob-power-generator:
  enabled: true
  ignore-custom-spawn: true
  player-scan-range: 48
  default-level: '25~100'
  max-level: 400
  spawn-chance: '35~70'
  disabled-worlds: []
  disabled-entity:
    none: true
```

其中：

* enabled：是否启用该功能。
* ignore-custom-spawn：是否忽视来自其他插件生成的怪物。有一些插件生成怪物可能看起来和原版一样，那么这时我们无法判断这个怪物是来自该插件的，因此这个选项不是百分之一百对所有插件有用。
* disabled-worlds：填写禁用此功能的世界，格式为：`["世界1名称", "世界2名称"]`（以此类推，英文双引号不能遗漏）。
* disabled-entity：填写 Match Entity Format，满足匹配的实体将会禁用此功能。
* max-level：生成的怪物最大等级。只能填写一个固定的数字。

每次服务器尝试生成新的怪物时，将会检查是否上述选项是否禁用此次强化怪物，如果是，则不再强化该怪物，如果否，则开始强化怪物。

每个被强化的怪物的都会有一个等级，等级越高，怪物拥有的能力就越多。生成的怪物等级取决于指定范围内是否有其他玩家，如果有，则取该范围所有玩家的平均值，如果没有，则取该配置中的 `default-level` 选项的值做为等级。你可以通过 `player-scan-range` 选项设定扫描范围。

并不是所有的怪物都会被强化，你可以通过 `spawn-chance` 来调控怪物被强化的几率。

这两个选项支持通过示例中的格式取两个数字之间的随机数，不支持数学公式和使用变量。

### 能力抽取

每个能力的配置文件都有 `apply-rules` 部分，这部分配置选项代表设定该能力抽取有关的选项。例如：

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

下面介绍有关选项：

* group：每个能力都会有一个 `apply-rules.group` 选项代表该能力所在的组。其他能力使用相同名称的组，代表这几个能力在同一个组中。插件每次随机打乱所有存在的组的顺序，然后开始从第一个组到最后一个组随机抽取其中的一个能力。当所有的组抽取完毕，但是抽取过程还没有结束，则会重新开始再次从第一个组到最后一个组第二次随机抽取其中的一个能力。以此类推，直到所有可被抽取能力都已抽完，或者抽取过程已结束。
* group-unique：你可以通过 `group-unique` 选项设定此组下的所有能力只会被抽中一次，第二次以后的循环不再参与抽取。
* weight：设定该能力的权重值，越大越容易被抽中。
* match-entity：使用 Match Entity Format，描述哪些实体能够抽取这种能力。
* level-weight：每个强化怪物生成时都会有一个等级值，如果该怪物抽中这个能力，那么就会扣除这个选项设定的值，以此类推，当等级值全部消耗完毕后，就结束此次抽取。支持示例中这种格式代表从两个数字之间随机抽取一个中间值。支持变量 `{level}` 为怪物等级值和数学公式。
