Skip to content

Equip and Messages zh

liuye edited this page Nov 8, 2026 · 2 revisions

出生装备、玩家文本与追杀优先

简体中文 | English

← 返回目录

这一页讲三份"外围"配置:equip.yml 决定怪物出生时带不带镐子和方块,message.yml 决定玩家看到的字长什么样,targeting.yml 决定怪物先追谁。

三份都在 plugins/MobInteract/ 里,都能用 /mobinteract reload 热重载 —— 改完不用重启服务器。

1. 三份文件各自管什么

文件 管什么 什么时候起作用
equip.yml 出生装备总闸门:这只怪出生时有没有机会拿镐子 / 方块 怪物进入世界的那一刻掷一次骰
message.yml 所有发给玩家的文本(/mobinteract status / inspect / reload) 每次发消息时读当前生效的那一份
targeting.yml 优先追杀玩家:换目标的条件、半径、检查间隔 被接管的怪物每 10 tick 检查一次

有一件事最容易搞混:那两道细分概率不在 equip.yml 里。

抽什么 真正决定概率的键 默认
镐子 mining.yml → tool.give.chance 0.8
方块背包 placement.yml → backpack.chance 0.65

所以调"怪物带东西的比例"时,你可能要动三个文件里的三个键。下面的换算示例会把这层关系算清楚。

2. equip.yml:出生装备总闸门

2.1 文件里只有两个键

键 默认 说明
chance 0.10 出生装备总概率(0..1),超出范围会被截断并在控制台告警
worlds.<世界名> {} 按世界覆盖上面的概率,世界名不区分大小写;没列出的世界用 chance

chance: 0.10 就是"主世界最多 10% 的怪物会带东西"。这个值只管"有没有机会",不区分带的是镐子还是方块。

文件缺失时会自动生成;就算你手动删掉它、或者删掉其中某个键,插件照样跑,缺的键按 chance: 0.10 处理。

2.2 闸门里面还有两道骰子

怪物出生
└── 过闸门:equip.yml 的 chance(默认 0.10)
    ├── 抽镐子:mining.yml 的 tool.give.chance(默认 0.8)
    └── 抽背包:placement.yml 的 backpack.chance(默认 0.65)

也就是说:先过闸门,再分别决定镐子和背包,两道骰子互不影响(可能只中一个、可能都中、也可能都不中)。

出生时"带镐子 ∪ 带方块"的比例因此不会超过 equip.yml 的 chance。默认配置下约:

0.10 × (0.80 + 0.65 − 0.80×0.65) ≈ 9.3%

减掉的那一项是"两样都抽中"的重叠部分(0.80 × 0.65 = 0.52),不然会被重复计一次。

2.3 按世界覆盖

chance: 0.10

worlds:
  world: 0.10
  world_nether: 0.30
  world_the_end: 0.0
  • 世界名就是服务器目录里的世界文件夹名,不区分大小写(World_Nether 与 world_nether 等价)。
  • 没列出来的世界继续用上面的全局 chance。
  • 写 0.0 是最干净的"这个世界完全不给装备"开关 —— 比如上面的末地。

注意别和另一套 worlds 混淆:equip.yml 的 worlds 只管出生装备概率;mining.yml / placement.yml 里的 worlds.whitelist / worlds.blacklist 管的是这个世界的怪物参不参与挖掘 / 放置。前者决定"带不带工具",后者决定"带工具也不许动手"。

2.4 换算:想要一半怪物带镐子

先记住两个公式:

带镐子 = equip.yml 的 chance × mining.yml 的 tool.give.chance
带方块 = equip.yml 的 chance × placement.yml 的 backpack.chance

然后倒推 chance:

你想要的 怎么改 实际效果
50% 的怪带镐子 chance: 0.625,tool.give.chance 保持 0.8 镐子 0.625 × 0.8 = 50%,方块 0.625 × 0.65 ≈ 40.6%
50% 带镐子,方块尽量多 chance: 1.0 + tool.give.chance: 0.5 镐子 50%,方块 65%
10% 带镐子 chance: 0.125 + 0.8 镐子 10%,方块 8.1%
只要方块,不要镐子 tool.give.enabled: false 方块 = chance × 0.65
谁都不带 chance: 0.0 0%
下界更凶 worlds: {world_nether: 0.30} 下界 30% 过闸门,主世界仍是 10%

最常见的算错:把 chance 和 tool.give.chance 都从 0.8 改成 0.4,以为结果是 40% —— 实际是 0.4 × 0.4 = 16%,因为两层是相乘的。动手之前先想清楚:要动的是"闸门",还是"闸门里面的那一层"。

改完可以用 /mobinteract status 的「出生装备」行确认:没有按世界覆盖时显示 &7出生装备:&f{percent}%(全局),有覆盖时显示全局概率加覆盖了几个世界。

