Deletedフラグでセルのロード時にCTD

環境構築

レコードをなくす方法が2つあります。DeletedとDisabledです。

主にセルに配置しているオブジェクトにたいして使います。

ちなみに、自作のプラグインでレコードを作成したものの、あとから不要になったので消したいという場合はRemoveです。

バニラのマスタープラグインや他のプラグインのパッチを作成して、あるレコードをなくしたいという場合の話になります。

クラッシュログ

FROSTにてトミーがDeletedになっているのですが、屋外でコンバットゾーンに近づくだけで確定でCTDしてしまいました。

何十周とプレイしていて初めてのことでしたので、タイミングによってこうなるようです。

Unhandled exception "EXCEPTION_ACCESS_VIOLATION" at 0x7FF752C089A3 Fallout4.exe+03F89A3

REGISTERS:
	RAX 0x0                (size_t)
	RCX 0x7FF7580E0B00     (void* -> Fallout4.exe+58D0B00)
	RDX 0x2074D            (size_t)
	RBX 0x2AEC63FE3C0      (Actor*)
		Object Reference: None
		File: "FROST.esp"
		Flags: 0x00000420
		Form ID: 0x0002074D
		Form Type: 65
	RSP 0xAFCFA2FA40       (void*)
	RBP 0x2AF5C0332C0      (BGSLocation*)
		File: "Fallout4.esm"
		Flags: 0x00000009
		Form ID: 0x0001905B
		Form Type: 107
		Full Name: "コンバットゾーン"
	RSI 0x2AEC63FE3C0      (Actor*)
		Object Reference: None
		File: "FROST.esp"
		Flags: 0x00000420
		Form ID: 0x0002074D
		Form Type: 65
	RDI 0x2AEC63FE3C0      (Actor*)
		Object Reference: None
		File: "FROST.esp"
		Flags: 0x00000420
		Form ID: 0x0002074D
		Form Type: 65

Deleted

レコードをなかったことにするフラグです。どうやらゲーム起動時のロードで無視されるようです。

無視されるのでゲーム内に存在しないことになりますが、他のプラグインが操作しようとするとCTDしてしまうことがあるようです。

Disabled

レコードを無効にするフラグです。無効になっているだけなので、ゲーム内で有効にすれば使えるようになります。

ある場所でスクリプト沸きさせるActorをDisabled状態で待機させておくとか、建物を追加するので邪魔なバニラのオブジェクトをなくしたい時などに使います。

こちらはレコード自体は存在しているので、他のプラグインが操作しようとしても、成功するかは別にして、CTDにはならないようです。

DeletedをDisabledに変更するxEdit用スクリプト

{
	Change "Deleted" flag to "Initially Disabled".
}
unit UserScript;

function Process(e: IInterface): integer;
begin
	if Signature(e) <> 'REFR' then Exit;

	if GetElementNativeValues(e, 'Record Header\Record Flags\Deleted') = '0' then Exit;

	AddMessage( IntToHex(FixedFormID(e), 8) );

	SetElementNativeValues(e, 'Record Header\Record Flags\Deleted', '0');
	SetElementNativeValues(e, 'Record Header\Record Flags\Initially Disabled', '1');
end;

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