Skip to content

Placement zh

liuye edited this page Nov 7, 2026 · 1 revision

放置搭路

简体中文 | English

← 返回目录

怪物追你到悬崖边,然后从怀里掏出一块圆石垫在脚下——这就是放置行为。被接管的僵尸、骷髅、灾厄村民、猪灵、女巫会用一个虚拟方块背包里的材料自己搭路:搭楼梯、垫柱子、铺桥。

这一页讲清楚四件事:它什么时候动手、三种搭法各自怎么判定、为什么大多数时候它什么都不放,以及所有 placement.* 键和 entries 条目怎么写。

一眼看懂

情况 它会做什么 消耗方块
目标在前面,只高 1 格,或脚下本来就有路 直接走上去 不消耗
目标在前上方,横向 ≥ 4 格,高度差 2 格以上、不到 8 格 搭楼梯:一级同时前进一格、抬高一级 每级 1 块
目标很高(高度差 ≥ 8 格),或就在自己正上方 原地垫高:先找一列空列,再逐格往上叠 每格 1 块
目标在沟对面,或需要先升到同一高度 先垫高到目标高度,再横向搭桥 每格 1 块
目标明显更低,前方是深沟 往下搭一格,正好一步落差 1 块
平地上追人、只差一两格 什么都不放,交给原版寻路 —

什么时候会放置

四个前提要同时满足:

  1. 有追击目标。默认只认当前 AI 的追击对象;placement.vertical-aggro: true(默认)时,如果上方 16 格内有可见的生存 / 冒险模式玩家而怪物还没索敌,它会主动锁定——垫高逻辑要靠这一条才生效。
  2. 背包非空。要么出生时抽到了背包(backpack.chance,默认 0.65),要么是拾取攒下来的方块(见 背包与拾取)。
  3. 本次追击没放满 placement.max-per-chase(默认 32),并且不在放置冷却中。
  4. 抽到的条目能用来搭路。如果抽中的是 TNT / 水桶 / 熔岩桶,placement.special-only-under-target: true(默认)时它们只放在目标所在的那一格,完全不参与搭路——背包里只有功能方块时,它不会为了赶路铺桥。

真正触发放置的是两件事:目标和自己在高度上有差(上不去),或者中间隔着沟 / 落差(过不去)。

反过来说,以下情况它不会动手:

情形 原因
目标离得很近、高度差不超过 2 格 原版近战 / 跳跃就能解决,插不上手
前方落差 ≤ 3 格 原版自己就能吃下 3 格落差,直接走下去更快
前方或前方脚下是液体 液体一律回避,不搭桥也不搭楼梯
正在挖掘 挖掘与放置互斥,挖掘期间不会启动新的搭路
世界 / 生物被筛掉,或 enabled: false 整个行为不生效

先想清楚再放:策略优先级

每一步都按下面的顺序试,前一档能解决就不进下一档:

近战 → 上岸 → 抬高(楼梯 / 垫高)→ 搭桥 / 往下搭

条件 动作
横向 < 1 格,且目标不高出 2 格 不放置,交给原版近战
自己泡在水里(脚所在格或它下面那格是液体) 先走到附近干燥落脚点(不消耗方块);目标也在水里就直接游过去
高度差 ≥ 2 格,横向 ≥ stair-min-distance(4.0),高度差 < pillar-far-height(8) 搭楼梯
高度差 ≥ pillar-far-height(8),或横向 ≤ pillar-near-distance(2.0) 原地垫高
其余情况(目标在沟对面、需要先升到同一高度) 先垫高到目标高度,再横向搭桥
目标明显更低(vertical-drop,默认 1.5),前方是深沟 往下搭一格

顺带说清楚两个边界:只高 1 格的一律交给原版跳跃,不搭楼梯也不垫高;placement.bridge-max-length(默认 24)之外的远目标既不搭桥也不搭楼梯,避免追一只远处的怪就铺一条天桥。

三种动作,各自怎么落方块

动作 方块放在哪 之后怎么走
楼梯 身前、与脚同高的那一格(只沿水平差更大的那条轴) 走到该格上方,跳上去同时前进一格
垫高 自己脚下这一格 先抬高一格,再放方块;不做朝向检查
搭桥 前方脚下那一格(往下搭时再低一格) 走到刚铺那格上方
走过去 选定的垫高列 / 已经铺好的那格 只下寻路指令,不放方块

