Skip to content

Backpack and Pickup zh

liuye edited this page Nov 8, 2026 · 2 revisions

方块背包与拾取

简体中文 | English

← 返回目录

这一页讲两件事:怪物凭什么有方块可放(虚拟方块背包),以及怪物怎么把地上的东西收进来(拾取)。搭路动作本身怎么选落点、怎么摆方块,请看 放置与搭路;出生时到底发不发装备,请看 出生装备闸门。


1. 背包是什么

方块背包是虚拟的:它不是箱子、没有界面、也没有物品栏格子,只是每只怪物身上的一份"条目 + 数量"清单,专门喂给放置行为。

特征 说明
不开界面 玩家没有任何办法打开或翻动它
死亡不掉落 怪物死亡时背包里的方块不会掉出来,也不会变成掉落物
不写存档 服务器重启、/mobinteract reload 后会重新掷骰;单纯的区块卸载不会(1.4.0 起档案跨卸载、跨变形保留)
副手可见 有背包的怪物会把当前方块拿在副手,数量 = 该条目的库存;主手留给镐子
不覆盖原有副手 怪物原本副手已有物品时不覆盖,被换下的物品掉落概率为 0
可被查看 /mobinteract inspect 会列出这只怪背包里每个条目与数量

要点:背包的唯一用途是搭路消耗。它不参与战斗,也不影响挖掘速度——挖掘只看主手有没有镐子(见 挖掘)。


2. 怪物什么时候会有背包

只有一条判定路径:先过出生闸门,再看背包概率。没过闸门的怪物永远拿不到方块,也没有任何"事后补发"的通道。

2.1 出生闸门(主路径)

怪物进入世界时,equip.yml 的 chance(默认 0.10)先掷一次骰子;通过之后,才在里面再抽两样东西:

通过闸门(equip.yml 的 chance,默认 0.10)
├── 抽镐子:mining.yml tool.give.chance(默认 0.80)
└── 抽背包:placement.yml backpack.chance(默认 0.65)

所以"出生时同时带镐子和方块"的比例是两级概率相乘的结果,默认配置下远低于 65%——0.10 × 0.65 只有约 6.5%。想提高"会搭路的怪"的数量,先调 equip.yml 的 chance,再考虑 backpack.chance,否则只调后者收益很小。

2.2 闸门结果是终局

闸门掷一次就定终身:没过闸门的怪物,无论什么时候需要放置方块,都不会再补抽背包。因此"带方块"的怪物比例一定落在 equip.yml 的 chance 以内,不会悄悄超标。镐子同理。

这也是 pickup.only-equipped(默认开启)存在的原因:如果拾取不看闸门,一只空手怪只要走到地上的方块旁边,就能自己攒出背包,闸门就被绕过去了。

如果你想让世界里的怪物更容易搭路,可调的旋钮只有 equip.yml 的 chance(以及按世界覆盖),backpack.chance 只是在闸门之内再筛一遍。

2.3 已经生成的怪物

闸门结果不会事后重算。想给世界里已有的怪物补装备,只有两条路:让它重新生成,或者手动把东西塞给它。改配置 + /mobinteract reload 只影响之后新生成的怪物。


3. 三个数字:概率、种类数、总数量

配置 默认 含义
backpack.chance 0.65 拥有背包的概率(过闸门之后再乘这一层)
backpack.kinds.min / .max 1 / 4 背包里有几种方块,闭区间
backpack.total.min / .max 6 / 20 背包里一共多少个方块,闭区间

几条容易踩的规则:

  • 区间都是闭区间,min 与 max 本身都能取到。
  • max < min 时不会报错,插件会自动把两者交换并打印一次告警。看到告警就去把配置改回来。
  • 种类数与总数量是分别独立掷的:可能掷出 4 种共 20 个,也可能掷出 1 种共 6 个。总数量不足以覆盖种类数时会截断种类(见下一节)。
  • 默认的 20 个上限配合 placement.max-per-chase(默认 32)意味着:一只怪单次追击通常放不完整个背包,库存往往还有剩。

4. 背包是怎么装出来的

生成顺序是固定的四步,理解这四步就能预判背包长什么样:

  1. 掷种类数:从 kinds.min..kinds.max 里随机取一个整数。
  2. 按权重无放回抽样:从 entries 列表里按每条自己的 weight 抽条目,抽过的不再放回,所以同一 id 不会在一个背包里出现两次。
  3. 掷总数量:从 total.min..total.max 里随机取一个整数。
  4. 把总数分配到已选种类:每个种类至少 1 个;如果总数量小于种类数,则截断种类——多出来的种类被丢弃,保证"每种至少一个"这条不变式。

举例(示例,非默认值):掷出 3 种、总数 6 个 → 3 种各先占 1 个,剩下 3 个再分到这几个种类上。如果这种情况掷出总数 2、种类 3,则只会保留 2 种,各 1 个。

抽样的"无放回"只作用于种类。放置时每次消耗的具体是哪一个方块,按 entries 里各条的原始 weight 重抽,所以权重高的条目会反复出现——权重表达的是"抽中的倾向",不是库存里的数量比例。


