2019年4月17日

CKで収納を設置する方法

Creation Kit を使って、リスポーンしない収納を好きな場所に設置してみたいと思います。
見た目を変更する方法や、特定のアイテムを自動的に収納させる方法についても書いています。


目次

  1. バニラの宝箱を見てみよう
  2. 盗み扱いにならないようにする
  3. 見た目を変更する
  4. 動かないように固定する
  5. 特定のアイテムを自動的に収納する

1. バニラの宝箱を見てみよう

1-1. 宝箱の設定

まず、バニラで使われているプレイヤー用の宝箱がどういうものか、確認してみましょう。
Object Window の Filter に「player」と入力し、WorldObjects > Container から「PlayerHouseChest」を開きます。

意外と設定された項目は少ないですね。次の4項目に注目しておきましょう。

  • ID … CK内での識別名
  • Name … ゲーム内で表示される名称
  • Respawns … チェックするとリスポーンするようになるフラグ
  • Model … nifファイルの指定

Respawns フラグが重要です。チェックを外しておけば、リスポーンしない収納になります。

1-2. 宝箱の設置

宝箱を設置したいときは、Render Window に置きたい場所を表示して、Object Window から「PlayerHouseChest」をドラッグ&ドロップすればOKです。

とりあえず戦乙女の炉に置いてみました。これでespを保存すれば、ゲーム内に宝箱が出現するようになります。

他の樽やエンド・テーブルなど、収納として使えるものはすべて Container 内にあります。使いたいものを選び、「Respawns」フラグが外れていることを確認してから設置しましょう。

目次に戻る


2. 盗み扱いにならないようにする

2-1. 収納のオーナー設定

戦乙女の炉のように自宅でない場所に設置した宝箱は、そのままだと盗み扱いになってしまうことがあります。

これを回避するには、宝箱の所有権にプレイヤーを指定する必要があります。

Render Window で設置した宝箱をダブルクリックして Reference を開き、「Ownership」を設定します。
「NPC」の項目に「Player」を指定することで、この宝箱はプレイヤーの所有物になります。

これで盗み扱いにならなくなりますので、収納として自由に使えるようになります。

2-2. セルのオーナー設定

設置したオブジェクトが盗み扱いになるかどうかは、それが置かれたセルのオーナー設定に依存します。

参考までに戦乙女の炉を見てみると、セルに「Owner Faction」が設定されています。

オーナーには、特定の個人である「NPC」か、属している派閥である「Faction」のどちらかを指定することができます。セルにオーナー設定がされていると、セル内のオブジェクトはすべて自動的にそのオーナーの所有物になります。

今回設置した宝箱のように、特定のオブジェクトだけ個別にオーナーを変更して、プレイヤー専用とすることも可能です。

バニラの自宅ではセルの設定が適切になされているので、個々の収納にオーナー設定を行う必要はありません。
また、セルのオーナーが設定されていない場所も、盗み扱いにならないので個々のオーナー設定は不要です。
屋外セルはオーナー設定がされていませんので、これも個々のオーナー設定は不要です。

目次に戻る


3. 見た目を変更する

3-1. 使いたいnifファイルパスの用意

収納の見た目をキャベツに変更したい人もいると思います。きっと。
見た目はnifファイルで変更することができますので、「キャベツのnifを使った収納」を新しく作成してみましょう。

ObjectWindow の Magic > Potion から「FoodCabbage」を選択して開きます。

Model の右側にある「Edit」を押すと、見た目を確認することができます。

Model File Name の部分にnifファイルの相対パスが表示されていますので、ドラッグ選択してコピーします。キャベツの場合は「Plants\Cabbage01.nif」です。

3-2. 収納の新規作成

収納を新規作成しましょう。Object Window の Container を選択した状態で、右側の空いたところを右クリックし、「New」を選択します。

新規作成画面が出ますので、ID と Name を入力したら、Model の右側の「Edit」を押します。

