2013/10/17

スカイリム室内装飾ガイドの続きの話

スカイリムの世界では、プレイヤーが自分の持ち物(インベントリ)からアイテムを捨てた場合、そのアイテムの座標は実際の位置とは異なる、ちょっと特殊な状態にあります。
そういった特殊な状態のアイテムは、ロード画面を挟んだ後、そのアイテムのある場所(セル)に改めてプレイヤーが侵入する時に初めて実際の位置と座標が一致する通常の状態になります。
そのため自宅などの飾りつけをする際は、捨てたアイテムをロード前にいくら動かしても無駄です。
そのアイテムが武器、もしくは最初からそのセル内に存在している場合でない限り、大半のアイテムはロード画面を挟むと、アイテムを捨てた直後の位置に配置が戻ってしまいます。
アイテムを捨てたら、まずは外に出て、ロード画面を挟んで戻ってくる。
それがスカイリム室内装飾のお約束です。

ところでこの不思議な現象についてなんですが、少し補足することがありまして、実はコンソールコマンドを使って直接、プレイヤーのインベントリからアイテムをドロップさせた場合は、ちゃんと実際の位置と座標が連動する通常の状態でセル内に出現するんですよね。
「drop」コマンドだけではなく、アイテムを新規生成する「PlaceAtMe」コマンドでも同様です。
またコンソールコマンドではなく、スクリプトの処理でアイテムを出現させる場合も、最初から座標が連動する状態になってます。

…ですから、たとえばプレイヤーがアイテムを置いた場所に別の何か別のオブジェクトを配置するようなModを作る場合は、プレイヤーが「アイテム」を捨てた瞬間に、そのアイテムとそっくりな別の「アイテム」を「PlaceAtMe」ですげ替えるという小技を使うとうまくいきます。
プレイヤーが捨てたアイテムをそのまま、他のオブジェクトを配置する目印として使ってしまうと、実際の座標と見た目の位置が違うので、正確な位置指定ができませんのでね。

ちなみに「アイテムを捨てた瞬間」というのは、そのアイテムがセル内にロードされる瞬間に稼動する「Event OnLoad()」のタイミングや、もしくはアイテムがインベントリから別の場所に移動した瞬間の「Event OnContainerChanged()」のタイミングで察知できますので、それらのイベント時に捨てたアイテムとそっくりさんな別アイテムをPlaceAtMeで新規配置してやればよいです。
スクリプトによる配置は瞬間的に行われますので、形状が同じ物であればアイテムを捨てた瞬間に別の物にすげ替えられた、ということに気づく人はいないでしょう。
もちろん、捨てた瞬間に稼動するようなスクリプトをアイテムに直接つけた場合は、PlaceAtMeですげ替えるアイテムの方は最初に捨てるアイテムとはBaseObjectが異なる別個の物である必要があります。
ややこしいですが、プレイヤーのインベントリから捨てる専用のアイテム(a)と、位置を指定するための配置用アイテム(b)の2種が別オブジェクトとして必要、ということですね。


ところで最近気がついたのですが、実は「PlaceAtMe」等のスクリプト、もしくはコンソールコマンドでアイテムを配置していても、そのアイテムの座標が実際の位置と連動しない特殊な状態になってしまう…という状況があります。
それは、そのアイテムと同じnifファイルを使っているアイテムが、既に座標連動しない特殊な状態でセル内に存在している場合…です。
つまり、PlaceAtMe等で配置するよりも先に、プレイヤーがそのアイテム、もしくはそのアイテムと同じnifファイルを使用している別アイテムをセル内に捨ててしまっていると、コンソールコマンドやスクリプトで配置されたアイテムもプレイヤーが捨てたアイテム同じように座標が連動しない状態で配置されてしまうのです。……地味に困ります、これ。
同じ形状ですが、左の銀の皿にのっているのが「イスグラモルのスープスプーン」、
右の皿は単なる「フォーク」です。

