---
title: 配置事件
hide_meta: true
---

# 配置事件

这些钩子让你在 `server_scripts/` 中用 JavaScript 调整 PMMO 配置，而不是手动编辑 TOML 文件。

## 设置干净基线

在 KubeJS 配置事件运行之前，PmmoJS 可以通过 Forge 通用配置文件 `config/pmmojs-common.toml` 清除 PMMO 的内置默认值：

```toml
[disableDefaultSettings]
all = false
skills = false
perks = false
requirements = false
xpAwards = false
itemExtras = false
blockVeinData = false
```

执行顺序保证你的脚本始终生效：

1. PmmoJS 读取 `pmmojs-common.toml`
2. 启用的类别清除 PMMO 的默认数据
3. 你的 `PmmoJS.skillsConfig` 和 `PmmoJS.settings` 调用应用你的自定义数据

## `PmmoJS.skillsConfig`

添加、替换或移除 PMMO 技能。

```js
PmmoJS.skillsConfig(event => {
    event
        .addSkill('defense')
        .withColor(0x2f6fed)
        .withMaxLevel(100)
        .withIconSize(18)
        .build()

    event.removeDefaultSkill('swimming')
})
```

如果你在同一个趟次中移除并重新添加同一个技能，你的自定义定义会生效。

## `PmmoJS.perksConfig`

编辑已有的 PMMO Perk 条目。用于配置 PMMO 自带的 Perk 或你在启动时注册的 Perk。

```js
PmmoJS.perksConfig(event => {
    event.clearPerks(EventType.SKILL_UP)     // 清除所有 SKILL_UP 的 Perk
    event.removePerkType('pmmo:fireworks')   // 按 ID 移除特定 Perk
})
```

核心方法：

- `addPerk(eventType, perkId, skill)` —— 添加新的 Perk 条目
- `clearPerks(eventType)` —— 删除某个事件类型下的所有 Perk
- `removePerkType(perkId)` —— 删除所有匹配的 Perk ID 条目
- `removePerk(tag)` —— 删除同时匹配 Perk ID 和技能的条目

调用 `addPerk(...)` 后，你可以链式调用构建器方法来配置 Perk 条目：

| 方法 | 写入的键 |
|---|---|
| `withCooldown(ticks)` | `cooldown` |
| `withChance(value)` | `chance` |
| `withMinLevel(level)` | `min_level` |
| `withMaxLevel(level)` | `max_level` |
| `withPerXLevel(step)` | `per_x_level` |
| `withMilestones(values)` | `milestones` |
| `withString(key, value)`、`withBool(key, value)`、`withInt(key, value)` 等 | 自定义标量键 |

### 专用 Perk 构建器

PMMO 有若干内置 Perk 类型。PmmoJS 为每种提供了专用的构建器方法：

| 构建器方法 | 配置内容 | 重要键 |
|---|---|---|
| `asAttributePerk()` | 永久属性加成 | `attribute`、`multiplicative`、`max_boost`、`per_level`、`base` |
| `asTempAttributePerk()` | 临时属性加成 | 同上 + `duration` |
| `asDamageBoostPerk()` | 伤害加成 | `applies_to`、`for_damage` + 加成键 |
| `asDamageReducePerk()` | 伤害减免 | `for_damage` + 加成键 |
| `asBreakSpeedPerk()` | 挖掘速度 | `pickaxe_dig`、`axe_dig`、`shovel_dig` 等 |
| `asEffectPerk()` | 药水效果 | `effect`、`duration`、`modifier`、`ambient`、`visible` |
| `asCommandPerk()` | 执行命令 | `command`、`function` |
| `asFireworksPerk()` | 烟花展示 | `colors` |
| `asJumpBoostPerk()` | 跳跃高度加成 | `max_boost`、`per_level`、`base` |
| `asBreathPerk()` | 呼吸时间加成 | `max_boost`、`per_level`、`base` |
| `asVillagerBoostPerk()` | 村民交易加成 | `max_boost`、`per_level`、`base` |
| `asTameBoostPerk()` | 驯服加成 | `max_boost`、`per_level`、`base` |

使用专用构建器的完整示例：

```js
PmmoJS.perksConfig(event => {
  event
    .addPerk(EventType.SKILL_UP, 'pmmo:attribute', 'endurance')
    .asAttributePerk()
    .withAttribute(Java.loadClass('net.minecraft.world.entity.ai.attributes.Attributes').MAX_HEALTH)
    .withPerLevel(1)
    .withMaxBoost(10)
    .build()
})
```

## `PmmoJS.serverConfig`

调整 PMMO 的服务器级设置。

```js
PmmoJS.serverConfig(event => {
    event
        .setMaxLevel(100)
        .setGlobalModifier(1.0)
        .setUseExponentialFormula(true)
        .setTreasureEnabled(true)

    event.addSkillModifier('defense', 1.1)
    event.addJumpXp('agility', 0.5)
    event.addPartyBonus('charisma', 0.1)
})
```

## `PmmoJS.autoValueConfig`

覆盖 PMMO 对方块和物品自动生成数值的方式。

```js
PmmoJS.autoValueConfig(event => {
    event
        .setAutoValuesEnabled(true)
        .setRaritiesModifier(1.5)
        .setHardnessModifier(2.0)

    event.addItemXpAward(EventType.CRAFT, 'smithing', 25)
    event.addBlockReq(ReqType.BREAK, 'mining', 5)
    event.setAxeOverride({
        woodcutting: 15,
    })
})
```

## `PmmoJS.antiCheeseConfig`

配置 AFK 检测、收益递减和 XP 标准化。

```js
PmmoJS.antiCheeseConfig(event => {
    event.setAfkCanSubtract(false)

    event
        .addAfkSetting(EventType.BLOCK_BREAK)
        .minTime(600)
        .reduction(0.1)
        .cooloff(5)
        .tolerance(3.0)
        .strictTolerance(true)
        .build()
})
```

## `PmmoJS.globalsConfig`

管理 PMMO 的全局 NBT 路径和常量。

```js
PmmoJS.globalsConfig(event => {
    event.addPath('durability', 'Damage')
    event.addConstant('MAX_SKILL_LEVEL', '100')
    event.removePath('old_path')
    event.removeConstant('OLD_CONSTANT')
})
```

这些配置钩子通过服务器重载路径应用，因此与 PMMO 的配置重载和 EMI tag 同步兼容。
