更好的自动保存器

更好的自动保存器

在计时器上和游戏不会保存的事件上保存,并且更频繁。

[center][i]如果它曾救过你的一次流程,点个推荐就是最好的证明。:)[/i][/center]

[size=4][b]关于[/b][/size]
[b]《The Blood of Dawnwalker》[/b]很少自动保存,主要只在主线任务结束或过场动画时保存。在这两次保存之间,一次死亡可能让你损失一个小时。[b]Better Autosaver[/b] 会按计时器和游戏不会保存的事件来保存,通过游戏自身的快速保存功能实现,因此它遵守保存锁定(战斗、过场动画、菜单)以及游戏自身的冷却时间。游戏加载中或主菜单时不会写入任何内容。

[size=4][b]什么会触发保存[/b][/size]
每个触发器都以游戏显示的提示命名,且每个都是[i]模组设置[/i]中的开关。
[list]
[][b]计时器[/b]:当上一次保存(你的或游戏的)距今超过 N 分钟时(默认 3 分钟)。[/]
[][b]进度[/b]:升级、学会技能、技能可解锁、阅读手册、腐化上升。[/]
[][b]任务[/b]:任务结束(主线和支线)、任务更新(支线任务;主线任务目标本身已会自动保存)。[/]
[][b]世界[/b]:快速旅行(加载画面消失后)、昼夜更替。[/]
[][b]额外[/b],默认关闭:过场动画结束、装备变更。[/]
[][b]NUM 0[/b] 按需保存,无视设置。[/]
[/list]一连串事件会合并为一次保存,且两次保存之间的间隔不会小于你设定的值(默认 30 秒)。游戏自身的保存也算作上一次保存,因此计时器不会重复触发。