スプーンなのに、なにゆえフォークなのかはさておき……PlaceAtMeで配置したスープスプーンも
先にプレイヤーによってフォークが捨ててあると、座標は連動しない状態で生成されてしまいます。
セル内のアイテムの座標の挙動については、過去に色々実験をしたことがありまして、まあ、詳しくは過去記事(【実験編】【考察編】)を直接見ていただくのが良いのですが、あまりにもクソ長いので簡単にまとめますと、プレイヤーが捨てたアイテムでも、同じセル内に既に座標確定している同種のアイテムがある場合は、そいつが一種のテンプレートのような役目を果たすのか、ロード画面を挟まなくても最初から座標と見た目上の位置が連動している通常の状態になるんですよね。
…で、過去の実験ではそこまで思い至らなかったんですが、実はそのテンプレート的な存在になりうるのは、座標確定している通常の状態のものだけではなかった…ようなんです。
実はプレイヤーが捨てた座標連動しない特殊な状態のアイテムも、セル内に同種のアイテムがいない場合は「テンプレ」となって、後に続く弟たちの挙動を決めてしまう影響力があったんですね。
しかも参照しているnifファイルが同一のアイテムは、たとえBaseObjectが別の異なるオブジェクトでも、最初に呼び出された物にならって、座標連動する、しないという特性を帯びてしまうようなのです。
うーむ、これっていったいどういう原理なんでしょうねえ……
まあ、仕様ですと言われれば「そうですか」と思うしかないわけなんですけども。
しかしこれだけのアイテムをいっぺんにバラまいても画面がカクついたりとかしないのはスゴイです。
そのための仕様です……と言われたら、納得せざるをえない。

ちなみにこれはどんなアイテムが水に浮くのか調べていた時のスクリーンショット。
決して自宅のゴミを不法投棄しにきたわけではありません。
そういえば、まったく同一のnifファイルでも、格納されている場所(パス)が違えば、別のメッシュデータと認識してくれるようでして、座標連動する、しないの特性は引き継がれることはありませんでした。
ですから上記の薪をキャンプファイヤーに置き換えるModなどで、アイテムの外観にゲームオリジナルのバニラのnifファイルを使う場合は、念のためそのMod専用のフォルダ内にnifファイルをコピーして参照場所を変えて使用した方が良いかもしれません。
ゲーム本体のメッシュの場所をそのまま指定していると、同じnifファイルを使った他のアイテムが、Modの配置用アイテムの座標を狂わせてしまう可能性がなきにしもあらず……ですので。

