飞行自由没有飞行高度限制,没有禁飞区,城镇内无需下坐骑,可在深渊中召唤坐骑,黑星会停留在你离开的位置且没有召唤冷却时间。红色沙漠 2.03.02。黑星和飞龙在1350高度停止攀爬,而在1550左右游戏会强制收回你的坐骑。这两个数值都来自游戏自身的数据。安装此模组后,两种飞行坐骑的高度上限都被移除,也不会因为飞得太高而被强制下马。在深渊地面上提示“此区域无法召唤”的正是那条强制下马的规则,所以这个限制也一并解除了。
它改变了什么- 天花板。 每辆载具在游戏的vehicleinfo表中都有一个最大高度:黑星和飞龙是1350,其他32辆则完全没有。插件在启动时按名称找到该表,将你的设置写入这两行,并读取回日志中,以便你确认已生效。
- 禁飞区。 每个地区都有一份禁止通行的坐骑类别列表。有一个例程会判断你当前所在的地区、或任何包含该地区的区域,是否列出了你正骑乘的坐骑。正是这一个判断结果,会把你从高空的飞行坐骑上拽下来,也会拒绝你骑入被列入列表的地区。三个字节就能让它对所有地方都回答“未封锁”。
- 在深渊中召唤。 召唤检查也会走同样的流程,而它的拒绝结果就是“无法在此区域召唤。”这条提示。第二个补丁只改一个字节,就能让它跳过这个拒绝,因此即使你决定保留区域限制,也仍然可以在地下召唤坐骑。
- 飞越城镇。 有一条独立的规则会在你偏离道路、低空飞越城镇时强制让你下坐骑,提示为“Cannot ride the mount in town.”。其触发条件是“在城镇内且不在道路上方20单位范围内”,这就是为什么沿道路骑行穿过城镇时从未触发过该规则。三个字节使得“道路”那一半条件始终返回真,因此该规则永远无法成立。整个游戏中只有一行条件使用了这个检查;城镇内的判定则未作改动,因为有23行条件将其用于悬赏升级和交易定价。
- 正在深渊枢纽召唤。 召唤检查还会检测你周围的一小片空间,只要其中存在任何实体物体就会以“你无法在此处这么做。”拒绝施放,而在枢纽中这种情况始终存在。修改一个字节即可跳过该拒绝。
- 黑星原地待命。 大约在黑星落地30秒后,他的AI会开始执行起飞动作并飞走。AI执行的每个动作都会经过游戏中的一个函数处理,而该插件会按动作ID拦截这一个动作,其余动作则正常放行。你仍然可以骑乘他,从30米开外召唤他也和以前一样有效。1.1.5版本曾尝试通过修改他的生成持续时间来实现这一效果,结果毫无作用;当前这个版本才是真正有效的。
- 黑星的召唤冷却时间。 游戏的角色信息表将黑星的召唤冷却时间设为3600秒,即一小时。插件在他那一行单独写入0,位置正是游戏自带加载器放置该字段的地方,因此即使在磁盘上修改表格的模组也无法移动它。已经开始的冷却会保留游戏在启动时存储的结束时间,所以插件还钩住了唯一一个因冷却而拒绝召唤的检查,让黑星通过。其他所有坐骑都保留各自的冷却。
不会改动其他任何内容。不会修改任何游戏文件,也不会有任何内容写入你的存档。游戏关闭时,所有补丁都会撤销。
设置FlightFreedom.ini 位于插件旁边,在 [settings] 下。其中的每个默认值也是插件自身的默认值,因此该文件是可选的:删除它不会有任何损失。
- 天花板 (-1) 飞行坐骑的高度上限。-1 表示移除限制,0 表示保留游戏默认的 1350,填入数字则自定义上限。
- 禁飞区 1 表示没有任何区域会阻止骑乘。将其设为 0 后,高空下马的限制会重新生效。
- 深渊召唤 (1) 1表示你所在区域的召唤检查永远不会拒绝你。当NoFlyZones开启时,它不会做任何额外的事情,并且是独立的,因此你可以保留下马区域并仍然在地下召唤。
- 平台召唤 (0) 1 表示召唤检查永远不会因为你所站的位置而拒绝你。该检查正是阻止你在深渊 nexus 传送阵上召唤的原因。默认关闭:此结论来自反汇编和一份报告,而且它还能让你在游戏任何地方的移动平台上进行召唤。
- 格挡召唤 (1)1表示召唤检查永远不会因为你周围有实体障碍物而拒绝你。该检查正是在深渊枢纽上对所有坐骑(包括飞龙)显示“你无法在此处这么做”的判定。设为0则使用游戏原本的行为。
- 城镇飞行 (1) 1 表示在偏离道路的城镇上空低飞时永远不会使你下马。将其设为 0 以使用游戏自身的行为。
- 黑星小筑 (1) 黑星会停留在你下马的位置,而不是在约30秒后飞走。设为0则采用游戏默认行为。此处遗留自1.1.5版本的旧数值会被读取为1,且LandedTimeout会被忽略。
- 黑星冷却 (0) 黑星的召唤冷却时间,单位为秒。设为0则移除冷却,包括已在进行中的冷却。设为-1则不改动该表,沿用游戏本体的时间或其他模组的数值。目前仅测试过0;其他数值将设定为相应的秒数。
- 探测 (0) 构建此版本时所用的研究模式。它会挂钩游戏中所有与坐骑相关的检查,读取另外三个可挂钩、修补或监视任意地址的 ini 段,并写入一份非常大的日志。除非你正在深入排查某些问题,否则请保持关闭。
安装使用终极模组管理器(DMM)- 下载DMM文件并将其拖放到DMM窗口中。
- 启用并挂载。DMM 会注册 FlightFreedom.asi,并自带加载器。
DMM归档中仅包含插件本身,因为DMM安装的就是这个。默认配置已编译在内,因此插件自身是完整的。从1.1.3版本开始,插件在发现自身旁边没有FlightFreedom.ini时,会在首次运行时于同目录下生成该文件,因此启动一次游戏后,该文件就会出现在bin64目录中等待编辑。你已有的ini文件不会被改动。
手工- Ultimate ASI Loader (winmm.dll) 必须放在游戏的 bin64 文件夹中,与 CrimsonDesert.exe 位于同一目录。
- 在游戏关闭的情况下,将 FlightFreedom.asi 复制到 bin64 文件夹中。
- 启动游戏。FlightFreedom.log 会出现在插件旁边,说明它更改了什么,首次运行时还会在该处生成 FlightFreedom.ini,可供编辑。
卸载 正在从bin64中删除FlightFreedom文件。
如果另一个模组已经占用了winmm.dllOptiScaler、部分帧生成版本以及一些ReShade配置会安装它们自己的winmm.dll,而那个文件不会加载任何ASI插件。不要动它们的文件,把Ultimate ASI Loader重命名为其他未被占用的名称。
xinput1_4.dll,
wininet.dll,
winhttp.dll 和
d3d12.dll 均由CrimsonDesert.exe直接导入。
version.dll 同样有效,再往外一步:exe 并不导入它,但 sentry.dll 会导入,而 CrimsonDesert.exe 每次启动时都会导入 sentry.dll。
更正。 这个页面直到9月15日都还说version.dll在这里永远无法加载,把它重命名成这个名字毫无意义。那是错的,kelstr33为此花了一晚上。我读了exe的导入表,里面没有version.dll,就再也没去看exe自身依赖项导入了什么。
ReShade 和 RenoDX 通常会占用 dxgi.dll,从而让 winmm.dll 保持空闲;而本项目的开发环境正是基于 ReShade 的 dxgi.dll 旁边放置 winmm.dll 这一配置。只要 bin64 目录下出现 FlightFreedom.log 就说明测试通过:若没有日志,则意味着没有任何程序加载了该插件。
兼容性- 为《红色沙漠》2.03.02版本(exe 1.0.0.2976)构建。每个补丁都会校验其即将修改的字节,若与当前构建所携带的字节不符则拒绝执行,因此在其他版本上你只会在日志中看到一行记录,而不会导致游戏损坏。上限是通过名称以及匹配表自身行数来定位的,而非通过地址,因此即使补丁不支持的更新也能继续生效。
- 坐骑冷却和骑乘时长的JSON模组会直接修改磁盘上的游戏数据表。本插件会在这些数据表加载后,将黑星的冷却时间写入内存,因此两者同时安装时,本插件的BlackstarCooldown会优先生效。将其设为-1,则其他模组的数值生效。我尚未对两者进行并行测试,如有不同发现请告知。如果你使用了其中某个模组里的区域下马文件,本插件会使其变得多余;两者并不冲突。
- 单人游戏。请勿在任何可能让你对他人取得优势的地方使用。
已知限制- NoFlyZones 会清除游戏中每个区域的坐骑限制,包括深渊和高地。在这个版本中,即使在补丁之前,飞越赫南德和骑马穿过城镇也从未被拒绝,所以应该没有其他需要注意的地方,但这就是它真实的适用范围。
- 留在深渊里的坐骑会一直待在那里。趁它还在空中时召唤它,或者骑着它离开。已经落地且找不到通往你路径的坐骑不会被游戏召回,本模组也不会改变这一点。
- “坐骑在地面上时无法召唤”是另一条规则,这里不做处理。它的意思是你要召唤的坐骑已经在外面的某处站着了,这是游戏的正常设定。
如果出现问题FlightFreedom.log 会写在插件旁边,在 Steam 安装环境下即位于 ...\steamapps\common\Crimson Desert\bin64\FlightFreedom.log。文件很短,六十多行,每次启动都会重写。它记录了读取到的设置、每个补丁是否成功打入以及打入前后的字节内容,还有从表中读回的上限值。反馈问题时请附上相关日志行,并说明发生了什么以及你当时所在的位置。
它是如何被找到的最初的猜测是城镇和活动区域被标记为禁飞区,数据似乎支持这一点,而代码却忽略了它。真正的答案需要一个探测插件,它挂接了游戏自身的条件对象并记录每一个返回值,然后挂接ini中指定的任意地址。它最终定位到一个在整个可执行文件中只有两个调用者的例程:一个是让飞行者下坐骑的检查,另一个是拒绝召唤的检查。三个补丁中有两个源自这一发现。城镇规则是后来从玩家报告中发现的,在成为设置项之前也用同样的方法进行了测量。探测功能仍保留在插件中,通过Probe=1启用。
文件1.1.9 的 SHA-256:
48d75c927e99c1733a2d9510a670f6d6b520df09a842ef6460e878c7af33e39b FlightFreedom-1.1.9-DMM.zip
8210552c5ee4eb0ff79e9d7985d2bbfcc0239828e214dad7ecafbc1fb1d821b0 FlightFreedom-1.1.9.zip
67e75d77ab36a39d1e40e6196d8956eb92eb76cc0146e5db695191092fe4df20 FlightFreedom.asi
尚未标记任何内容。对于1.1.0版本,插件在VirusTotal上66项检测中0项报毒,DMM归档68项中0项报毒,完整归档68项中0项报毒。1.1.1版本的全部三个文件均为68项检测中0项报毒。对于1.1.2版本,插件70项中0项报毒,DMM归档67项中0项报毒,完整归档68项中0项报毒。对于1.1.3版本,插件70项中0项报毒,两个归档均为68项中0项报毒。对于1.1.4以及1.1.5版本,插件70项中0项报毒,DMM归档68项中0项报毒,完整归档67项中0项报毒。对于1.1.6版本,插件71项中0项报毒,DMM归档67项中0项报毒,完整归档68项中0项报毒。对于1.1.7版本,插件71项中0项报毒,DMM归档68项中0项报毒,完整归档66项中0项报毒。对于1.1.8版本,插件71项中0项报毒,DMM归档54项中0项报毒,完整归档68项中0项报毒。对于1.1.9版本,插件仍为71项中0项报毒,两个归档均为68项中0项报毒。报告截止于
插件,
DMM档案库 和
完整存档.
该插件仅导入一个系统库kernel32,不涉及其他任何内容:没有网络功能,不访问注册表,除自身的ini和日志文件外不访问任何文件。扫描程序仍可能对其形态提出异议,因为这是一个由加载器放入游戏内部的DLL,一旦进入游戏便会覆写内存中的指令。修改器也是这么做的,因此基于修改器训练的模型会将其判定为修改器。该文件已进行代码签名,在FlightFreedom.asi的属性、数字签名中显示为Seth Walker。
来源与许可MIT 许可证。源代码和构建说明位于 GitHub:
github.com/shin2344234/flight-freedomDiscord 和 PatreonShin234的模组与杂项 Discord 用于提问和查看开发进度。Bug 最好提交到 Bug 标签页或作为 GitHub issue,以便追踪。
Patreon 是
patreon.com/cw/Shin234 在以下岗位任职
patreon.com/cw/Shin234/posts所有发布的内容都保持免费,不会为此有所保留。