Kzeroko KTM2

地面导航与村民对话

基于碰撞形状的陆地寻路、有限恢复,以及村民独占对话活动。

更新于 2026/9/30 9 分钟阅读

原版集成调整地面生物执行路径的方式,以及村民在交谈时如何保持注意力。这些内部系统通过 mixin 接入,保留原版目标选择和威胁处理,修改碰撞检查与活动归属。

它做什么

CollisionAwarePathing 根据生物实际占地与碰撞几何修正陆地节点;SmartNavigationRecovery 检测停滞路径并请求替代路线。两者都不负责为生物选择行为目标。

当存活且在附近的交易顾客或 Blabber 对话对象存在、且没有威胁占用大脑时,VillagerConversationLock 保持注册活动 isekaiexpansion:in_dialogue。交易、铁匠、问路和普通对话的选择由独立处理器负责。

运行时模型

地面路径执行

层级职责
通用节点分类修正 OPEN/TRAPDOOR 格子。活板门碰撞形状为空时为 OPEN,否则先设为 BLOCKED;其他具有非空形状的 OPEN 格子也设为 BLOCKED。
实体净空先检查近期避让位置。仅选定的地面节点类型进入几何验证;完整支撑上方的普通空旷空间跳过详细检查。
支撑表面在节点下方方块层中,取与生物占地重叠且不高于节点高度加 epsilon 的最高碰撞盒顶面;没有支撑则无放置结果。
完整身体在解析出的脚底高度使用生物宽高。BLOCKED/TRAPDOOR 只有在放置位置有效且净空足够时才转为 WALKABLE。
方向性接近记录由 BLOCKED/TRAPDOOR 重新开放的节点;当来源或目标涉及这些节点时检查过渡占地。目标位置空闲不代表各个方向都能进入。
路点高度陆地导航在水/岩浆之外使用有限的支撑面小数 Y。
跳跃启动只有所需攀升超过实体上报的台阶高度加 epsilon 才启动跳跃;被抑制的 JUMPING 状态恢复为 WAIT。

净空候选类型为 OPEN、BLOCKED、TRAPDOOR、WALKABLE、WALKABLE_DOOR、DOOR_OPEN、RAIL。其他节点类型保持原结果,因此不会普遍把危险格或栅栏转成可行走节点。节点生成器清理时会清空方向敏感记录。节点生成使用传入的搜索视图,不通过其他加载器请求区块。

碰撞 epsilon 为 0.0001 格。工具本身不提高台阶高度,NPC 跨步辅助属于独立系统。跳跃抑制注入 MoveControl.tick,适用范围比仅限陆地的恢复门槛更广。

停滞路径恢复

恢复在使用 LandPathNodeMaker 的导航 tick 末尾运行。客户端、骑乘、无重力、水中或岩浆中会重置恢复。路径缺失或完成时也重置,并清理过期避让记录。

设置数值含义
局部修复停滞 18 ticks(0.9 秒)尝试推进已经到达实际支撑高度的节点。
重算门槛停滞 32 ticks(1.6 秒)同时等待当前重算冷却结束。
重算失败上限3 次失败且达到上限时保持导航停止,并重置恢复追踪。
基础冷却16 ticks(0.8 秒)接受替代路径后使用;失败重试则乘以尝试次数。
避让时间100 ticks(5 秒),再加此前尝试次数 × 20 ticks(1 秒)后续搜索排除选定的失败节点。
位置进展水平位移平方至少 0.01相对于上次认可的进展位置。
接近进展水平节点距离平方减少至少 0.04必须与位置进展同时满足。
避让容量每个生物 12 个节点满容量时新增位置淘汰最早到期项;重复位置只能延长、不能缩短期限。

仅上下跳动不算进展。节点索引变化会清零尝试次数;普通位置进展只重置停滞计数,不清零尝试次数。更换追踪路径也只重置停滞。因此,“失败三次”不是所有已接受替代路线的终身总上限。

恢复选择当前节点作为失败位置;若水平距离在 max(0.75, width) 格以内且存在后继节点,则选择后继。工具先停止导航,再以距离参数 1 请求原目标路径;只有路径非空、不同于旧路径且启动成功才接受。否则,在未达到上限时恢复旧路径索引与速度,继续有限重试。

物理到达修复使用水平容差 max(nodeReachProximity, min(0.85, width × 0.65))、垂直容差 max(0.65, stepHeight + 0.15) 格。这些容差用于推进已有路径节点,不能据此判断任意传送落点安全。

避让记录是通过 SmartNavigationCarrier 安装的实体临时映射。到期时间小于等于世界时间时失效。重置恢复不会清空该独立映射;过期清理或实体生命周期结束才移除记录,不涉及 NBT 迁移。