细节:

  • 水平方向永远只走主轴向(水平差大的那条轴),所以成品是一条楼梯、一根柱子、一条 L 形桥,不会散成一地小台阶。
  • 垫高列选定后会记在怪物身上,不会每几 tick 换一个落点;走不过去 / 放不下的列会记入「本次追击不再尝试」,再换一列。搜索范围由 placement.lane-search-radius(默认 3,0 = 只看自己脚下)决定。
  • 垫高为什么不做朝向检查:低头看脚下会让怪物卡成反复转向失败,所以这一档故意跳过。
  • 条目在动作开始时立即从背包扣除(预留);放置失败 / 位置被占 / 转不过去会退回,所以放置次数永远不会超过库存。
  • 建路很快:楼梯 / 垫高 / 桥面每格之间只等约 0.2 秒;只有功能方块(TNT / 桶)才用 placement.cooldown-seconds(默认 3.0)。
  • 有背包的怪物会把当前方块一直拿在副手(数量 = 库存,主手留给镐子);原本副手有物品时不会被覆盖,放在副手的物品掉落概率为 0。
  • 放置位置被同伴占住,或自己被挤出一格范围时,会重新规划(最多 4 次),而不是直接失败进冷却。

为什么不乱放

这张表就是「它为什么不帮我铺路」的答案:

情形 结果
前方已有现成台阶(只高 1 格),或前方脚下本来就有实地 直接走上去,不垫方块
前方落差 ≤ 3 格 直接走下去,不铺路
前方 / 前方脚下是液体 不搭楼梯、不铺桥
前方是两格以上的墙 不硬搭,交给原版绕行或挖掘行为
落点那一格里有任何生物(含追击目标) 不放置;但「前方那一格站着目标」不算挡路(目标本身不计入占位判断)
头顶(脚上方第 2 格)被方块压着,挖掉就能继续垫 有镐子的怪物交给挖掘行为先挖穿;没镐子 / 挖不动 → 换一列
被同伴挤住(placement.spread-crowd) 先让位散开,本次不放置

两条最容易踩到的:平地上不铺路(落差 ≤ 3 格直接走下去,只有更深的沟才搭),以及有人挡着就等——落点被占时它宁可站着等,也不会往同伴脑袋上放方块。

另外 placement.max-per-chase 是硬上限:楼梯 / 垫高 / 搭桥都是「一格一次」,一次追击放满 32 次就停手等下一次追击。所以桥还没铺到对岸就停住,通常是这个值太小(1.2.0 之前的默认值 10 更容易出现)。

placement.* 配置参考

距离、朝向与节奏

键 默认 说明
placement.max-distance 4.0 怪物到放置位置的最大距离;require-adjacent 为 true 时以邻接为准,本项只作上限
placement.require-adjacent true 放置位置必须紧挨着:水平 ±1,竖直 −2..+1(−2 专用于往下搭一格);设 false 退回按 max-distance 判断
placement.max-facing-angle 60 放置前朝向夹角上限(度)。超出先转头重试,多次转不过去就取消这次放置(条目退回背包)
placement.max-per-chase 32 单次追击最多放置次数(0..512)。目标变化或丢失后重置
placement.cooldown-seconds 3.0 功能方块冷却(建路只用约 0.2 秒)
placement.build-delay-ticks 6 「短搭建进度」延迟:选中条目到真正放置之间的等待(tick)
placement.retry-seconds 1.5 放置被拒绝 / 失败后的重试冷却
placement.vertical-drop 1.5 判定「目标明显更低」的高度差,触发往下搭一格

三种动作的开关与阈值

键 默认 说明
placement.stair-up true 是否允许搭楼梯
placement.stair-min-distance 4.0 横向 ≥ 该值优先搭楼梯
placement.pillar-up true 是否允许原地垫高;关闭后高处目标只剩楼梯 / 搭桥两种办法
placement.pillar-up-max-height 16 单次追击最多垫高格数(0 = 不限,防止一路垫上天)
placement.pillar-far-height 8 高度差 ≥ 该值一律改用垫高,不搭楼梯
placement.pillar-near-distance 2.0 横向 ≤ 该值一律原地垫高;不小于 stair-min-distance 时自动下调并告警
placement.bridge true 是否允许横向搭桥
placement.bridge-max-length 24 离目标超过该距离不再搭桥 / 搭楼梯

