Mod为什么会失效,失效了怎么办

因为二游这种游戏,有经常版本更新的属性。
每次更新都可能带来预想不到的变化,所以mod并不是每个版本都通用的,但是不用担心,大多数情况下,游戏更新几天后会有社区大手子提供修复工具,到时候按照对应说明使用修复工具,就可以把mod更新到最新版本啦。

在大多数情况下, Mod 失效无非以下几种情况:

槽位发生改变

打开 .ini 文件, 通常会看到形如

[TextureOverrideIBIBIBIB]
hash = IBIBIBIB
match_first_index = 0
ps-t0 = ResourceIBIBIBIBSomeMapA
ps-t1 = ResourceIBIBIBIBSomeMapB
ps-t2 = ResourceIBIBIBIBSomeMapC
ib = ResourceIBIBIBIBIndexBuffer
drawindexed = nunmber0,number1,number2

的段落, 其中的 ps-tx 即该索引缓冲区 (Index Buffer) 所绑定的第 x 个像素着色器层 (Pixel Shader Tier), 每一层使用一个贴图资源, 在这里即通过

ps-tx = ResourceSomeSeciton

引用, 而后在他处指定资源文件相对路径:

[ResourceSomeSection]
filename = .\Textures\ThisTexture.dds

游戏更新后, 已有的槽位可能会发生改动, 通常而言, 绑定槽位贴图资源后, 配置文件会调用 ORFix 来正确配置贴图:

[TextureOverrideIBIBIBIB]
hash = IBIBIBIB
match_first_index = 0
ps-t0 = ResourceIBIBIBIBSomeMapA
ps-t1 = ResourceIBIBIBIBSomeMapB
ps-t2 = ResourceIBIBIBIBSomeMapC
run = CommandList\Global\ORFix\ORFix.ini ; <<--- 这里!
ib = ResourceIBIBIBIBIndexBuffer
drawindexed = nunmber0,number1,number2

但 ORFix 本身是工具包每个版本维护的库, 自然会有更新不及时的情况. 那么此时就束手无策了吗? 实际上有两种解决方案:

  1. 尝试更改像素着色器层

比如说将 0, 1, 2 的顺序改为 1, 2, 0:

; ...
ps-t1 = ResourceIBIBIBIBSomeMapA
ps-t2 = ResourceIBIBIBIBSomeMapB
ps-t0 = ResourceIBIBIBIBSomeMapC
; ...

不一定能够完全修好, 不过总归是 ORFix 更新前一种方案.

  1. 手动配置, 改为通过贴图资源哈希锚定

这就需要有一定的 Mod 制作小知识了, 相对而言稍微麻烦一些.

3DMigoto 修改贴图, 常见的有两种方式 (不常见的不考虑).

(1). 一种就是上面所说的, 通过像素着色器层锚定, 这种方法能够确保模型在任何 LOD (Level of Detail, 细节层次) 下, 无论原本使用什么精度的贴图, 都转而使用我们修改后的贴图, 但问题是, 模型在不同上下文 (e.g. 水中、镜中)、不同游戏版本可能使用着不同的像素着色器层组合方式, 一旦与我们设定组合方式的不同, 模型就会采用错误的贴图 (e.g. 以 LightMap 为 DiffuseMap, 变绿; 以 NormalMap 为 DiffuseMap, 变紫/变黄);

(2). 另一种是通过贴图资源哈希锚定, 我们可以获取贴图本身的哈希去锚定、修改:

[TextureOverrideHashHash]
hash = HashHash
this = ResourceHashHash

这种方式的优点是, 能够确定地修改渲染所需的贴图资源, 而无需在意其处于什么像素着色器层、被谁使用, 只要贴图本身的内容不变, 其哈希就是稳定的; 而缺点同样也很明显: 一是无法精确控制特定 Submesh 的像素着色器层, 也无法实现分 drawindexed 指定贴图; 对低精度的 LOD, 模型采用的贴图压根不是我们锚定的资源. 也有解决方法, 即, 获取其他 LOD 层的贴图资源哈希, 一并锚定.

如何获取呢? XXMI 不清楚, 不过 SSMT 可以查看 SSMT 的模组制作教程, 其中在后处理界面即可看到对应的贴图资源哈希:

模型哈希改变

分修复难度, 依次为:

索引缓冲区哈希改变

用 Dev 版本的 d3d11.dll 挂载游戏, 然后在希望修正的模型所在页面 (例如: 角色图鉴页面) 按下 NUMPAD0 打开 Hunting 模式, 然后用 NUMPAD7 和 NUMPAD8 查询目标模型的索引缓冲区 (Index Buffer) 哈希, 直到目标模型被隐藏, 此时按下 NUMPAD9 即可复制当前哈希值.随后打开 .ini 文件填入对应的 TextureOverride 节即可. (通常有 2~4 个, 因为单个索引缓冲区的子网格组通常有 1~3 个)

