飞船商人修复

飞船商人修复

修复了船舶供应商的问题,使剩余的船只能够被正确回收。

描述

简易修改了所有供应商所使用的 ShipVendorScript 脚本,使其在处理库存重置时能够妥善处理被移除的飞船。

这将防止与飞船供应商库存重置相关的指针句柄泄漏,并可能修复其他几个与旧飞船(本应已被清理)随机重新出现在着陆台上的错误。该修复目前处于试验阶段,我已进行了大量测试以确保其正常运作,但针对特定引用句柄泄漏的测试是一个非常漫长且费力的过程,因此效果可能会有所不同。

飞船供应商通常会发生什么:

  1. 当你出售一艘飞船时,该飞船会被简单地放回供应商的“库存”数组中,以便在购买/出售界面中显示。
  2. 每 7 天(一周),供应商会对其库存中的所有飞船执行 Delete() 命令,然后清空其库存数组。
  3. 新的飞机会在着陆台上生成,但处于禁用状态并与着陆台链接。
  4. 循环重复。

问题所在:

  • 当飞船本应被清理时,与本地着陆台/停靠港的链接并未被清除,这可能导致飞船始终保持加载状态,或至少阻止游戏垃圾回收器对其进行清理。
  • 当飞船本应被清理时,它们并未被发送到任何地方。它们没有被放入任何收纳单元(holding cell)。这意味着只要所在的单元(通常是永久单元或城市单元)保持加载或未被重置,垃圾回收器就无法或很少能清除这些已禁用的飞船。
  • 调用的是 Delete() 而非使用 DisableNoWait() 并清除所有引用和链接。Delete() 对飞船引用无效,因为它们是多个相互叠加的复杂引用组。相反,你需要禁用飞船或将其击毁,并将其留在一个未加载的单元中,直到游戏引擎的垃圾回收器来清理它。只要飞船不是以永久飞船(persistent ship)的形式生成,引擎就能正确处理。

解决方案:

本模组做了一些小改动:

  1. 它创建了一个空的“垃圾”单元,用于放置需要被击毁或清理的飞船。这样,任何脚本、任务等都无法扫描到它们,引擎也不会尝试加载它们。玩家无法到达此单元。
  2. 当飞船供应商处理其列表进行清理时,会将飞船放入垃圾单元。
  3. 然后禁用飞船。
  4. 最后,为了确保引擎知晓需要清理它,飞船会被击毁。
  5. 在对数组中的每艘飞船完成所有上述操作后,数组会被强制清空,这与原版行为一致。

兼容性:

  • 飞船供应商框架 (SVF):补丁包含在可选文件部分。需要安装 飞船供应商框架。
  • 任何修改了 ShipVendorScript 的模组或创作都将需要补丁。

安装说明

使用你喜欢的模组管理器安装。

我的其他模组

如果你想支持我:

在 Ko-fi 上支持我