
马匹跟随开关
一个添加了热键(默认F6)的模组,使你的当前马匹跟随你。
查看大图切换永久马匹跟随。它使用 Henry 的口哨声,但经过截断,以区别于标准口哨音效。
开启切换 = 1 声短哨 -> 马嘶鸣
关闭切换 = 2 声短哨 -> 马打响鼻
[size=3][color=#D4D4D8]当切换为关闭时,马会在其当前目标位置停下(如果它仍在移动)。[/color][/size]
[color=#D4D4D8][size=4][b]重要说明:[/b][/size][/color]
[color=#D4D4D8]我是为个人使用而制作的,只想按原样分享。我在硬核模式下配合 NoHorseTeleport(无马匹标记版本)使用它。因此我尚未测试它与原版马匹传送的兼容性,所以例如一条非常长或受阻的路径可能会导致、也可能不会导致马匹传送。
[/color]
[color=#D4D4D8][b][size=4]安装:[/size][/b]
- 将下载的 zip 文件解压到你的 KingdomComeDeliverance2\Mods 文件夹,使结构最终为 Mods/horse_follow_toggle/Data/。
- 打开 KingdomComeDeliverance2\user.cfg(如果不存在则创建),并添加 "bind f6 horse_follow",不带引号。
任意空闲按键均可。[/color]
[color=#D4D4D8]- 如果尚未操作,请在 Steam 库中右键点击游戏 -> 属性 -> 在启动选项中添加 "+exec user.cfg",不带引号。
[size=4][b]卸载:[/b][/size]
删除 horse_follow_toggle 模组文件夹。它不应造成任何问题,因为该模组不会覆盖原版文件、替换行为树、音频表、动作映射、defaultProfile.xml 或任何其他共享文件,因此它不会通过覆盖而被其他模组破坏,也不会破坏其他模组。
[/color]
[color=#D4D4D8]以下是 Claude 提供的更详细描述:
## 功能
- 用任意按键切换。 在 user.cfg 中绑定它,按下按键,她就会跟随。再次按下,她就会停下。
- 自适应牵引距离。 当你行走时,她会从大约四米处被重新下达指令,因此她会待在你
身边。当你开始冲刺时,该模组会先让距离拉开再下达指令,这样她
就能以恰当的奔跑步态前进,而不是在你身后无望地小跑。
- 沉浸式音频反馈。 Henry 会吹一声短哨召唤她,吹两声口哨放开她;她会以嘶鸣回应,并在被放开时打响鼻。
- 上马时自动关闭。 不会在你骑乘时还烦人地给马下指令。
- 一切皆可配置,位于一个可用记事本编辑的纯文本文件中。
- 完全存档安全。 参见下方章节——这很重要,不是营销话术。
---
## 安装
1. 解压到你的 Mods 文件夹,使最终结构为:
<br /> KingdomComeDeliverance2\Mods\horse_follow_toggle\mod.manifest <br /> KingdomComeDeliverance2\Mods\horse_follow_toggle\Data\Scripts\mods\horse_follow_toggle.lua <br />
2.
3. 确保该游戏的 Steam 启动选项包含:
<br /> +exec user.cfg <br />
这才是实际应用按键绑定的部分。如果你已经使用任何基于 user.cfg 的模组
(Hide Compass 及类似模组),你就已经具备此项。
### 日志中预期的无害错误
启动时你会在日志中看到以下内容:
<br />[Error] 'user.cfg' -> invalid configuration line: 'bind f6 horse_follow' <br />
这只是表面问题,可以忽略。 KCD2 会读取 user.cfg 两次:一次通过启动
配置解析器,它只接受 name = value 对,因此会拒绝 bind;另一次
是在控制台初始化后通过 +exec 读取,此时控制台语法是有效的。第二次
才是生效的那次。每个 user.cfg 模组都会产生此错误。
---
## 控制台命令
| 命令 | 效果 |
| --- | --- |
| horse_follow | 切换跟随模式开/关 |
| horse_follow_status | 将当前状态、距离、模式和发送次数打印到日志 |
---
## 配置
该脚本以未打包形式发布,因此你可以打开
Mods\horse_follow_toggle\Data\Scripts\mods\horse_follow_toggle.lua,用任意文本编辑器修改数值,然后
重新启动。无需解压或重新打包。
lua <br />RETRIGGER_NEAR_M = 4, -- 你行走时的牵引距离 <br />RETRIGGER_FAR_M = 22, -- 你冲刺时的牵引距离(参见内部机制) <br />SPRINT_SPEED_MPS = 3.2, -- 高于此速度即视为“快速移动” <br />SPEED_SMOOTHING = 0.35, -- 速度测量的平滑值;越高越敏感 <br />MAX_RANGE_M = 60, -- 永远不要在此距离之外给她下指令(安全限制,见下文) <br />MIN_INTERVAL_MS = 800, -- 指令之间的最短时间 <br />TICK_MS = 250, -- 模组检查的频率 <br />CLOSING_EPS_M = 0.2, -- 将“距离以快于此值的速度缩小”视为“她已经过来了” <br />AUTO_OFF_MOUNTED = true, -- 上马时关闭跟随 <br />TOGGLE_COOLDOWN_MS = 1500, -- 忽略距上次按键此时间窗口内的按键 <br />VERBOSE = true, -- 记录每条指令;设为 false 可减少日志 <br />
### 音效序列
lua <br />-- { delayMs, triggerName, playOnHorse, cutAfterMs } <br />SEQ_ON = { <br /> { 0, "v_horse_whistle", false, 300 }, -- Henry 吹口哨(截短) <br /> { 900, "a_o_horse_whinny", true }, -- 她回应 <br />}, <br />SEQ_OFF = { <br /> { 0, "v_horse_whistle", false, 200 }, <br /> { 400, "v_horse_whistle", false, 200 }, -- 两声短哨 = 放开 <br /> { 1100, "a_o_horse_snort", true }, <br />}, <br />
删除一行即可移除一个提示音。将任一表设为 {} 即可完全静音该切换。
cutAfterMs 会提前停止声音——游戏的口哨声约一秒长,将其截断
到 200–300 毫秒会使其听起来像一声短促的鸣叫,区别于普通的唤马口哨。
其他可用的替代触发器:v_dog_whistle1、v_dog_whistle2、
a_o_horse_excited、a_o_horse_head_shake、a_o_horse_lips_shake、a_o_horse_whinny_distant。
请注意,大多数 v_henry_* 触发器(包括 v_henry_hyje,即催马喊声)名称存在,
但没有附加 FMOD 事件,不会播放任何声音。
---
## 内部机制
本节适合想确切了解该模组对游戏做了什么的人。
### 只有一条马匹指令
KCD2 的马匹 AI 只实现了一条玩家指令。在
AI/animal/basic/switch/animal_horseBrain.xml 中,整个 horseModule 收件箱处理器为:
xml <br /><IfCondition condition="$playerCommand.id == $enum:HorseCommands.ComeToMe"> <br /> <Function_callInterrupt_animal_moveToPlayer /> <br /></IfCondition> <br />
Libs/Tables/ai/ai_enums.xml 声明了一个名为 OnLead 的值,注释为*“将马切换到牵引模式,
马会跟随发送者”*——正是该模组想要的效果。它并未实现。 已在游戏内测试:发送它后,
在三十秒的采样中没有任何反应。Halt(id 0)同样没有任何效果。只有 ComeToMe(id 1)有效。
所以这里的“跟随”不是一种新行为。它是重新下达的口哨指令。
### 为什么马会停下
AI/animal/basic/switch/interrupt_animal_moveToPlayer.xml:
xml <br /><Timeout duration="'15s'"> <br /> <IfGate condition="~$reachedPlayer"> <br /> <ContinuousSwitch> <!-- distance bands select the gait --> <br /> <Move stopWithinDistance="3.000000" destinationSpecification="$__player" ... /> <br /> <Expression expressions="$reachedPlayer = true" /> <br /> ... <br /><TeleportHorseToPlayer /> <!-- the Timeout's failure branch --> <br />
她会接近到三米,reachedPlayer 变为 true,条件门关闭,行为结束。
这就是原版吹哨会让马停下的原因——这是预期设计,不是 bug。
### 为什么牵引距离是自适应的
步态是根据移动开始时的距离选择的,分界带在
10 米和 20 米处,并且在移动中途重新下达指令不会升级步态。因此在四
米处发送的指令会产生小跑,这在你行走时是正确的,而在你冲刺时则毫无用处——她会平静地小跑,
而你则消失在山丘之后。
因此该模组会测量你的移动速度并切换阈值。低于 SPRINT_SPEED_MPS 时,它会
从四米处下达指令,她会小跑在你身边。高于该值时,模组会有意等到
距离超过 22 米,以便指令落在 20 米分界带之外,从而给她下达奔跑步态。
### 传送防护
那 15 秒超时很重要。它的失败分支是 TeleportHorseToPlayer——正是
“无马匹传送”模组存在所要防止的行为。测试测量结果:马
在大约 14 秒内可跑约 70 米。面对 15 秒超时,这使 70 米正好处于
触发传送的边缘。
MAX_RANGE_M = 60 正是因此存在。该模组不会在此距离之外下达指令;
它只会记录一条限流的跳过日志,并等待你回到范围内。不要提高
此值,除非你愿意看到你的马传送。
该模组还会在距离正在主动缩小时拒绝重新发送,因此不会在
已经在进行的移动之上叠加超时。
---
## 存档兼容性
该模组不会向你的存档写入任何内容。在游戏流程中的任何时间点添加或移除它都是安全的,
包括任务中途。
整个模组只有一个文件:
<br />Scripts/mods/horse_follow_toggle.lua <br />
没有生成的实体,没有 .ent 类,没有表补丁,没有增益,没有特长,没有序列化的实体
属性。它不使用引擎的任何持久化机制——没有 System.SpawnEntity,没有
bSaved_by_game,没有 bSerialize,没有 SetWorldPos。所有状态都存在于 Lua 内存中,并在
每次加载时重置。
它对世界所做的唯一事情是向你的马发送一条临时 AI 消息,这与
游戏在你吹口哨时发送的消息相同,并在处理的那一刻即被消耗。
作为对比:确实会渗入存档的模组是那些向
世界生成持久实体的模组(该实体会被写入你的存档文件,并在模组被移除后可能悬空)。这个
模组不会这样做。
一个表面上的注意事项,对每个 KCD2 模组都成立: 嵌入你存档文件中的模组列表是
仅追加的。一旦你在安装此模组的情况下玩过某个存档,它就会永久列在该
存档的“已用模组”记录中,即使你卸载后也是如此。该列表仅用于
填充加载警告对话框;它没有游戏性影响,也无法清除。
---
## 兼容性
- 在游戏版本 1.5.6 上测试。
- 无文件冲突。 该模组在其自身的模组 id 下添加一个脚本,不覆盖任何原版
文件。它不会替换行为树、音频表、动作映射、defaultProfile.xml 或
任何其他共享文件,因此它不会通过覆盖而被其他模组破坏,也不会破坏其他模组。
- 可与 No Horse Teleport 模组一同使用,而且可以说配合使用时更好——参见上文传送防护
章节。
- 硬核安全。 无标记、无指南针图标、无地图兴趣点、无 HUD、无任何形式的
导航信息。
- 加载顺序无关紧要。 没有可冲突的内容。
---
## 已知问题
- 重新发送 ComeToMe 指令会导致马匹重新寻路抖动,这显然是
动画问题。 每条新指令都会重新开始移动行为,而动画混合并不
总能在下一条指令到达前干净地稳定下来。提高 MIN_INTERVAL_MS 可减少其发生
频率,代价是牵引距离更松。
- 开始冲刺时有一拍延迟。 因为冲刺阈值是 22 米,在近距离
突然起跑意味着她会原地待命,直到距离拉开后才出发。将
RETRIGGER_FAR_M 降低到 21 可将此最小化;低于 20 会重新引入小跑问题。
- 她会跟着你去马不该去的地方。 进入村庄、靠近守卫、走向
建筑内部。这是游戏自身的寻路对一条合法指令的响应,不是
模组能过滤的。在去往尴尬地点前先关闭切换。
- 非常长或受阻的接近仍可能以传送告终,如果马无法在游戏的 15 秒窗口内到达
你身边。MAX_RANGE_M 防护使其不太可能,但无法
使其不可能,因为地形可能在任何距离上让她停滞。
---
## 卸载
删除 Mods\horse_follow_toggle\ 并从 user.cfg 中移除 bind 行。无需清理其他内容——
参见存档兼容性。[/color]
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。