2.5 出生装备的几条边界

  • 每只怪只掷一次骰,结果固定在它身上:没通过闸门的怪,之后不会因为"捡到了方块""第一次需要搭桥"而补发镐子。
  • 已经生成的怪改不了:改 equip.yml 只影响之后生成的怪物。想让世界里的老怪带装备,只能重新生成或手动给。
  • 主手已有物品不覆盖:本来拿着别的东西的怪,不会被硬塞一把镐子。
  • pickup.only-equipped(默认开):只有通过闸门的怪才会去捡地上的方块 / 镐子。这样"带镐子 + 带方块"的合计比例才不会被拾取行为悄悄拉高。
  • 闸门只掷一次,结果跟定这只怪:未通过闸门的怪,之后任何时刻都不会再补发背包,所以"带方块"的比例不会悄悄超过 equip.yml 里配的值。
  • 想让世界里的怪更容易搭路,真正管用的旋钮是 equip.yml 的 chance(以及按世界覆盖),backpack.chance 只在闸门之内再筛一遍。

3. message.yml:玩家看到的每一个字

3.1 覆盖范围

在范围内:/mobinteract status 的每一行(配置摘要、筛选摘要、状态词、搭路策略、拾取、出生装备、运行期计数、BlockLocker 状态)、/mobinteract inspect 的每一行(怪物标题、冷却、已放置次数、主手镐子、最近行为、背包内容与每个包条目)、/mobinteract reload 的成功与失败回话。

不在范围内:控制台日志。

缺失不致命:整个文件缺失会自动生成;只删掉某个键会回退到内置默认值并在控制台告警一次,不会报错、不会影响启动。

内置默认文案是中文。英文服或其它语言服直接改写这些键即可,不需要动别的东西。

3.2 三种写法

颜色码用 &。 &7、&f、&8&m 这样写,读的时候自动转成 Minecraft 的颜色符号。只有 & 后面跟合法代码字符(0-9a-fk-or,小写)才会转换;正文里单独出现的 & 原样保留,所以写 生存&创造 不会被吃掉。

占位符用 {名字}。 由插件逐个替换,不是格式化字符串,所以文本里可以直接写 %。常用的有 {label}(实际输入的命令,含别名)、{count}、{mob}、{worlds}、{percent}、{seconds}、{max}、{maxPerChase}、{kinds}、{total}、{id}、{type}。每个键上方都注释了它支持哪些占位符。

列表 = 多行。 任何一条消息都能写成 YAML 列表,按顺序逐行发送:

command:
  status:
    header:
      - '&8&m--------&r &bMobInteract &8&m--------'
      - '&7第二行随便写'

想把 /status 的某一行拆成两行,或者给标题栏加一条分隔,就把它改成列表。

3.3 主要键

键分组 内容
command.common.* 通用片段:no-permission / usage / player-only,以及状态词 enabled(开启)/ disabled(关闭)、on-text(开)/ off-text(关)、yes-text(是)/ no-text(否)、none(无)、forever(永久)、unmineable(不可挖掘)、decided(已判定)/ undecided(未判定)
command.status.* /status 的每一行:header、world-filter、mob-filter、mining、trigger、tool、placement、limits、runtime;行内片段 filter.world-all / filter.mob-all / filter.mob-default / filter.whitelist / filter.blacklist-suffix、lifetime-seconds、strategy.line / strategy.stair / strategy.stair-off / strategy.bridge、pickup.line / pickup.range、equip.global / equip.override、blocklocker
command.inspect.* /inspect 的每一行:header({mob})、no-mob、no-profile、cooldowns、placements、tool、status、backpack-none、backpack、backpack-entry(每个背包条目发一次)
command.reload.* success(带 {count})/ failed

几条常用键的默认文案,改之前对一眼:

键 默认文案 占位符
command.common.no-permission &c你没有权限使用该命令。 无
command.common.usage &e用法:/{label} <reload|status|inspect> {label}
command.common.player-only &c该子命令只能由玩家执行。 无
command.status.equip.global &7出生装备:&f{percent}%(全局) {percent}
command.status.equip.override &7出生装备:&f{percent}% &7按世界覆盖=&f{worlds} 个 {percent}、{worlds}
command.inspect.no-mob &e视线内没有怪物(把准星对准 16 格内的怪物再试)。 无
command.inspect.backpack &7方块背包:&f{kinds} 种 / {total} 个 {kinds}、{total}
command.inspect.backpack-entry &8 - &f{id} &7({type}) × {count} {id}、{type}、{count}
command.reload.success &aMobInteract 配置已重载(不打断进行中的行为)。已加载消息 {count} 条。 {count}
command.reload.failed &c配置重载失败,详见控制台日志。 无

3.4 两个改文案的例子

把 reload 回话换成自己服的名字:

command:
  reload:
    success: '&a[我的服] 配置已重载,当前 &f{count} &a条文本生效。'