空の Model Data 画面が開きますので、「Edit」を押します。

ダイアログで "Data\meshes" フォルダが自動的に開きます。ここで、何も考えず先ほどコピーしておいたファイルバスを貼り付けます。

次の画像のように、モデルが正しく表示されたら成功です。

このとき、モデルが表示されず赤と白の「!」になることがあります。もしそうなった場合は、焦らずに「Edit」ボタンを押して、nifファイルパスをもう一度貼り付けてください。それで成功すると思います。

また、ここで自作のnifを使うこともできます。あらかじめ "Data\meshes" 以下に自作MOD用のnifファイルを入れておき、ダイアログのところで指定してください。

3-3. 作成した収納の設置

キャベツ型の収納、「EkaCabbageContainer」を作成することができました。

これを Render Window にドラッグ&ドロップすれば、ゲーム内で収納として使えます。

今回はサイズを2倍にしてみました。サイズは、配置した収納の Reference 内、「3D Data」の「Scale」で変更できます。

ゲーム内で確認してみると、きちんと収納として使えるようになっています。

目次に戻る


4. 動かないように固定する

4-1. 動くnifかどうか

バニラにある Container をそのまま設置した場合は、元々動かないnifなのでこの設定は不要です。

しかし、キャベツのように動かせるアイテムのnifを流用した場合は、ゲーム内で動いてしまう可能性がありますので、必要に応じて以下の方法で固定してください。

ゲーム内で動くかどうかはnifファイルに依存します。わからなければ実際にテストプレイして確かめましょう。

4-2. 固定する設定

固定するには、設定を2つ行います。

1つ目は「Don't Havok Settle」フラグです。これはチェックを入れるだけでOKです。

2つ目はスクリプトです。「Scripts」タブで「Add」ボタンを押し、固定用スクリプトを指定します。

スクリプト選択画面では Filter に「defaultd」と入力し、「defaultDisableHavokOnLoad」を選択します。

追加されたスクリプトを選択し、右側の「Properties」ボタンを押します。

上から2つ目の「havokOnHit」を選択し、「Edit Value」を押します。

下図のように Value が「False」に変更されればOKです。他はそのままで構いません。これで完全に固定されます。

目次に戻る


5. 特定のアイテムを自動的に収納する

5-1. アイテムリストの用意

上で作成したキャベツ型の収納は、そのままでも宝箱と同じような収納として使えます。
これを、「つかむ」動作をすることでキャベツを自動収納するように改変してみましょう。単にアクティベートした際は、通常通りインベントリ画面を開くようにします。

まず、自動で収納するアイテムのリストを作成します。
Miscellaneous > FormList を選択し、右側の空いたところで右クリックして「New」を選択します。

新しい FormList 画面が出ますので、まずIDを入力します。
そして、Magic > Potion から「FoodCabbage」を表示し、FormList 画面にドラッグ&ドロップします。

今回はリストにキャベツしか入れていませんが、同じ要領で収納したいアイテムを入れてください。

5-2. 自動収納スクリプト

自動収納するためのスクリプトを、設置したキャベツ型収納に新しく追加します。
Reference を開いて「Scripts」タブの「Add」を押します。先ほど付けた固定用スクリプトとは別に、収納用スクリプトを付けることになります。

スクリプト選択画面で「New Script」を選択します。

Name にスクリプト名を入れます。今回は「EkaStorageScript」にしました。

追加されたら、右クリックして「Edit Source」を選択します。
スクリプト用の外部エディタを設定してある場合は、「Open in External Editor」を選択します。

1行目は自動で入力されています。2行目以降に下記のスクリプトをコピーして貼り付けてください。

FormList Property folItemList01 Auto
Int Property intPossession = 0 Auto