顶点缓冲区哈希改变

同上, 不过这次以 NUMPAD/, NUMPAD*, NUMPAD- 查找顶点缓冲区 (Vertex Buffer) 哈希. 随后填入对应的 TextureOverrideVertexLimitRaise 节即可. (通常仅一个)

Blend, Texcoord, Position 哈希改变

这个比较麻烦, 需要完整提取出游戏的原模型资源, 然后打开 (以 SSMT 为例) SSMT4CachedFolder\WorkSpace\GameItem\WorkspaceItem\LOD0\TargetIndexbufferTargetSubmeshOrComponent\TargetDataType, 阅读其中的 .json 配置文件, 即可获知正确的 Blend、Texcoord、Position 哈希, 如:

{
  "GamePreset": "GIMI",
  "VertexLimitVB": "c82fb483",
  "CategoryHash": {
    "Blend": "0ea973a0",    // <-- Blend
    "Position": "1ef5195e", // <-- Position
    "Texcoord": "b7399f02"  // <-- Texcoord
  },
  "CategoryDrawCategoryMap": {
    "Blend": "Blend",
    "Position": "Position",
    "Texcoord": "Texcoord"
  },
//...

填写至有问题的 Mod 的 .ini 文件对应区域, 例如

;MARK:TextureOverrideVB
; bf1830b6
[TextureOverride_VB_bf1830b6_身体_Position]
hash = 1ef5195e    ; <-- 这里!
vb0 = Resourcebf1830b6Position
$active0 = 1

[TextureOverride_VB_bf1830b6_身体_Texcoord]
hash = b7399f02    ; <-- 这里!
vb1 = Resourcebf1830b6Texcoord

[TextureOverride_VB_bf1830b6_身体_Blend]
hash = 0ea973a0    ; <-- 这里!
vb1 = Resourcebf1830b6Blend
handling = skip
draw = 93444, 0

顶点组改变

这个相当麻烦, 需要熟悉完整的 Mod 制作流程, 自行逆向 Mod 模型、完整导出 Mod 才能自行修复, 希望了解还是推荐去看 SSMT 的官方教程文档. 不过如果只是希望游玩, 这些流程就过重了, 最好的方案还是等待社区提供的脚本化修复工具.

1 个赞

:+1: :star_struck: :face_savoring_food: :heart_eyes: :smiling_face_with_three_hearts:

:flexed_biceps: :flexed_biceps: :flexed_biceps: :flexed_biceps: :flexed_biceps:

:flexed_biceps: :flexed_biceps: :flexed_biceps: :flexed_biceps: :flexed_biceps:

全是表情包说是.
测试一下公式支持:
\dfrac12\pi = \arcsin 1 ,

\sum_{i=0}^na_nx^n = f_n[x]

好吧不支持, 是否考虑添加?

有math插件可以支持latex格式,不过有必要吗 :pleading_face:

自然是没绝对必要, 只是觉得有了会很帅. 而且如果以后有涉及图形学方面的教程帖子, 尽早引入 MathJax 也不失为一件好事.

好的没问题

Mod 失效教程写的非常专业

我按教材解决了多年的烦恼

1 个赞

666,很厉害啊

评论区惊现大佬!

Math插件打开了,你可以测试一下

行内公式测试:E = mc^2,以及欧拉恒等式 e^{i\pi}+1=0。

独立公式测试:

f(x)=\frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)

求和与积分:

\sum_{n=1}^{\infty}\frac{1}{n^2} =\frac{\pi^2}{6}, \qquad \int_{-\infty}^{\infty}e^{-x^2}\,dx=\sqrt{\pi}

矩阵测试:

A= \begin{pmatrix} 1 & 2\\ 3 & 4 \end{pmatrix}, \qquad \det(A)=1\cdot4-2\cdot3=-2

我测一测

展开
\begin{CD} \begin{CD} A @>{\alpha}>> B @>{\beta}>> C \\ @V{\varphi}VV @V{\chi}VV @V{\eta}VV \\ D @>{\gamma}>> E @>{\delta}>> F \\ @V{\psi}VV @V{\omega}VV @V{\theta}VV \\ G @>{\varepsilon}>> H @>{\zeta}>> I \end{CD} \\ \begin{CD} 0 @>>> \bigoplus_{i\in I} M_i @>{\bigoplus \alpha_i}>> \bigoplus_{i\in I} N_i @>{\bigoplus \beta_i}>> \bigoplus_{i\in I} P_i @>>> 0 \\ @. @V{\bigoplus \varphi_i}VV @V{\bigoplus \chi_i}VV @V{\bigoplus \eta_i}VV @. \\ 0 @>>> \prod_{j\in J} M_j @>{\prod \gamma_j}>> \prod_{j\in J} N_j @>{\prod \delta_j}>> \prod_{j\in J} P_j @>>> 0 \end{CD} \\ \end{CD}
\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{\dfrac{1}{\sqrt{2}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} </details>