Fallout4において、武器や防具MOD等によるLeveled List追加は、スクリプト形式が多いです。User的にはプラグイン形式に比べて使い勝手が良いんですが、環境整備の観点からはデメリットも少なくないです。
まずはスクリプト形式の利点と欠点を確認し、その後にプラグイン形式への書換えを試します。
Desert Eagle - Standalone Handgunを例に。強力なハンドガンとして有名な、デザートイーグルを追加するMODです。レイダーやガンナーが所持するようになり、レジェンダリ装備が落ちることもあります。店売りにも追加されます。
※以下、銃単体は片仮名で『デザートイーグル』、MOD自体を表す時は英字で『Desert Eagle』と表記しています。

- スクリプト形式によるLeveled Listのメリット
- スクリプト形式によるLeveled Listのデメリット
- Leveled Listをプラグイン方式に変更
- (おまけ)ソースファイルが無かったら?
スクリプト形式によるLeveled Listのメリット
一番かつ唯一の利点は、Leveled Listの競合が起こらないことです。プラグイン形式のようにLeveled Listをまるごと上書きせず、必要なアイテムのみを既存のLeveled Listに追加できます。
だから競合しようが無いんです、なかなかに便利。
Desert Eagleのプラグイン。赤枠内のQuestで、Leveled Listにデザートイーグルを追加するスクリプトを走らせます。もう1は、フラッシュライトモジュールのコントロール用ですね。
Raider Overhaul WIP環境に入れました。双方ともLLI_Raider_Weapons_Boss
のLeveled Listを変更します。Raider Overhaulはプラグイン方式ですが、Desert Eagleはスクリプト方式な為、Raider Overhaulの変更を阻害しません。
Raider Overhaulにより、LV90超えのRaider Veteranは時々ミニガンを持ちます。これを壊すことなく、時々デザートイーグルを持つ固体(LV30以上)も出現します。
スクリプト形式によるLeveled Listのデメリット
いいことずくめに見えるスクリプト形式ですが、問題点も多いです。
※Desert Eagleのスクリプトに問題があるのでなく、スクリプト形式の共通問題です。
Leveled Listにデザートイーグルを追加するスクリプト、MyWeaponLLInjector.pscからの抜粋。
Event OnQuestInit() LLI_Gunner_SemiAuto.AddForm(MyWeapon as Form, 15, 1) LLI_Gunner_SemiAuto_Boss.AddForm(MyWeapon as Form, 15, 1) LLI_Raider_Weapons_Boss.AddForm(MyWeapon as Form, 30, 1) LGND_PossibleLegendaryItemBaseLists_GunGroupLow.AddForm(MyWeapon as Form, 10, 1) LGND_PossibleLegendaryItemBaseLists_GunGroupHigh.AddForm(MyWeapon as Form, 10, 1) LGND_PossibleLegendaryItemBaseLists_SpecialGuns.AddForm(MyWeapon as Form, 10, 1) LL_Vendor_Weapon_GunSpecialty.AddForm(MyWeapon as Form, 1, 1) LL_Vendor_Weapon_GunGeneralStore.AddForm(MyWeapon as Form, 10, 1) EndEvent
さて、もし導入した後になってから、
やっぱレイダーにはデザートイーグルを持たせたくない!
と思ったら、どうしましょう?
ソースから、以下の一行を削除すればOKに見えるかもですが・・・
LLI_Raider_Weapons_Boss.AddForm(MyWeapon as Form, 30, 1)
これ、うまくいきません。
このスクリプトを動かすQuestですが、インストール後のゲーム開始時に1度動くだけです。初回起動時だけ走って、デザートイーグルを既存のLeveled Listにinjection(追加)します。この追加はセーブデータ依存となり、以降は何も機能しないです。
つまり、スクリプトを後から書換えても手遅れなんですね。
まあ、そうでないとLeveled Listがデザートイーグルだらけになってしまいますし!
要するに、
- Leveled Listの削除
- 対象NPC、レベル、所持数の変更
導入後に、こうしたLeveled Listの改変作業ができません。セーブデータ依存な為、プラグインからはどうにもならないです。Questを削除しても、30日待機しても、レイダーからデザートイーグルは無くなりません。
管理面も面倒で、Leveled Listにスクリプト追加があまりに増えすぎると・・・何がどのNPCにどう持たされるやら、訳わからなくなっちゃいますね。
『競合無く手軽に導入できる』という利点の代償として、とにかくメンテナンス性が悪いです。恐らくプラグイン方式だと、競合対策せずに大騒ぎするUserが出てくるので、Modderがこっちの手段を取ってるんでしょうね・・・。ぶっちゃけUserの連帯責任。
Wrye BashでLeveled List用互換パッチの自動作成(Bashed Patch)が一般的だったかと。Fallout4もWrye Bashあると思いますが、どうなんでしょう。僕はマニュアルでLeveled List統合してるので・・・。
Leveled Listをプラグイン方式に変更
一方のプラグイン方式。競合対策が必須なので、パッチ作れない人が運用するのは厳しいです(ロードオーダー下位の追加が潰れる)。反面シンプルな構造をしており、Leveled Listの事後改変や削除はいつでも可能です(勿論リスポン後の反映になります)。
更に、元からLeveled Listにパッチを当てて使ってる人から見れば、スクリプト形式を混ぜて使うことに何のメリットもありません。面倒が増えるだけなので、むしろプラグイン形式で統一した方が楽になります。
そこでソースを元にして、スクリプト形式のLeveled Listをプラグイン形式に作り変えることにします。
※スクリプトが走る前のセーブデータで実施しないと意味無いです。
必要なLeveled Listの確認
再度MyWeaponLLInjector.pscからの抜粋。8個のLeveled Listにデザートイーグルを追加してます。大きく分けて4タイプ。
ガンナー用。
LLI_Gunner_SemiAuto.AddForm(MyWeapon as Form, 15, 1) LLI_Gunner_SemiAuto_Boss.AddForm(MyWeapon as Form, 15, 1)
レイダー(上位)用。
LLI_Raider_Weapons_Boss.AddForm(MyWeapon as Form, 30, 1)
レジェンダリ仕様。
LGND_PossibleLegendaryItemBaseLists_GunGroupLow.AddForm(MyWeapon as Form, 10, 1) LGND_PossibleLegendaryItemBaseLists_GunGroupHigh.AddForm(MyWeapon as Form, 10, 1) LGND_PossibleLegendaryItemBaseLists_SpecialGuns.AddForm(MyWeapon as Form, 10, 1)
店売り。
LL_Vendor_Weapon_GunSpecialty.AddForm(MyWeapon as Form, 1, 1) LL_Vendor_Weapon_GunGeneralStore.AddForm(MyWeapon as Form, 10, 1)
これら8個をプラグインに落とします。
スクリプトとプラグインとの接続確認
スクリプト上のプロパティと、プラグイン上のオブジェクトとの対応を調べます。QuestのVMAD-Virtual Machine Adapterから判ります。
SSはレイダー用Leveled List。
スクリプトの『LLI_Raider_Weapons_Boss』が、プラグインの『LLI_Raider_Weapons_Boss』に対応してます。このMODではプロパティ名がEditor IDと同じ名前なので、判り易いですね。他のMODもそうとは限らないです。
Leveled Listのプロパティ同様に、武器(デザートイーグル)のプロパティも確認すると・・・