行为细节与存在时间

键 默认 说明
placement.lane-search-radius 3 挑垫高列的水平搜索半径(0 = 只看自己脚下)
placement.smart-ascend true 先侦察原版寻路 / 附近台阶,必要时才搭
placement.spread-crowd true 挤在一起时让位,避免多只怪叠在同一格上谁也放不了
placement.spacing-radius 1.0 判定「挤在一起」的中心距离
placement.special-only-under-target true 功能方块只放目标那一格,不用于搭路;关掉后它们和普通方块一样能搭路
placement.vertical-aggro true 目标在上方但没索敌时,主动锁定上方 16 格内可见的玩家
placement.block-lifetime-seconds 15 放置方块的存在时间(0 = 永久,上限 86400)

文件级还有几个键:config-version(当前 2,只用于旧文件迁移)、enabled(true,总开关,同时控制拾取)、worlds.whitelist / worlds.blacklist(白名单留空 = 所有世界,黑名单优先)、mob-whitelist / mob-blacklist(留空 = 默认人形集合,["*"] = 全部生物)。

entries:背包里能掏出什么

每个条目必须有唯一的 id、一个 type、一个 weight。weight 是被抽中 / 被选中的相对权重,越大越常见。

type 需要的字段 行为
block material(可选 block-data) 放一个普通方块,搭路的主力
tnt fuse-ticks 直接生成一个已点燃的 TNT 实体,不会先放 TNT 方块;引信单位是 tick,20 tick = 1 秒
fluid fluid: WATER 或 LAVA,加 consume-bucket 倾倒流体;consume-bucket: true = 放一次连桶一起从背包消失,false = 桶被回收,同一个桶可以反复倒

默认条目(6 种普通方块 + TNT + 熔岩桶 + 水桶):

id type weight 关键字段
cobblestone block 30 material: COBBLESTONE
dirt block 22 material: DIRT
stone block 18 material: STONE
andesite block 14 material: ANDESITE
oak_planks block 8 material: OAK_PLANKS
netherrack block 6 material: NETHERRACK
tnt tnt 3 fuse-ticks: 60(3 秒)
lava_bucket fluid 2 fluid: LAVA,consume-bucket: true
water_bucket fluid 4 fluid: WATER,consume-bucket: true

几点要留意:

  • 默认条目只含低价值自然方块,不加钻石块 / 下界合金块这类高价值方块,也不含沙子 / 沙砾这类受重力影响的方块——后者放下去会塌,搭出来的桥和柱子立不住。想加条目可以自己加,但别加有重力的。
  • 背包里装多少块、装几种,由 backpack.* 决定,不在这一页展开,见 背包与拾取。
  • 功能方块在哪落地由 placement.special-only-under-target 决定,默认只在目标那一格。

存在时间、续期与清理

项 行为
默认存在时间 placement.block-lifetime-seconds: 15(0 = 永久,只保留来源标记)
清扫方式 全局清扫器每 20 tick 扫一次到期时间表
批处理 到期方块按区块合并成一次区域任务,一次删一批
删前校验 再次比对方块类型;玩家后来换掉的方块只丢记录,不误删
区块未加载 该条延后 5 秒重试,不丢记录
上方有生物 到期时方块上方 1.2 格内有活着的生物(含正在过桥的怪物)→ 再延一个完整周期
卸载 / 关服 删掉全部登记方块(含设为永久的):先落盘 pending-blocks.txt,再「直接删 + 失败则投递区域任务」,下次启动兜底再清
容量 登记表上限 5 万条,超出按插入顺序淘汰最旧记录
  • 15 秒是按「一段 20 格的桥约 10 秒铺完」定的:刚好够怪物走到对岸。桥更长、柱子更高就把它调大,否则怪物还在桥上走、身后的方块已经开始消失。
  • 有人站在上面就续期,所以不会出现「脚下的桥突然没了」。代价是怪物站在自己的方块上不动时,那块方块会一直留着。
  • 换过的方块只丢记录不误删:玩家在怪物放下的方块位置换了别的方块,清扫器发现类型对不上就只清记录。
  • TNT 与流体同样登记、同样清理(TNT 爆炸后自己就没了)。
  • 登记表是内存态:正常关服会删干净并留下清单,运行期直接被强杀(走不到卸载流程)则不会留下清单,这批方块只能手动清。