5. entries:可放什么

entries 是 placement.yml 顶层的列表(不在 backpack: 之下),每条必须有唯一 id、type、weight。

type 专属字段 行为
block material,可选 block-data 放一个普通方块
tnt fuse-ticks 直接生成一个已点燃的 TNT 实体,不先占一格
fluid fluid: WATER / LAVA,consume-bucket 倒流体,consume-bucket 决定是否扣除桶

默认条目是 6 种普通方块 + TNT + 熔岩桶 + 水桶,全部是低价值自然方块,并且刻意不含沙子、沙砾这类受重力影响的方块——背包里一旦混进会塌的方块,搭出来的桥就会自己垮。

两个与背包直接相关的注意点:

  • 条目被抽中但库存为 0 时,这一条放不出来,放置行为会跳过它。
  • TNT / 桶属于功能方块:placement.special-only-under-target 为 true(默认)时它们只会被放在目标所在的那一格,不参与搭路。所以它们在背包里存在感很低,别指望靠它们垫高。
  • tnt 的 fuse-ticks 在随插件生成的 placement.yml 里是 60;只有在键被删掉时才会用到内置兜底值 80。配置里留着这个键时以文件为准。

6. 每放一格消耗一个

  • 每成功放置一格,就消耗一个方块。搭楼梯、垫高、搭桥、往下搭一格都算一格。
  • 抽中的方块在放置动作开始时就立即从库存扣除(相当于预留)。放置失败、落点被占、朝向不对导致转向失败,都会把方块退回库存——所以"放了半天没搭起来"不会偷偷吃掉方块。
  • 只有真正放下方块的动作才扣库存。单纯"走过去"(让位、上岸、走上已有的台阶)不消耗方块。
  • 库存见底后放置行为自然停下来,不用额外配置。真正的次数上限是 placement.max-per-chase(默认 32)与单次追击的进度,细节见 放置与搭路。
  • 通过拾取攒下来的方块进的是同一个背包,与出生时抽到的条目共用库存。

7. 拾取:触发条件与半径

拾取让怪物主动去捡地上的东西。总开关有两个,任一关闭都不生效:

键 默认 说明
placement.enabled true 放置的总开关,同时控制拾取
pickup.enabled true 拾取自己的开关;关闭后原版拾取保持原样

判定节奏与距离:

键 默认 说明
pickup.radius 8.0 搜索半径:水平 radius 格,竖直 max(2, radius × 0.5) 格
pickup.reach 1.8 真正捡起的距离,必须小于 radius
  • 每只被接管、且通过世界 / 生物筛选的怪物每秒检查一次,挑出最近的"值得捡"的掉落物,先下寻路指令走过去,进入 reach 才真正把掉落物移除。
  • reach 必须严格小于 radius。写反了(比如 radius: 1.0、reach: 1.8)不会报错,插件会自动把 reach 下调为 radius / 2 并告警。想让怪物"远远看见就冲过去",把 radius 调大,reach 保持默认即可。
  • 竖直方向的搜索范围是 max(2, radius × 0.5):默认 radius: 8.0 时约 4 格,也就是能捡到脚下方坑里的东西,但捡不到头顶十几格外的。

8. 捡什么、不捡什么

类别 捡不捡 去处
entries 里列出的方块 ✅ 进方块背包(pickup.blocks)
镐子 ✅ 主手空着时进主手(pickup.pickaxes)
其他可放置方块(钻石块、下界合金块等) ❌ 留在地上
有重力的方块(沙子、沙砾等) ❌ 留在地上
硬黑名单方块(基岩、刷怪笼等) ❌ 留在地上
非方块物品(武器、食物、盔甲等) ❌ 留在地上

补充规则:

  • 有重力的方块一律不捡:放下去会塌,捡了只会污染背包、搭出会垮的路。
  • 只捡背包用得上的:方块材质必须已经出现在 entries 里(type: block 的条目)才会被捡,其余一律留在原地。原因就在那个 15 秒清理上:怪物存进去的方块到期会被销毁,捡走玩家一块钻石块等于静默删掉它。想让怪物捡某种方块,先给 entries 加一条。
  • 镐子进主手,拿不住就扔回地上:主手已有物品时捡不了镐子,镐子会掉回地面,不会被凭空吞掉。想让它捡镐子,先让主手空出来。
  • 捡到的镐子按原版规则掉落:玩家击杀怪物能把它拿回来,不受 tool.give.drop-chance(插件发放的镐子默认 0.0 不掉落)约束。
  • 忙碌时会被打断吗:正在挖掘或放置的怪物不会被拾取打断,会先把手上的事做完。
  • 原版顺手拾取会被改写:原版有时会把掉落物直接塞进怪物手里,插件会把这个结果改成"方块进背包、镐子进主手",避免背包库存和副手显示对不上。

9. pickup.only-equipped

键 含义
pickup.only-equipped 只有通过出生装备闸门的怪物才捡东西

