こんにちは、まとんです。
BetterThird Person Selection – BTPS(以下、「BTPS」と呼びます)は、クロスヘアを正確に合わせなくても周囲のモノがアクティベートしやすくなるMODです。
スカイリムを三人称視点で遊ぶ時の定番MODで、入れている方も多いのではないでしょうか。
ポン入れで使ってもかなり便利なのですが、このMODのフィルタリングをカスタマイズすると、さらに使い勝手が向上します。
ただ、この設定がちょっと直感的でないというか、混乱しやすいというか。。。
意図通りに動かすのはちょっと大変なので、今回はBTPSフィルタの考え方と整理方法についてご紹介したいと思います。
用意するもの
Better Third Person Selection – BTPS

クロスヘア近くのアイテムやアクティベーターを自動検出してくれるすげーMOD。
検出精度が高い、レスポンスが速い、カスタマイズ可能、の三拍子が揃ってる。
BTPSのフィルタリング機能
BTPSのフィルタリングを駆使すると、アクティベートするものを状況に応じて選べるようになります。
例えば「スニーク中以外は盗みを無効にしたい」場合、次のフィルタで実現できます。
[[filterPreset]]
name = "スニーク中以外は盗み無効"
description = ""
conditions = [
{ function = "!IsSneaking" },
{ connector = "AND" },
{ function = "IsCrimeToActivate" }
]
formTypes = [
{ typeName = "Misc" },
{ typeName = "Ingredient" },
{ typeName = "Weapon" },
{ typeName = "AlchemyItem" },
{ typeName = "Armor" },
{ typeName = "Ammo" },
{ typeName = "Scroll" },
{ typeName = "SoulGem" },
{ typeName = "Spell" },
{ typeName = "KeyMaster" },
{ typeName = "Projectile" },
{ typeName = "Apparatus" },
{ typeName = "Flora" },
{ typeName = "Tree" },
{ typeName = "Container" },
{ typeName = "Light" },
]
これは「スニーク中でない時に犯罪対象となるアイテムをBTPSに拾わせない」というフィルタです。
つまり、こういうことです。
このようにフィルタが有効だと「できない」、無効だと「できる」という直感に反するロジックの組み立てが必要になるので、頭がこんがらがりやすいです。

MODの思想的にこの仕様になるのは理解できるのですが、実際やろうとすると本当に分かりづらい。。
フィルタ設定のコツ
いきなりフィルタを書き始めるとわけが分からなるので、Excelなどの使って最初に情報を整理するのがおすすめです。
まとめ方は人それぞれだと思いますが、「情報整理が苦手!」という方もいると思いますので、私の整理方法についてまとめてみました。
ざっくりフィルタしたい内容を考える
まずはどういう時にどういうことをしたいか、箇条書きで書き出してみます。
今回は次の要件を例に説明します。
表にまとめる
やりたいことがイメージ出来たら、これを表形式にまとめていきます。
次のように、状態とアイテムの2軸で表を埋めていきます。
アクティベートしたいものは「〇」、アクティベート不可のものは「✕」で記載します。その他、条件付きでOKにしたいものはその条件を記載します。
| アイテム種別 | 通常 | スニーク中 | 抜刀中 |
|---|---|---|---|
| Misc(雑多なもの) | 犯罪にならないもの ガラクタ以外 | ガラクタ以外 | ✕ |
| Activator(蝶やレバーなど) | 〇 | 〇 | ✕ |
| NPC | 空の死体以外 | 空の死体以外 | ✕ |
| Container(宝箱など) | 空コンテナ以外 | 空コンテナ以外 | ✕ |
| Ingredient(錬金素材) | 犯罪にならないもの | 〇 | ✕ |
| Weapon(武器) | 犯罪にならないもの | 〇 | ✕ |
| Door(扉) | 〇 | 〇 | ✕ |
| Furniture(家具) | 〇 | 〇 | ✕ |
| AlchemyItem(ポーションなど) | 犯罪にならないもの | 〇 | ✕ |
| Book(本) | 犯罪にならないもの 既読本以外 | 既読本以外 | ✕ |
| Armor(鎧) | 犯罪にならないもの | 〇 | ✕ |
| Ammo(矢・ボルト) | 犯罪にならないもの | 〇 | ✕ |
| Note(メモ) | 犯罪にならないもの 既読本以外 | 既読本以外 | ✕ |
| Scroll(巻物) | 犯罪にならないもの | 〇 | ✕ |
| SoulGem(魂石) | 犯罪にならないもの | 〇 | ✕ |
| Spell(魔法書) | 犯罪にならないもの | 〇 | ✕ |
| KeyMaster(鍵) | 犯罪にならないもの | 〇 | ✕ |
| Projectile(矢・ボルト) | 犯罪にならないもの | 〇 | ✕ |
| Light(たいまつ) | 犯罪にならないもの | 〇 | ✕ |