可以直接抄的 placement.yml

下面是与放置搭路直接相关的完整片段(backpack.* 与 pickup.* 见 背包与拾取):

config-version: 2
enabled: true                 # 总开关,同时控制拾取

worlds:                       # 白名单留空 = 所有世界;黑名单优先
  whitelist: []
  blacklist: []
mob-whitelist: []             # 留空 = 默认人形集合;["*"] = 全部生物
mob-blacklist: []

entries:                      # id 必须唯一,weight 是相对权重
  - id: cobblestone
    type: block
    weight: 30
    material: COBBLESTONE
  - id: dirt
    type: block
    weight: 22
    material: DIRT
  - id: stone
    type: block
    weight: 18
    material: STONE
  - id: andesite
    type: block
    weight: 14
    material: ANDESITE
  - id: oak_planks
    type: block
    weight: 8
    material: OAK_PLANKS
  - id: netherrack
    type: block
    weight: 6
    material: NETHERRACK
  - id: tnt
    type: tnt
    weight: 3
    fuse-ticks: 60            # 20 tick = 1 秒,60 = 3 秒
  - id: lava_bucket
    type: fluid
    weight: 2
    fluid: LAVA
    consume-bucket: true      # true = 倒一次连桶消耗;false = 桶可反复用
  - id: water_bucket
    type: fluid
    weight: 4
    fluid: WATER
    consume-bucket: true

placement:
  max-distance: 4.0           # 放置距离上限
  require-adjacent: true      # 水平 ±1,竖直 −2..+1(−2 专用于往下搭一格)
  max-facing-angle: 60        # 放置前朝向夹角上限(度)

  max-per-chase: 32           # 单次追击最多放置次数(0..512)
  cooldown-seconds: 3.0       # 只对功能方块生效
  build-delay-ticks: 6
  retry-seconds: 1.5

  vertical-drop: 1.5          # 判定「目标明显更低」的高度差
  block-lifetime-seconds: 15  # 0 = 永久,上限 86400

  stair-up: true              # 楼梯
  stair-min-distance: 4.0

  pillar-up: true             # 垫高
  pillar-up-max-height: 16    # 0 = 不限
  pillar-far-height: 8
  pillar-near-distance: 2.0   # 必须小于 stair-min-distance

  bridge: true                # 搭桥
  bridge-max-length: 24

  lane-search-radius: 3       # 0 = 只看自己脚下
  smart-ascend: true
  spread-crowd: true
  spacing-radius: 1.0
  special-only-under-target: true
  vertical-aggro: true

改完用 /mobinteract reload 热重载即可,不必重启(见 命令与权限)。

从旧版本升上来要注意

项目 说明
placement.block-lifetime-seconds 1.2.0 起默认 15(旧默认 60)。插件不会改写你的文件,旧值请手动改
placement.max-per-chase 1.2.0 起默认 32(旧默认 10)。文件里 config-version: 1 且值仍是 10 时按 32 运行并在控制台告警,建议手动改大
config-version 当前 2;迁移只做 max-per-chase 这一项,其它键的值一律以文件为准

排查:为什么不动 / 为什么方块不消失

  • 用 /mobinteract inspect 看准星内的怪物:冷却、单次追击已放置数、主手镐子、最近行为、垫高格数、背包内容。「最近行为」会直接写原因,例如 放置次数已用完(max-per-chase=32)、放置失败 cobblestone @x,y,z。
  • 常见原因:没背包或库存空了;max-per-chase 用完;目标其实只高 1 格(交给原版跳跃);前方是液体(一律回避);落点被其它生物占着;正在挖掘(挖掘完才轮到放置);世界 / 生物被筛掉,或总开关关掉了。
  • 方块不消失:先确认 block-lifetime-seconds 不是 0;到期时上方 1.2 格内有生物会续期;区块没加载会延后 5 秒重试。
  • 想让它搭得更远:同时调大 max-per-chase、block-lifetime-seconds,必要时再看 bridge-max-length 和 bridge 的开关。

相关页面

Clone this wiki locally