Condition Functionの「GetKeywordItemCount」について。
NPCの所持品をCondition Functionの「GetKeywordItemCount」で数えると、NPCの初期所持品(ActorデータのInventoryタブに登録されたアイテム)が干渉し、正常にカウントされないことがあるようです。
結論としては、Papyrus関数の「
GetItemCount」のNotesの項目にある注意事項がCondition Functionの「GetKeywordItemCount」にもほぼそのまま当てはまります。注意して使うよりほかありません。
弓を使わせる際、矢を持っているかどうかを「Keyword: VendorItemArrow」で調べられると非常に便利なんですが……。うーん、困った。
そこで片手間ではありますが、Keywordでのアイテムカウントがゲーム内でどのように認識されているのか分かる範囲でまとめてみました。
「Procedure: UseMagic」での巻物の消費について調べていた時の記録なので、テスト環境はちょっと特殊かもしれませんが……。
むしろ巻物の消費を調べていた時にこの問題にひっかかって、調査を始めた次第です。
以前
こちらの記事で、Condition Functionの「GetKeywordItemCount」が所持品の数を正しくカウントしてくれないということについて触れました。
まとめるとこんな感じです。
●試行1 初期所持品に矢を持っているNPCの場合
NPC:初期所持品「鉄の矢12本」
GetKeywordItemCount (VendorItemArrow)のカウント結果:0
↓
NPC:初期所持品「鉄の矢12本」持ち物交換で取り上げる
カウント結果:-12
↓
NPC:初期所持品「鉄の矢12本」取り上げた状態で、「オークの矢34本」を持ち物交換で与える
カウント結果:22
●試行2初期所持品に矢を持っていないNPCの場合
NPC:所持品なし
カウント結果:0
↓
NPC:持ち物交換で「鋼鉄の矢3本」と「デイドラの矢8本」を与える
カウント結果:11
つまりKeywordでNPCの所持アイテムを数える際、NPCの初期所持品に依存して結果に問題が生じています。アイテムがPlayableかそうでないかは関係ありません。
Mod作成の際、Keywordでアイテムの個数が上手く数えられない時は、該当NPCの初期所持品をチェックしてみてください。上のようなことが起こっているかもしれません。
そして今回「Procedure: UseMagic」で巻物の消費を調べている中でも似た問題に引っかかり、「GetKeywordItemCount」のカウントミスを再体験しました。その他、所持品の見え方にも困った現象が起こってます。
このProcedureはNPCに魔法や巻物を使わせるAIの一つです。巻物なしで魔法を放つこともできるのですが、巻物を持っていれば魔法を使うたびに消費するようになっているようです。
「UseMagic」の動作はともかくとして、Condition Functionの「GetItemCount」と「GetKeywordItemCount」をコンソールから調べて得られた結果をまとめてみました。
【環境】
- NPCはユニークActorとして新規作成で用意。Respawnもなし。屋外に配置。
- AI Package「UseMagicRepeat」でLightningBoltScroll(BaseID:9695A)を使用させる。PackageのConditionは設定しない。24時間常時魔法を放ち続けることになる(ターゲットはプレイヤー)。
- 巻物は、VendorItemScroll(A0E57)というKeywordを持っている。今回はこれでKeywordをカウントする。
- コンソールから「GetItemCount」と「GetKeywordItemCount」で値を確認。またスリでインベントリを覗いて、巻物の所持数も確認。
- 他の巻物は持たせない。そのため「GetItemCount」と「GetKeywordItemCount」が同じ数になるのが正常。
【試行結果】
1.初期所持品にLightningBoltScrollを10個持たせた場合
・GetItemCount 9695A =
10
・GetKeywordItemCount A0E57 =
0 ←Keywordではカウントできていない
・インベントリ:巻物10個
・UseMagicによる消費無し ←巻物を持っていないとみなされている?
2.初期所持品にLeveled Listを登録し、Leveled List経由でLightningBoltScrollを10個持たせた場合
・GetItemCount 9695A =
10
・GetKeywordItemCount A0E57 =
10 ←OK
・インベントリ:巻物10個
・UseMagicによる消費あり
3.初期所持品にLightningBoltScrollを5個、LeveledList経由で10個持たせた場合
・GetItemCount 9695A =
15
・GetKeywordItemCount A0E57 =
10 ←直に持たせた巻物がカウントできていない
・インベントリ:巻物10個 ←直に持たせた巻物は非表示。「ShowInventory」で一覧を取得しても10個。
・UseMagicによる消費あり ←LeveledListで追加した巻物10個を使い果たすと、直に持たせた巻物5個を消費し始める(GetItemCountで残量を確認した)。
【まとめ】
NPCの所持品について、「GetKeywordItemCount」がこちらの思惑通り常に正しい結果を返すわけではないことが分かります。
どうしても最初に渡しておきたいアイテムがあったら、LeveledListで渡す方法があります。別のところで問題が起きるかもしれませんが……。
Scriptで後から与えるのが一番安全そうですね。複雑な機能を持ったフォロワーを作成する時は、特に初期所持品に気をつけたほうがいいのかもしれません。
なおOutfitで与えられている装備品は「GetKeywordItemCount」でも正常に値を取得できたので、心配ないようでした。
「UseMagic」での巻物の消費状況は、「GetKeywordItemCount」の不具合と関連付けて考えていいものか不明なので、なんとも言えません。
巻物を消費できない状態でも、ゲーム内の持ち物交換でプレイヤーから巻物を渡してやると、それをきっかけにして持っている巻物を全て消費できるようになります。
もう少し体系的(?)にきちんと調べられたらいいのかもしれませんが、勘所が分からないので今回はこの辺で。自分が使う範囲で挙動確認とカウントミス時のフォロー等ができれば、それで十分だとは思います(涙)
以上、まとまっていないまとめでした。