把掉落提示的"是 / 否"换成勾叉(状态词是全局共用的,改一处,/status 里所有布尔位一起变):

command:
  common:
    yes-text: '&a✔'
    no-text: '&c✘'

3.5 删键等于"恢复默认",不是"关掉功能"

  • 删掉一个键:这一行回到内置默认文案,控制台一次性告警,功能照旧。
  • 想彻底不让某一行出现,别用删键的办法(删了只会变回默认),直接改文案更省事。
  • 别把键名起成 YAML 的布尔值:on / off / yes / no 会被解析成 true / false。内置的状态词键因此带 -text 后缀(on-text、yes-text……),自己加键时也照这个习惯来。

3.6 热重载与"消息条数"

/mobinteract reload 会一起重读 mining.yml / placement.yml / equip.yml / targeting.yml / message.yml / update.yml:解析在全局区域线程完成,产出新快照后整体替换,不打断正在进行的挖掘 / 放置。

回话里那个数字是当前生效的消息条目数(command.reload.success 的 {count})。改完看到"已加载消息 N 条"里的 N 变了,说明新文件确实读进去了;数字一点没变,八成是 YAML 缩进写错、整段没被读到,或者你改的键本来就不存在。

真出错时会走 command.reload.failed(&c配置重载失败,详见控制台日志。),具体位置去控制台看。

4. targeting.yml:优先追杀玩家

4.1 五个键

键 默认 说明
enabled true 总开关
radius 16.0 索敌半径(1..128);玩家在这个范围内才会被优先锁定
interval-ticks 10 检查间隔(1..200);10 = 每秒 2 次
require-line-of-sight false 是否要求能看见玩家。false = 隔着墙也会朝玩家走(配合挖掘 / 搭路就是"拆墙过来")
keep-villager-target true 附近没有可追玩家时是否保留原目标;false = 主动清空目标,专心找玩家

4.2 它到底改了什么

被插件接管的怪物每隔 interval-ticks 看一次周围:只要半径内有可追的玩家(生存 / 冒险模式),就把目标切成最近的玩家。

几条规则值得记住:

  • 已经在追玩家就不会来回换。 只在"当前目标不是玩家"时才接管,避免目标在几个玩家之间反复横跳。
  • 创造 / 旁观模式不算候选。 只有生存和冒险模式的玩家会被追。
  • 必须同世界。 跨维度的玩家不在候选里。
  • 距离按三维算。 站在柱子顶上、蹲在洞里的玩家照样算"最近",所以垫高 / 往下挖的怪会真的朝你所在的高度来。
  • 它只改"追谁"。 不接管原版寻路,所以不会和挖掘 / 放置抢移动控制。

4.3 和原版索敌的关系

  • 不删除、不替换原版行为。 原版该打村民还是打村民、该打铁傀儡还是打铁傀儡,只是"附近有玩家"时优先玩家。
  • keep-villager-target: true(默认)= 附近没玩家时保留原目标,继续干原来的事;false = 主动清空目标,专心找人 —— 更像"猎杀玩家"的服。
  • require-line-of-sight: false(默认)是这套机制最好玩的地方:隔着墙也会朝你走,配合挖掘 / 搭路就成了"拆墙过来"。想更接近原版、更"讲道理",把它改成 true。
  • 挖掘的"寻路受阻"触发仍然看原版目标:玩家被墙彻底封死、怪又看不见时不会触发,这种情况要靠 trigger.configured-blocks(见 挖掘 页)。

4.4 几种典型配方

想要的效果 怎么配
普通生存服:玩家优先,但别太凶 radius: 16.0、interval-ticks: 10、require-line-of-sight: true、keep-villager-target: true
硬核:看见就追,隔着墙也拆过来 默认即可(require-line-of-sight: false);radius 可上调到 24 左右
怪多、想省性能 interval-ticks: 20(每秒 1 次)、radius: 8.0
只想让怪打村民,不想被玩家吸引 enabled: false

5. 排查:先看哪一行

现象 先查
怪物不带镐子 equip.yml 的 chance;worlds 里有没有把这个世界写成 0.0;再看 mining.yml 的 tool.give.enabled / tool.give.chance
怪物有镐子却不挖 tool.require-pickaxe,以及 /mobinteract inspect 里的「主手镐子」
怪物不搭路 backpack.chance、placement.enabled、placement.max-per-chase
改了文本没反应 /mobinteract reload 是否成功、消息条数有没有变;YAML 缩进;键名有没有写错
玩家从怪身边走过却没人理 targeting.yml 的 enabled、radius;玩家是不是创造 / 旁观;require-line-of-sight: true 时玩家是不是在墙后
怪一会儿追玩家一会儿追村民 属正常:只在"当前目标不是玩家"时接管,已经在追玩家就不再换
老怪一直不带装备 出生装备只在出生时掷一次,改配置不影响已经存在的怪

相关页面

Clone this wiki locally