这个开关是给"装备比例失控"准备的保险:出生闸门的本意是"带镐子 + 带方块"的怪物合计不超过 equip.yml 的 chance(默认 0.10)。但拾取是后天获得装备的通道——一只空手怪只要走到地上的方块旁边,就能自己攒出一个背包,闸门形同虚设。

打开 pickup.only-equipped 后,捡东西的资格也被闸门管住:没通过闸门的怪即使站在掉落物上也不会伸手。这样"带镐子 + 带方块"的比例才能真的压在 equip.yml 配置的数字以内。

手册的 placement.yml 键表里没有列出这一项的默认值。以你服务器上实际生成的 placement.yml 为准;如果文件里没有这个键,说明你这版还没有这项开关。


10. 背包不持久化

这是最容易被当成 bug 的一条:

  • 区块卸载不再重新掷骰:走出视距、区块卸载都不会动档案,1.4.0 起连怪物变形(僵尸变溺尸之类)也保留,所以不可能靠"走远再回来"刷出一包新方块。
  • 服务器重启会重新掷骰(档案只在内存里),/mobinteract reload 同样会让世界里已有的怪重掷。
  • 拾取来的方块随实体移除一起消失,不会掉回地上。
  • 因此"我明明看到它捡了一堆圆石,回来就没了"是预期行为,不是数据丢失。

对服主的实际影响:依赖怪物长期囤积方块来搭长桥的玩法不可靠——placement.bridge-max-length(默认 24)这种长距离搭路,怪物往往在中途就因为重新加载而重置库存。想让长距离搭路稳定,靠的是提高 backpack.total.max 与 placement.max-per-chase,而不是期待它慢慢攒。顺带一条:怪物死亡时背包里的方块不会掉落,所以刷怪 farm 不会因为背包而多出方块。


11. 可直接复制的配置片段

以下全部是默认值,把整段贴进 placement.yml 即可,键的位置与缩进与生成的文件一致:

# placement.yml
backpack:
  # 拥有背包的概率(出生闸门通过之后再乘这一层)
  chance: 0.65
  # 背包总方块数(闭区间)
  total:
    min: 6
    max: 20
  # 方块种类数(闭区间)
  kinds:
    min: 1
    max: 4

pickup:
  # 拾取总开关;placement.enabled 也会一并控制拾取
  enabled: true
  # 搜索半径:水平 radius,竖直 max(2, radius * 0.5)
  radius: 8.0
  # 真正捡起的距离,必须小于 radius
  reach: 1.8
  # 方块进背包
  blocks: true
  # 镐子进主手
  pickaxes: true

entries 不在 backpack: 里面,它是 placement.yml 的顶层列表,保持默认(6 种普通方块 + TNT + 熔岩桶 + 水桶)即可;要改条目结构,注意每条都要有唯一的 id、type、weight。

一个常见的"让怪更能搭路"的调整方向(改完记得 /mobinteract reload):

backpack:
  chance: 0.65      # 先别急着拉到 1.0
  total:
    min: 12         # 抬高下限,减少"刚搭两格就没料"的情况
    max: 32
  kinds:
    min: 1
    max: 4

只调 backpack.chance 的收益受 equip.yml 的 chance 压制;想让整片世界的怪都更能搭路,先看 出生装备闸门。


12. 排查清单

现象 先看什么
怪物完全不捡东西 placement.enabled 与 pickup.enabled 是否都为 true;世界 / 生物筛选是否把它排除了;是否开了 pickup.only-equipped 而它没过闸门
捡了方块但从不放置 背包是否真的非空(/mobinteract inspect);是否已经用满 placement.max-per-chase;是否在放置冷却里;有没有追击目标
主手一直有东西,捡不了镐子 主手被占时镐子会被扔回地上;先清空主手,或让 tool.require-pickaxe 之外的物品别占位
沙子、沙砾躺在脚边不捡 预期行为:有重力的方块不捡
怪物背包里的方块种类很奇怪 entries 的 weight 决定抽中倾向;权重高的条目会频繁出现
捡到的方块"过一会儿没了" 服务器重启或 reload 会让怪物重掷,见第 10 节
大量怪物同时冲同一堆掉落物 拾取按"最近的值得捡的掉落物"逐个分配,没有全局排队;密集刷怪时属正常表现

需要看具体数值时,/mobinteract status 会打印世界 / 生物筛选、放置上限与拾取配置的摘要;/mobinteract inspect 看准星附近的怪物能看到它的背包条目、主手镐子、单次追击已放置数与最近行为。命令与权限见 命令与权限,文本措辞在 message.yml 里改。


相关页面

  • 放置与搭路——背包里的方块最终怎么变成楼梯、柱子和桥
  • 出生装备闸门——equip.yml 的 chance 与"带镐子 + 带方块"的合计比例
  • 挖掘——主手镐子的材质与速度,以及为什么挖掘期间不搭路
  • 命令与权限——/mobinteract status|inspect|reload
  • 常见问题——怪物不动作、配置不生效一类的通用排查

Clone this wiki locally