ご覧の通り一口に「アイテム」と言ってもかなり細分化されているので、「これは盗めるようにしたいな」とか「これは盗みでもいらんな」といった具合に、じっくり考えながら表を埋めていきます。
フィルタ解除キーを決める
実際にゲームをしていると、例外的にフィルタを無効にしたい場合が出てくると思います。
その都度フィルタを調整するのはめんどくさいので、「このキーを押している間はフィルタ無効」というキーを決めておくのがおすすめです。

例えばガラクタを拾えないようにしている場合、ガラクタ扱いのクエストアイテムがあると詰む可能性があります。そういう場合の救済措置です。
フィルタ作成前に覚えてほしいこと : フィルタは重複する
表が完成したらフィルタを作成していきますが、その前にフィルタの仕様について理解しておきましょう。
プレイヤーの状態が複数のフィルタ条件に一致した場合、フィルタは重複します。
例えば、次のフィルタを設定したとします。
ゲームパッドのRBとLBを同時押しすると、どちらか一方が適用されるのではなく、武器と鎧のどちらも拾えなくなります。
この仕様を前提にフィルタを作っていくので、覚えておいてください。
フィルタを作る
では、フィルタの仕様が理解できたところでフィルタを作成していきましょう。
フィルタの記述場所
BTPSのインストールフォルダから、次のパスを辿って「FilterPresets.toml」を見つけてください。
MCM\config\BetterThirdPersonSelection\Filters\FilterPresets.toml
このファイルをテキストエディタで開き、記述していきます。

同じ階層にある「FilterPresets_Default.toml」は作者様が用意してくれたデフォルトプリセットです。こちらを編集しないよう注意してください。
フィルタを作る
フィルタは禁止事項(フィルタリングしたいもの)が多いものから順に設定していくとやりやすいと思います。
ここでは抜刀中を「全て禁止」にしたいので、次のフィルタを作ります。
[[filterPreset]]
name = "抜刀中"
description = "抜刀中はアクティベートしない"
conditions = [
{ function = "IsWeaponDrawn" }
]
formTypes = [
{ typeName = "All" }
]
次は「犯罪にならないもの」を拾えるようにしたいので、ちょっと頭を切り替えて「犯罪になるもの」が選択できないようにフィルタを設定します。
[[filterPreset]]
name = "犯罪"
description = "犯罪を犯さない"
conditions = [
{ function = "IsCrimeToActivate" }
]
formTypes = [
{ typeName = "Misc" },
{ typeName = "Ingredient" },
{ typeName = "Weapon" },
...(対象のアイテム種別を全て列挙する)
]
さて、ここで先ほどフィルタ解除キーを決めたことを思い出してください。
例外に対処するために、フィルタ解除キーを押している間はフィルタを無効にする条件を加えたいと思います。
つまり、このフィルタは「フィルタ解除キーを押してないときに有効」とする必要がありますので、赤字の条件を追加します。
※ここではフィルタ解除キーをゲームパッドの「RB」に設定しています。
[[filterPreset]]
name = "犯罪"
description = "犯罪を犯さない"
conditions = [
{ function = "!IsKeyDown", parameters = ["275"] },
{ connector = "AND" },
{ function = "IsCrimeToActivate" }
]
formTypes = [
{ typeName = "Misc" },
{ typeName = "Ingredient" },
{ typeName = "Weapon" },
...(対象のアイテム種別を全て列挙する)
]
さらに、スニーク中はフィルタを無効にして盗みをOKにしたいので、「スニークしていないとき」という条件も加えます。
[[filterPreset]]
name = "犯罪"
description = "犯罪を犯さない"
conditions = [
{ function = "!IsKeyDown", parameters = ["275"] },
{ connector = "AND" },
{ function = "!IsSneaking" },
{ connector = "AND" },
{ function = "IsCrimeToActivate" }
]
formTypes = [
{ typeName = "Misc" },
{ typeName = "Ingredient" },
{ typeName = "Weapon" },
...(対象のアイテム種別を全て列挙する)
]
これで犯罪系のフィルタは完成です。
残りは制限対象が一つか二つの条件だけなので、個別のフィルタとして設定していきます。

全てフィルタ解除キーで解除できるように条件を加えます。
[[filterPreset]]
name = "ガラクタ"
description = "ガラクタ(50G未満)を拾わない"
conditions = [
{ function = "!IsKeyDown", parameters = ["275"] },
{ connector = "AND" },
{ function = "IsValueLess", parameters = ["50"] }
]
formTypes = [
{ typeName = "Misc" },
]