5 件のコメント:

  1. うわぁwww水中がすごいことにwww
    そういえばカリクストさん、なんでフォークなのにスプーンなのか教えてくれないですよね。
    どっかに記述ありましたっけ?
    はじめまして。いつも楽しく読ませてもらっています。
    早速質問で申し訳ないんですが、データの「クリアした~クエスト・クリアしたクエストライン)」(~は内戦とか闇の一党とか)のカウントって何処で(どうやって)してるのか分かりますか?
    というのも最近(買ってから一年半以上経って初めて)内戦クエを帝国側でクリアしたんですが、「クリアしたクエストライン」の数が増えてなかったんです。
    不思議に思ってデータ欄をよく見てみたら、最後のクエストを完了したときに「クリアした内戦クエスト」の数が9個になってるんですよね。(内戦のクエストは全部で12個)
    とりあえずどこでそうなったのか色々検証してたら、キャンプにいるリッケさんに報告に行くたび(キャンプのあるセルに入るたび)に「クリアした内戦クエスト」数が1減ってるみたいなんですよね。
    最初のドーンスターは大丈夫なんですが、「リフト」「ウィンターホールド」「イーストマーチ」の3箇所で1減っちゃうみたいで。
    USKP外したり、違うデータでやってみたり、「Quest CWObj」(スカイリムの再統一)を弄ってみたり、コンソールでリッケさん呼び寄せたりとかやってみたんですが、どうにも上手くいかなくて。
    もし解決法(あるいはカウントを増やす方法)に心当たりがあれば教えていただけないでしょうか?

    返信削除
  2. 何度もすみません。書き忘れがあったので追記です。
    クリア数が減るタイミングは「心からの賛辞」完了後、リフト野営地のセルに入った瞬間・「カスタブ砦からの救出」完了後、ウィンターホールド野営地あるいはイーストマーチ野営地(ウィンターホールド野営地に寄らずにテュリウス将軍に報告に行った場合)のセルに入った瞬間・「アモル砦の戦い」完了後イーストマーチ野営地のセルに入った瞬間です。
    他のタイミングでは起こらず、いずれもリッケさんがいる野営地のあるセルに入った瞬間に起こるみたいです。

    返信削除
    返信
    1. データの「クリアした~クエスト・クリアしたクエストライン)」というのは、どうやら関連するクエストが「Complete Quest」のチェックの入ったステージに到達すると自動的にカウントが増えるしくみのようですねえ。
      たとえば内戦クエスト(帝国側)の最初のクエストは「CW01A」(帝国軍に入隊する)という奴ですが、「Setstage CW01A 200」とコンソールコマンドを入力すると、クエスト完了となり、「クリアした内戦クエスト」のカウントが1増えるみたいです。

      内戦の陣取りゲームの進行中に、なにゆえクリアした内戦クエストの数が減っていくのかは謎ですが、「リッケさんのいる野営地のセルに入ったタイミング」というのは、なんとなく「CWCampaign」クエストあたりが怪しいような気がします。
      もっとも内戦クエストの構造は複雑にからみあっているうえ、内戦クエストの根幹であるCWScriptというスクリプトが、Critterレベルの超大作なので、私の思い違いである可能性も高いですが。
      ちょうど私もウルフリック首長の死体をゲットするためにそろそろ内戦クエストを始めようかな、と思っていた時分なので、プレイ中に何かわかったらまたお知らせしますね。


      ちなみに、単に「クリアした内戦クエスト」のカウントを増やすだけならば、スクリプトで、

      Game.IncrementStat("Civil War Quests Completed", 3)

      …というような処理を走らせてやれば、「クリアした内戦クエスト」の数を3つ増やすことができますよ。

      削除
    2. ボズキン2013/10/19 11:17

      (3度目の書き込みで匿名は失礼に当たると思い、名前を変えました)
      返事が遅くなりましてすみません。こんな良く分からない質問に答えてくださってありがとうございます。本当に説明下手すぎますね、私。

      おばちゃんに教えて頂いたスクリプトを適当に本にくっつけて走らせてみたのですが、やっぱりというべきかクリア数が増えただけではクエストラインクリアにはなりませんでした。
      残念ながら、もっと根本的に解決しないといけないみたいです。
      数行のスクリプトを書くのに30分掛かった人間に何が出来るか怪しいですが、一応「CWCampaign」を眺めてみることにします。

      >データの「クリアした~クエスト・クリアしたクエストライン)」というのは~

      なるほど。ということは、リッケさんのいるセルに入った瞬間に「Complete Quest」のチェックが外れてるということなんでしょうか?
      内戦クエはステージのチェックの付け外しが忙しいので(「テュリウス将軍に報告」とか)、ついでに外れたんですかね。
      クリア数を増やしただけだとクエストラインがクリアにならないのもそれが原因かもしれないですね。

      >~内戦クエストの根幹であるCWScriptというスクリプトが、Critterレベルの超大作

      あのレベルですか・・・おばちゃんの解説を見て「ベセスダはすごいなぁ」とかアホ面して感動してた私には遠い世界のことのようです(遠い目)

      自分でももう少し頑張ってみますが、何かお分かりになりましたらお知らせいただけるとありがたいです。

      削除
  3. わーいおばちゃんのおかげで兄であるかぼちゃくんをほかされて人間に強い恨みをもった子狐フォロワーにんじんちゃんができたよー\(^0^)/

    いつも楽しく拝見させていただいてます
    新鮮なウルフリック首長の死体にも宜しくお願い致します

    返信削除