对话归属

村民每次初始化大脑(包括职业变化后的重建)都会注册独占对话任务列表。核心列表保留已有任务,并以优先级 0 加入锁任务;Blabber 的 InDialogueTask 位于对话活动内,优先级 20,保持原地。铁匠劳动具有独立活动和优先级 10 的核心任务。

交谈有效表示交易顾客或 Blabber 对象存活、处于同一世界且距离不超过 16 格(平方距离 256)。锁检查的是这些引用,不是某个屏幕类。任务还要求村民存活,每 tick 重申活动归属,不受运行时限终止。

威胁包括受伤/附近敌对实体检查,以及 PANIC、PRE_RAID、RAID、HIDE 活动;它们会阻止继续持锁。进入活动时清除 PATH、WALK_TARGET、LOOK_TARGET、BREED_TARGET、INTERACTION_TARGET,再调用 doExclusively。已经持有活动时不会反复清空这些记忆。

释放调用 Blabber.releaseDialogueEntity。若其他活动已经接管大脑,则保留该活动;否则重置可能活动并按当前世界时间刷新日程。此方法没有显式关闭交易屏幕,也不自行清除顾客。锁的距离释放规则不能视为交易屏幕的距离规则。

村民对话选择

VillagerDialogueHandler 注册给原版村民。交易交互包装在服务器调用 Blabber,只有返回 PASS 才执行原交易操作;另一个无交易返回钩子触发 NO_TRADE 事件。

判断规则
拒绝MAJOR_NEGATIVE 与 MINOR_NEGATIVE 声望之和的绝对值至少 100,返回拒绝消息。
不受欢迎同一数值至少 50,跳过专门菜单并选择愤怒交易对话。
铁匠TRADE 或 NO_TRADE 中,村民符合条件且玩家受欢迎;优先于问路。
问路铁匠检查之后,TRADE或NO_TRADE中符合条件且玩家受欢迎。
熟客交易玩家对该村民的生意交情至少为3阶段。
普通交易均匀选择 villager/<profession>/scenario_N 下的 1–3。
无交易均匀选择 villager/none/scenario_N 下的 1–30。
其他事件PASS。

特殊交易文件名为 scenario_angry、scenario_familiar。职业键使用注册的完整命名空间ID,再将冒号换成下划线。生成的 ID 使用 isekaiexpansion 命名空间。

同一村民 mixin 还会在准备交易后应用 Charm 定价。Charm 比率为 0.3 + 0.0625 × amplifier;村庄英雄按相同公式比较,不存在时比率为 0。仅当 Charm 严格更高时,为每项交易的特殊价格增加 max(floor(rate × original first-buy count), 1) 的折扣。加入的是完整 Charm 折扣而非两者差额,因此不能描述成替换原版折扣或精确补足差额。

约定

地面几何、路径恢复与对话归属彼此独立。对话锁选择活动,对话任务则停止导航。恢复的水中/骑乘排除条件不代表对话归属也有相同条件。

保留原版核心威胁任务,并在每次大脑重建时注册对话活动。仅把任务放进 CORE 不会形成独占归属。导航临时记录不应写入实体存档;扩展形状处理时保留每个生物自身的寻路惩罚和台阶高度。

扩展方式

将碰撞处理加入共享几何工具,而不是分散到各个 goal。节点生成与路径执行应使用相同脚底高度计算,否则路径可能被接受却永远无法到达。

通过已注册处理器的判断顺序增加村民对话分支;需要原版继续时返回 PASS。NPC 专属菜单和 JSON 编写见对应文档;村民处理器不使用 NPC 的关系等级查找。

验证

  • 使用僵尸、村民、NPC 测试水平/垂直活板门、低矮顶棚、宽体型、台阶、楼梯和小数高度表面;同一格要覆盖可通过及受阻的接近方向。
  • 测试有绕行路线和无绕行路线的停滞情形,确认进展要求水平接近、避让记录会到期、失败重试会停止。
  • 复查门、铁轨、栅栏、水、岩浆、骑乘和无重力移动,确认陆地恢复不接管这些情况。
  • 在工作/休息时段、职业重建后及接近床时打开对话再转入交易,确认独占活动与释放后的日程恢复。
  • 对话期间引入伤害、附近敌对实体或袭击/躲藏活动,确认释放不会覆盖威胁活动。让玩家离开 16 格或切换世界,独立检查大脑和屏幕状态。
  • 检查拒绝、愤怒、熟客、普通与专门对话路径,以及 Charm 比率低于/等于/高于村庄英雄的情况。

相关页面