はじめに
EVG Animated Traversalで用意されているアクションポイント(家具)は、元々NPCでも動作するように作られています。プレイヤー専用というわけではないようです。プレイヤーは自主的にアクティベートするのでアクションするが、NPCは自主的にアクティベートすることがないためアクションできない、ということのようです。
EVG Animated Traversalに付属のチュートリアルダンジョンにはNPCがアクティベートする仕掛けが用意されています。アクションポイントに見えないドアを設置しています。NPCが移動する際に経路にドアがあると自主的に開けて移動しますが、これを利用しています。
ドアにはスクリプトが仕込まれています。また、NPCのアクション用にクエストが用意されています。NPCがドアをアクティベートすると、NPCと家具が専用クエストのReferenceAliasに代入され、パッケージが稼働します。このパッケージは家具をアクティベートするという単純なものです。
パッケージにはスクリプトが設定されており、パッケージの終わりに後始末をするようになっています。専用クエストのReferenceAliasを空にし、NPCを解放します。NPCは移動を再開する、という仕組みです。
ドアを使うメリットは、すべてのNPCで動作するということです。デメリットはドアのアクティベートのアニメーションがあるので不自然なところと、アクションポイントにドアを仕込む必要があるということです。
アニメーションはともかく、ドアを仕込むのはとても大変です。世界各地にアクションポイントを設置するEVG Animated Traversal – Patch Collectionがありますが、ドアは仕込まれていないようなので実質的にはプレイヤー専用です。そこで、別の実装にてフォロワーに対応させてみました。
フォロワー拡張を使っていることが前提です。私は自前のフォロワー拡張を作って使っているため、それに実装しました。
アクションポイント(マーカー)
プレイヤーに見えるのはマーカーです。白く光る小さな点です。これ自体はActivatorで、スクリプトが仕込まれています。
EVGActivateAnim.psc
アクションポイント(家具)をアクティベートする処理です。家具はマーカーにリンクされています。
このスクリプトをフォロワーの処理を開始するためのトリガーとして利用します。
EVGAnimSwap.psc
アクティベートした者に魔法をかけます。これがDARのアニメーションの条件判断に使われています。アクションポイントに対応したアニメーションを再生させるために必要になります。
フォロワーがアクションを再生する際にも必要なので、魔法を記憶する処理を加えます。
フォロワーの処理
以下の流れになります。
- フォロワーにじっとさせます。プレイヤーを追従する行動の場合、プレイヤーがアクションをした後の位置に辿り着こうとして遠回りに移動することがあるためです。
- フォロワーに魔法をかけます。
- フォロワーに家具をアクティベートさせます。
- フォロワーに追従を再開させます。
魔法をかける
EVGATが用意している魔法は効果時間が2秒しかありません。これは、プレイヤーがアクティベートしたら魔法の発動と家具の使用がほぼ同時になるため、問題にはなりません。
フォロワーの場合、まず家具の場所まで移動して、それから家具を使用します。そのため、家具を使用する頃には魔法が切れており、アニメーションが正しくならない場合があります。
そこで、魔法の効果時間を延長したバージョンを用意して、フォロワーの場合はそちらをかけるようにしました。そのかわり長すぎるのでアクション後はDispelする必要があります。
家具をアクティベートさせる
フォロワー拡張にパッケージを用意して実行するようにしました。
スクリプトでもアクティベートは可能なのですが、どういうわけかプレイヤーは問題ないのですが、NPCの場合は不発になります。パッケージによるアクティベートとは内部処理が異なるようです。
順番にアクションさせる
家具は一人ずつしか使えませんので、順番待ちさせる必要があります。
家具自体にIsFurnitureInUse関数を使うことで使用中かどうかがわかりますので、空くまで待ってからアクティベートさせることになります。
家具を動的に生成して各フォロワーごとに割り当てると順番待ちが不要になります。
SkyClimbに対応させる
設置済みModとSkyClimbとの違いは、SkyClimbがアクションポイントを動的に作っているという点のみです。
動的に作っているということは、プレイヤーの動作が終わったら消えるため、フォロワー用に同じものを動的生成して、フォロワーの動作が終わったら消すだけです。