;--------------------------------------------------つかんだ時
Event OnGrab()
    Actor actPlayer = Game.GetPlayer()

    actPlayer.RemoveItem(folItemList01, 999, false, Self)

    If intPossession > 0
        Self.RemoveItem(folItemList01, intPossession, false, actPlayer)
    EndIf

    actPlayer = None
EndEvent

File > Save を選択してセーブ(コンパイル)します。成功すると、下図のように「Compilation succeeded.」というメッセージが出ます。

追加したスクリプトにアイテムリストを登録するため、「Properties」を押します。

「folItemList01」を選択状態にして、「Edit Value」を押します。

プルダウンから、作成した「EkaCabbageList」を指定します。プルダウンは、キーボードで「eka」のように打てば頭文字検索することができます。

5-3. スクリプトの解説

上記のスクリプトを付けると、収納をつかんだ際にリストのアイテムを自動で収納してからインベントリ画面を開くようになります。

actPlayer.RemoveItem(folItemList01, 999, false, Self) の部分が収納指示です。
プレイヤーが持っている対象アイテムを「最大999個」収納します。所持数が999個に満たない場合は、持っているすべてを収納する動作になります。

また、上では設定しませんでしたが、プレイヤーのインベントリに残す数も指定できるようにしてあります。
「intPossession」というプロパティがそれで、デフォルトではこの数値を「0」にしてあります。

例えばこのプロパティに「Edit Value」から「5」を指定しておくと、ゲーム内で収納をつかんだ際、プレイヤーのインベントリには5個持たせて、余剰分を自動収納するようになります。

自動収納は突き詰めると面倒なスクリプトになりますが、今回は簡単なものだけご紹介しました。
特に武器アイテムを対象にすると、装備中のものやお気に入りを収納対象外にする処理にものすごい時間がかかるため、おそらくSKSEプラグインを作成しないと実用性のあるものは作れないのではないかと思います。

私も以前、Papyrusだけで全アイテムを自動収納するMODを作成してみたのですが、処理に数十秒かかるという事態になってお蔵入りしています。
SKSEプラグインの作成にはC++の知識が必要で、ちょっと勉強したけど今のところ頓挫しています。奥が深すぎて無理だった…。

食材とかインゴットとかの収納なら、今回のスクリプトを使うことで十分対応できると思います。

これであなたも収納上手!

目次に戻る

2 件のコメント:

  1. eka.さんこんばんはー。
    コンテナの作り方、ありがとうございますーーー。
    そうか、新規で作らないと駄目だったんですね。
    既存のコンテナをコピーしてメッシュだけを変えて作ってました。
    それだと見た目は変えたメッシュになるのですが
    ものの名前もコマンドもでてこなくて困ってたんです。

    盗み扱いはオーナーの方を変えればよかったんですね。

    しかも固定方法まで!
    これも物理演算切ればいいのかな?ぐらいにしか
    思ってなかったのと、こちらの記事で「CKでオブジェクトを固定する方法」を
    みたときに「えースプリクト使うのか。。面倒・・」と思って
    ろくに読まずにいました。ごめんなさい。

    次に自分のMODを更新するときに、参考にさせていただこうと思います
    ありがとうございました!!

    返信削除
    返信
    1. りんさんこんにちはー早速反応もらえて嬉しいです!

      既存のコンテナのコピーでもいけそうな気がするんですけど、最近は新規作成がマイブーム(?)なのでそうしてみました。
      メッシュについてはまったくと言っていいほど知識がないので、自作のnifでも同じようにできるかどうかは試せていません。今もチーズを使っていらっしゃるならいけるかも。

      オブジェクト固定の記事も書き直そうと思いつつ放置してます。とりあえずキャベツ型コンテナに必要なとこだけ抜き出してきました。

      MODの更新を促している感じになっては申し訳ないので、「そんな方法もあるのか~」程度にお読みいただければと思います。今回はネタとしてパク…参考にさせていただきありがとうございました☆

      削除

注: コメントを投稿できるのは、このブログのメンバーだけです。