レベルドリストの取り扱いがまずくてSave時に確定CTD

環境構築

セーブ時に確定でCTDするようになってしまいました。

本記事の不具合はFROST Plus 0.5.2で修正されました。

クラッシュの詳細

Buffout 4のクラッシュダンプに以下の内容がありました。

	[RSP+80  ] 0x2CBED0ABB00      (TESLevItem*)
		File: "RedsFrostFixes.esp"
		Flags: 0x00000009
		Form ID: 0x0006738B
		Form Type: 56

TESLevItemとあるのでLeveledItemのことだと思われます。

Form IDが0x0006738BとなっているのでFallout4.esmで定義されているLeveledItemのようです。

これは弾薬をルートアイテムに追加するためのLeveltedItemでした。

調べていくと、どうやらLeveledItemに大量のエントリが追加されてしまうと、セーブ時にCTDするようです。

なぜCTDするのか

CKでは一定以上のエントリを詰め込むと、プラグインを保存しても正常に保存されないようです。そもそもCKで許容範囲を超えるエントリを詰め込めるなら、初回のセーブ時からCTDするはずです。

スクリプトでもゲーム内で動的にLeveledItemにエントリを足していけるので、それでオーバーフローを起こしていると考えられます。

対策

Resaverで6738Bを検索して、これをプロパティに持つスクリプトを特定できました。FROST Plusのゲーム起動時に走るスクリプトの不具合で、本来であれば1度だけ実行するべき処理が、毎回走り続けてしまうというものでした。ですのでゲームをロードする回数がしきい値を超えるとCTDするようになる、ということです。

スクリプトを根本的に修正するのはもちろんのこと、当該LeveledItemは度重なるAddFormで追加されまくった状態なので、Revertを実行して初期化することで、正常にセーブできるようになります。

タイトルとURLをコピーしました