「何G未満がガラクタか?」はMODの構成や好みによって変わると思います。
ご自身で良い値を見つけてください。
[[filterPreset]]
name = "空コンテナ"
description = "空コンテナを開かない"
conditions = [
{ function = "!IsKeyDown", parameters = ["275"] },
{ connector = "AND" },
{ function = "IsEmptyContainer" }
]
formTypes = [
{ typeName = "Container" }
]
[[filterPreset]]
name = "空コンテナ(死体)"
description = "空コンテナ(死体)を開かない"
conditions = [
{ function = "!IsKeyDown", parameters = ["275"] },
{ connector = "AND" },
{ function = "IsDead" },
{ connector = "AND" },
{ function = "IsEmptyContainer" }
]
formTypes = [
{ typeName = "NPC" }
]
[[filterPreset]]
name = "既読本"
description = "既読本を拾わない"
conditions = [
{ function = "!IsKeyDown", parameters = ["275"] },
{ connector = "AND" },
{ function = "IsBookRead" }
]
formTypes = [
{ typeName = "Book" },
{ typeName = "Note" }
]
以上で設定完了です。
なぜこれで動くのか?
いくつかのフィルタを単発で設定しただけのように見えますが、意図通りの動きになると思います。
なぜなら「条件を満たしたフィルタは重複する」というルールが活きるからです。
例えば立ち状態では、次のフィルタが適用されます。
- フィルタ名「犯罪」の効果 = 盗み扱いになるアイテムをフィルタリング
- フィルタ名「ガラクタ」の効果 = 50G未満のアイテムをフィルタリング
- フィルタ名「既読本」の効果 = 既読本をフィルタリング
これらが全て有効になるため、盗みは検出しない → 盗み扱いでなくても、50G未満のアイテムは検出しない → さらに50G以上でも既読本は検出しない、となります。

正確に言えば「空コンテナ」「空コンテナ(死体)」フィルタも適用されますが、説明が冗長になるので省略。
またこの状態で抜刀すると、追加で「抜刀中」フィルタが加わります。
- フィルタ名「犯罪」の効果 = 盗み扱いになるアイテムをフィルタリング
- フィルタ名「ガラクタ」の効果 = 50G未満のアイテムをフィルタリング
- フィルタ名「既読本」の効果 = 既読本をフィルタリング
- フィルタ名「抜刀中」の効果 = 全てフィルタリング
「盗みは検出しない → 盗み扱いでなくても、50G未満のアイテムは検出しない → さらに50G以上でも既読本は検出しない → 抜刀状態だから何も検出しない(New!)」
という感じで、「抜刀中」フィルタだけが適用されるのではなく、条件に一致するすべてのフィルタが重複した結果、何も検出されなくなるだけです。
また、立ち状態からスニークした場合は以下の通りです。
フィルタ名「犯罪」の効果 = 盗み扱いになるアイテムをフィルタリング- フィルタ名「ガラクタ」の効果 = 50G未満のアイテムをフィルタリング
- フィルタ名「既読本」の効果 = 既読本をフィルタリング
「犯罪」フィルタはスニーク中以外で有効なフィルタなので、これが消えます。
そのため、盗み扱いのものが検出されます。しかし、「ガラクタ」と「既読本」フィルタにはスニーク中以外の条件を入れてないので、このフィルタは引き続き残ります。
結果、「盗みは働けるが、ガラクタと既読本は無視する」という動きになります。
では、スニーク状態で抜刀した場合は?
フィルタ名「犯罪」の効果 = 盗み扱いになるアイテムをフィルタリング- フィルタ名「ガラクタ」の効果 = 50G未満のアイテムをフィルタリング
- フィルタ名「既読本」の効果 = 既読本をフィルタリング
- フィルタ名「抜刀中」の効果 = 全てフィルタリング
ということで、「犯罪」フィルタは無効ですが、「抜刀中」フィルタが全てのアイテムをフィルタするので盗みが働けなくなります。
動作確認
フィルタを保存したら、ゲームを起動しましょう。
tomlを正しく記述できていれば、MCMにフィルタが読み込まれているはずです。

これを有効にして、意図通りの動作となっているかご確認ください。
うまくいかなかった場合は記述を見直し、フィルタを再読み込みをしてリトライします。
デバッグの「フィルターをリロード」にチェックを入れておくと、MCMを開きなおすたびに再読み込みされます。


ゲームを再起動しなおす必要はないですよ!
まとめ
BTPSのフィルタは混乱しやすいですが、順を追って整理していくことで意図通りにカスタマイズできます。
自分に合ったフィルタが作成できるとQOLが爆上がりしますので、BTPS愛用中の方はぜひ挑戦してみてください。ではでは~。

コメント