[size=4][b]存档槽位,请读一次[/b][/size]
[quote][color=#ff7700][b]游戏保留五个自动保存槽位和五个快速保存槽位。[/b][/color]
每个环都会轮转:第六次保存会驱逐最旧的一次。这是游戏的规则,无论有没有模组。本模组写入[b]快速保存[/b],所以列表中始终只有它最近的五次,而游戏自身的[b]自动保存[/b]也会以同样方式轮转。
[b]手动保存[/b]没有限制,不会被任何东西覆盖。[/quote][color=#ff0000][size=4][b]重要![/b][/size][/color]
[b]在任何你想保留的内容之前,先做一次手动保存。[/b]本模组让丢失进度变得罕见;但它不会让快速保存变成永久保存。

[size=4][b]安装[/b][/size]
[color=#ff7700][b]1.[/b][/color] 为 Dawnwalker 安装 UE4SS(Nexus 上的三个包中任意一个都行,见下文)。推荐使用 [url=https://www.nexusmods.com/thebloodofdawnwalker/mods/18]Dawnwalker Mod Menu[/url],但并非必需:它为模组在游戏中提供设置页面;没有它的话,你需要手动编辑 [i]settings.ini[/i]。
[color=#ff7700][b]2.[/b][/color] 将此模组解压到 [i]<游戏>\Dawnwalker\Binaries\Win64\ue4ss\Mods\[/i],使 [i]Mods\hort-autosaver\Scripts\main.lua[/i] 和 [i]Mods\hort-autosaver\enabled.txt[/i] 存在。
[color=#ff7700][b]3.[/b][/color] 启动游戏并加载一个存档。首次进入世界时会在 [i]enabled.txt[/i] 旁边写入带有默认值的 [i]settings.ini[/i],并且 [i]ue4ss\UE4SS.log[/i] 中会出现一行表示模组已启动:
[code]ready: v1.0.0, 24 hooks, debounce 4000ms, enabled=true log=info timer=3min gap=30s triggers=...[/code][i]测试环境:游戏版本 258504(补丁 2)、UE4SS 3.0.1 实验版(提交 97b7e501)、Dawnwalker Mod Menu 1.0.6。[/i]

[b]三个 UE4SS 包[/b]
[spoiler]三个包都附带相同的上游 UE4SS 构建,且都能运行本模组。有一个触发器有附加条件:[b]昼夜更替[/b]会挂钩一个 Blueprint 事件,而 UE4SS 仅在 [i]ue4ss\ue4ss-settings.ini[/i] 中 [i][Hooks][/i] 下的 [i]HookProcessInternal = 1[/i] 和 [i]HookProcessLocalScriptFunction = 1[/i] 时允许这样做。
[list]
[][b]Dawnwalker-UE4SS[/b](1.3):两个标志均开启。开箱即用。[/]
[][b]Dawnwalker UE4SS Setup[/b](Cheat Menu 的那个):两个标志均开启。全部可用。[/]
[][b]UE4SS For BoD[/b]:它的两个配置文件中两个标志均关闭。将它们设为 1,或者保持原样,仅失去昼夜更替触发器;模组会在首次加载时于日志中说明是哪种情况。[/]
[/list][/spoiler]

[b]更新[/b]
[spoiler]直接解压覆盖旧文件夹。[i]settings.ini[/i] 永远不会被更新重置:新设置会以默认值添加进去,你的设置保持不变。[/spoiler]

[b]卸载[/b]
[spoiler]删除 [i]Mods\hort-autosaver\[/i]。模组创建的存档是普通的快速保存,仍可正常加载。[/spoiler]

[size=4][b]设置[/b][/size]
[i]模组设置[/i](主菜单或暂停菜单)中会列出 [b]Better Autosaver[/b]:总开关、计时器窗口、间隔、每个触发器一个开关,以及日志记录。应用会立即生效,无需重启。当 [b]启用[/b] 关闭时,只有手动按键仍然可用。

[b]没有 Mod Menu 时[/b]:相同设置位于 [i]Mods\hort-autosaver\settings.ini[/i],每行一个 [i]key=value[/i],首次进入世界时会写入所有键及其默认值。请在游戏关闭时编辑;模组会在启动时读取。

[b]所有设置[/b]
[spoiler][list]
[][b]启用[/b]:总开关。关闭会停止计时器和所有触发器;NUM 0 仍可保存。[/]
[][b]无保存超过(分钟)[/b],1–15:当上一次保存(我们的或游戏的)距今超过此值时,计时器会保存。[/]
[][b]保存间隔(秒)[/b],5–120:模组的两次保存之间不会比此更近;间隔内的请求会等待间隔结束。[/]
[][b]进度 / 任务 / 世界 / 额外[/b]:每个触发器一个开关,如上所列。右侧的描述面板会说明每个监听什么以及游戏本身已经会保存什么。[/]
[][b]日志记录[/b] 和 [b]日志级别[/b]:模组写入 [i]ue4ss\UE4SS.log[/i] 的内容。默认 Info,每次保存一行。[/]
[/list][/spoiler]

[size=4][b]日志与错误报告[/b][/size]
模组会写入 [i]ue4ss\UE4SS.log[/i],默认每次保存一行。提交错误报告时,请在菜单中将 [b]日志级别[/b] 设为 Debug,复现问题,并附上标记为 [i][hort_autosaver][/i] 的行。请说明你使用的是哪个 UE4SS 包,以及 Mod Menu 是否显示该页面。

[b]已知行为[/b]
[spoiler][list]
[]在战斗、过场动画或专注模式中请求的保存会等待,并在锁定解除时执行;日志会显示 [i]deferred[/i]。[/]
[]游戏在任务结束时的自动保存和模组自身的任务保存,在某些任务上可能仅相隔几秒;正在修复。[/]
[]在使用 UE4SS For BoD 包时,昼夜更替保持关闭,直到上述两个标志设为 1。[/]
[]UE4SS 热重载(Ctrl+R)后,菜单的实时应用会失效,直到游戏重启;文件仍会被读取,因此更改会在下次启动时生效。日志会说明一次。[/]
[/list][/spoiler]

[size=4][b]新闻与更新[/b][/size]
[color=#ff00ff][b]V1.0.1[/b][/color]
[color=#00e5ff][b]修复[/b][/color]
- 计时器将菜单中的时间计为游戏时间,并在游戏暂停时保存(甚至从加载列表中)。暂停菜单和枢纽标签页现在会冻结计时器的时钟;保存会等待菜单关闭后的相同游戏分钟数。
- 在枢纽或暂停菜单中请求的保存(装备、阅读手册、刚打开地图前完成的任务)会碰到游戏的保存锁定,并在一次重试后被丢弃。现在它会被记下,并在菜单关闭后执行。
- 计时器和所有延迟重试原本运行在 UE4SS 自身线程上,对象查找会与垃圾回收器竞争(HUDTweaks 追踪到的随机崩溃)。它们现在运行在游戏线程上。
- 关闭启用后再次隐藏触发器分组(之前门控仍引用旧的 Triggers 组)。
- _装备变更_从未触发:玩家的 [i]OnEquipmentInSlotChanged[/i] 由 C++ 提供。该触发器现在后置挂钩控件调用的物品栏组件原生函数([i]TryEquipItemInSlot[/i]、[i]TryEquipItem[/i]、[i]UnequipItem[/i]、[i]RequestItemUnequip[/i]),并在 [i]Success[/i] 或 [i]ItemUnequipped[/i] 时保存。

[color=#00e5ff][b]变更[/b][/color]
- 设置页面:触发器以游戏自身的提示命名(升级、学会技能、技能可解锁、腐化上升、任务结束、任务更新……),并分组为进度、任务、世界和额外;每项描述都会说明游戏本身已经会保存什么。键名和 [i]settings.ini[/i] 不变。
- 启动时读取 [i]ue4ss-settings.ini[/i]:当 [i]HookProcessInternal[/i] 或 [i]HookProcessLocalScriptFunction[/i] 为 0 时,不会尝试 昼夜 挂钩,并会用一条警告说明修复方法,而不是每次加载产生两条堆栈跟踪。README 说明了哪些包默认关闭它们。

[color=#ff00ff][b]V1.0.0[/b][/color]
[spoiler][color=#00e5ff][b]新增[/b][/color]
- Dawnwalker Mod Menu 页面:总开关、计时器窗口(分钟)、间隔(秒)以及每个触发器开关,通过 [i]dmm_api.subscribe[/i] 实时应用。[i]settings.ini[/i] 在首次运行时写入,之后只会补充,永不重置。
- [i]src/mod_settings.ini[/i] 由 [i]tools/gen-mod-settings.lua[/i] 从 [i]config.lua[/i] 中的 [i]cfg.SETTINGS[/i] 生成;[i]localsetup.sh[/i] 和发布检查确保它是最新的。
- 所有挂钩在启动时注册;触发器的开关在触发时读取。

[color=#00e5ff][b]变更[/b][/color]
- [i]src/[/i] 现在是模组根目录([i]Scripts/[/i] + [i]mod_settings.ini[/i]);本地部署文件夹为 [i]Mods/hort-autosaver/[/i],即发布时的名称。
- 玩家角色、快速旅行组件和游戏状态上的原生触发器:升级、特性解锁/购买、任务成功、快速旅行、过场动画结束(装备默认关闭),各为 [i]config.TRIGGERS[/i] 标志。
- 快速旅行在确认旅行后加载画面淡出结束时保存([i]DWLoadingScreenWidget:OnFadeOutFinished[/i],由 [i]AsyncAction_FastTravelWithConfirmation[/i] 触发);[i]FastTravelSystem[/i] 的 UFUNCTION 在挂钩下从不触发。
- 单一防抖窗口([i]DEBOUNCE_MS[/i]):一连串触发器合并为一次保存,通过 UE4SS 的 [i]RetriggerableExecuteInGameThreadWithDelay[/i]。
- 保护措施:过场动画中、专注模式下、或玩家死亡后直到世界重启前不保存。
- 游戏自身的保存冷却([i]PersistencySettings[/i])在启动时记录。

[color=#00e5ff][b]修复[/b][/color]
- 记录 [i]TryQuicksave[/i] 的真实返回值;旧的 [i]savestatus[/i] 是外层的 [i]pcall[/i]。
- [i]savesys[/i] 读取了一个从未设置的缓存键([i]savefncls[/i]),导致从未执行过保存。
- [i]tools/localsetup.sh[/i] 通过绝对路径定位游戏的 [i]Mods/[/i] 文件夹([i]TBDW_MODS_DIR[/i] 可覆盖)。
- UE4SS git 工作流、CHANGELOG(2026-09-16)。[/spoiler]

[size=4][b]鸣谢[/b][/size]
[list]
[][url=https://github.com/UE4SS-RE/RE-UE4SS]UE4SS[/url],这里是所有内容运行所依赖的 Lua 层。[/]
[][url=https://www.nexusmods.com/thebloodofdawnwalker/mods/18]Dawnwalker Mod Menu[/url] 及其集成指南,使设置页面只需一个文件。[/]
[/list]
[size=4][b]许可[/b][/size]
MIT。可自由分叉、翻译、打包发布,只需附上返回链接。源码和更新日志在 [url=https://github.com/lucashort7/tbdw-autosave]GitHub[/url];欢迎在那里或 Posts 标签页中提出问题。