ソースでは『MyWeapon』ですが、バイナリでは『DEagle』になっており、VMADのPropertyNameも同様です。
pexから開いた方は、このあとのおまけで載せてます(Leveled Listの中身は同じ)。
プラグインにLeveled Listを追加
プラグイン上のEditor IDが判ったので、8個のLeveled Listをプラグインに落とします。
Fallout4.esmからCopy as override intoしてから作ればOKです。スクリプトInjection用のQuest(xx0017E8
)の削除も忘れずに。SSは削除済の状態です。
あとは、各Leveled List内にデザートイーグルを追加していきます。レイダー用のを例に。
LLI_Raider_Weapons_Boss.AddForm(MyWeapon as Form, 30, 1)
書式は、
AddForm(追加アイテム, レベル, 員数)
なので、それをプラグインに記述。
他の7個にも、同様に追加。
競合対策
ここではRaider OverhaulのLeveled Listと競合するので、共存できるように統合します。直接書いちゃってますが、互換パッチ作った方が良いと思います。
同じく、他の7個も統合したら、作業完了。
あとはスクリプト版と同じ動作をします。レジェンダリ仕様のも時々落っこちます!
所持対象やレベル等を変更したくなったら、プラグインからいつでも変更OKです。変更後のスポーンorリスポンから適用されます。
(おまけ)ソースファイルが無かったら?
PexInspectorで直接pexファイルを覗いて、injection状況を調べるという手も。Leveled List追加のスクリプトは構造が単純なので、ほぼソース通りに見られると思います。
pexから見ると、プロパティ名が『DEagle』なのがわかります(右窓2行目)。
以上、おしまいです!