2022年12月6日火曜日

Fallout4 備忘録

Fallout4のModを弄り回してた時に気づいた点やあまり他サイトで触れられてないような事に関するメモ。

SkyrimにあったGame.GetCurrentCrosshairRef関数について

Fallout4には標準機能として存在しない。(だがGetCurrentConsoleRefというConsole Utilを使わない限りデバッグにしかほぼ用途が無いものはしっかりと残してる)
後述するPapyrus Common Libraryというスクリプト拡張プラグインにてGetCurrentCrosshairRefが使用できる他、
LL FourPlay communityというスクリプト拡張プラグインにてほぼ同じ機能のLastCrossHairRef関数とLastCrossHairActor関数が使えるようになる。
 

特定対象のアクティベート時にRキーで追加コマンドを実行するタイプのModについて

これはダミーPerkにAdd Activate Choiceを設定してプレイヤーに持たせる事で実現させてるが
このAdd Activate Choiceが設定されてるPerkを複数取得した場合、
発動条件を満たした追加コマンドが2つ以上あるとコマンドが表示されなくなり、Rキーを押しても追加コマンドが実行できないという問題が発生する。
(A、B、Cのコマンド追加Perkをプレイヤーが所有し、AとCの条件に一致した対象にクロスヘアを合わせてもRキーコマンドが表示されなくなる)
おまけにこの追加コマンドを実行するキーの指定が不能なため競合した時の解決もかなり困難となる。(最悪どちらかの追加コマンドModを切る必要がある)

このPerkによる追加コマンドはSkyrimにあったGame.GetCurrentCrosshairRef関数が消えた事によってクロスヘア上のアクターを取得できる手段が無くなったため
その代打手段として使われていたが現在はPapyrus Common LibraryやLL FourPlay communityというスクリプト拡張プラグインでGame.GetCurrentCrosshairRef関数と同機能の関数が使えるようになったため
目の前の対象に特殊な事をやりたいModを作る場合は上記の問題回避のためにもPapyrus Common Library、もしくはLL FourPlay communityの関数とOnKeyDownの組み合わせでModを制作するのが安全。


スクリプト拡張プラグインについて

この記事を書いた時点でのFallout4のスクリプト拡張プラグインは自分が見つけた範囲では
SUP F4SE、Console Util、LL FourPlay communityぐらいしかなかったが
2023年後半ぐらいからスクリプト拡張プラグインが増え始めたおかげで昔に比べてスクリプト関係は非常に自由度が増した。
 
近年ではFallout4の突然のアップデートのせいで使用できなくなってるものも出てきてしまったが、幸いPapyrus Common Library、Lighthouse Papyrus Extender、Garden of Eden Papyrus Script Extenderの3つのスクリプト拡張プラグインで代用は可能。
プラグイン開発者ならば基本的に上記3つのスクリプト拡張プラグインを入れれば問題ないだろう。(どれがどの方面に優れているかはまだ把握しきれていない)
 
  • Papyrus Common Library
ファイル操作系やコンソール系、それ以外にも色々と欲しかった関数を扱えるようになるが
何よりも重要なのがLL FourPlay community以外でGetCurrentCrosshairRefが使えるようになるという点。
これかLL FourPlay communityが無いとクロスヘアを合わせた対象に特別な事をするMod開発は非常に制限が掛かるので是非とも導入をオススメする。
また、SUP F4SEが最新のFallout4に対応しなくなったため
SkyrimのPapyrusUtil SEを使ったModにあるようなMod設定の保存や読込、ゲームのロード時にMod設定の自動読込を作成したい時はこちらを使った方が良い。
 
  • Lighthouse Papyrus Extender
多くの関数を追加する拡張プラグイン。LL FourPlay community以外でHexToIntやIntToHex等の数値から文字列、あるいは文字列から数値への変換等の機能が扱える。ドキュメントは充実してる方なので分かりやすい。
 
  • Garden of Eden Papyrus Script Extender
多くの関数を追加する拡張プラグイン。こちらもConsole UtilやPapyrus Common Library以外でコンソール系の関数を追加する。上記2つに無いものはこちらに存在してる事が多くアクター取得系もGetCombatGroupMembersやGetCombatTargeters等、これが最も充実してるかもしれない。
ただ、On~等のイベント受信型に関してはPapyrus Common Libraryと被っていてかつあちらの方が種類が豊富なのでイベント受信型はPapyrus Common Libraryの方を使ったほうが良い。
 

  • SUP F4SE
※現在のアップデートされたFallout4には非対応
Jsonファイルの読み書きや一時保存用の変数の仕様が可能になる。
Papyrus Common Libraryが出る前は、唯一外部ファイルを使用できるようになるスクリプト拡張プラグインであった。
ちなみにこの拡張プラグインはSkyrimにもSUP SKSEという名前で存在する。
 
JSON関係はPapyrus Common Libraryで代用可能になった。
 
  • Console Util
※現在のアップデートされたFallout4には非対応
コンソールコマンドをスクリプトから実行する関数を追加する。
SkyrimのConsole Utilと同機能。
 
Papyrus Common LibraryかGarden of Eden Papyrus Script Extenderで代用可能。
 
  • LL FourPlay community
※最新版は現在のアップデートされたFallout4に対応しているが旧バージョンには非対応
 Skyrimで存在してFallout4で何故か消えた関数の一部がこの拡張プラグインで使えるようになる。
クロスヘア上のアクターに対して特定のキーを押す事で何かのアクションをするというスクリプトを作る場合は必須。
(ただ、ダウンロードサイトはnexusとは別サイトでそちらもダウンロードのためにアカウント登録する必要がある)
 
クロスヘア関係はPapyrus Common Library、
HexToIntやIntToHex等はLighthouse Papyrus Extenderで代用可能。
 

Game.GetPlayerFollowers関数の仕様

現在コンパニオンになっているアクターではなくプレイヤーに追従しているアクター達を配列で返す。だが、待機命令で待機してたり戦闘中だと配列に含まれないためOblivionやSkyrim(要powerofthree's papyrus extender)の類似関数と同じ感覚で使うと痛い目を見る。(OblivionのGetNumFollowersはちゃんと取得できてたのに…GetCurrentCrosshairRef関数の件もそうだがスクリプト関連は何で一部退化しとるんだ…)

SUP F4SEがあれば周囲のアクターを取得できる関数が存在するため下記のコードで取得できる。(スクリプトエンジンもSkyrimよりマシになった感じはするが負荷がありそうだから多様は禁物。)

Actor[] Function GetFollowers()
    Cell pCell = Game.GetPlayer().GetParentCell()
    Actor[] followers = new Actor[0]
    Actor[] acts = SUP_F4SE.GetActorsInCell(pCell)
    int i = 0
    while (i < acts.length)
        if acts[i].IsPlayerTeammate()
            followers.add(acts[i])
        endif
        i += 1
    endWhile
    return followers
EndFunction

※近年ならばGarden of Eden Papyrus Script Extenderのアクター取得系で何とかなるかもしれない。