Skyrim箱庭DIY

MODによる固有の環境不具合は自分で直して快適ゲーム。CTDにさようなら。Do It Yourself!!

【Skyrim】Face LightとCulort Nabeeの光源切り替え実験



スポンサーリンク

光源に関しては知らないことが多すぎるので、また微妙なことやってるかもしれませんが。

Face Light使用中にtorch(松明)を使うと、Facelightで顔を照らしつつ、松明の光源が有効になっています。

一方、Osare Culort Outfit - UNPのCulort Nabeeを照明に使おうと装備してみると、松明と違ってFacelightの効果が消えず、Nabeeの光源が有効になりません。iMagicLightMaxCountは11になっているけど、Magic Effectの光源をキャラクタにくっつけるのに制限がある?とか、松明のようなMagic Effect通してない光源だとOK?とか、色々想像してみますが、僕のキャパ超えてます。そもそも僕の環境だけだったら記事自体スキップしてくださいまし・・・

Facelight.espでCandlelightとFacelightがスクリプトで排他仕様になっているので、何か秘密がありそうですが、これまた僕のキャパ超えててわかりません。

ということで、わからない時はとりあえずマネ見習ってみようということで、

  • 松明の光源設定に合わせてみる
  • Culort Nabeeに同じようなスクリプトを仕込んでみる

あたりを試してみます。

Osare Culort Outfit のファンネル

Osare CulortについてくるNabee。自キャラの周りをふわふわ飛んでます。

インベントリのNabee

 

Facelightをつけた状態でNabeeを装備しても、光源になってくれません。アクセサリで使う分にはこれでもいいかもですが。

デフォルトのNabee

 

一方、松明を装備した場合です。周囲の明るさを見れば一目瞭然、松明が光源になっています。Facelightも潰れていません。

松明とFacelightの共存

 

松明と同じ光源にしてみる

大抵Lightは、Magic Effectを経由して設定されてるかと思いますが、松明はLightそのものを装備するといった形になっていて、Magic Effectを通していません。光源周り詳しくないのでアレですが、あまり同様のものは無さそうな気がします。

 

松明の構造

松明です。アイテムを装備する以上はMISCカテゴリかと思いきや、「LIGH」そのものです。Lightのオブジェクトに直接メッシュとNameを設定してあります。

松明の正体

 

Nabeeのライトを直接装備してみる

ということで、松明と同じことをしてみました。NabeeのライトをNew Recordでコピーして、メッシュと名前を設定してみました。

MagicEffectを通さないNabee光源

※(20150428)実験で使ってた別パラメータのSSと間違えていたので差し替え。ライト色の変更と、「unknown」フラグが立ってました。

 

装備してみました。FacelightとNabee双方の光源が両立しています。しています・・が・・・

左手で見えない松明持ってます

松明Nabeeの確認"

Lightに直接メッシュとName設定した場合、松明のモーションが適用されてしまう気がします。装備部位も左手限定になってしまいます。これ回避するのは至難の業な予感が。下手に潰すと松明が中に浮くことになりそうです。両立できてるだけに勿体無いですが。松明にあわせてNabeeの高さも上がってます。

 

Nabeeにスクリプトを仕込んでみる

Nabee装備中はFacelightを解除し、Nabeeを外したら復活させる。そんなスクリプトを考えます。はじめに少し触れた、FacelightとCandlelightを排他にするスクリプトの話です。作者さんのブログで1.3のソースが配布されていますので、参考にします。

skyrimshot.blog.fc2.com

 

過去のスクリプト記事も役に立ちます。装備する、外すをトリガにするスクリプト。

 

スクリプトのソース

とりあえずこんなの作ってみました。参考というより、作者さんのサイトにアップされているFacelightとCandlelightをトグルさせるスクリプトをベースに改造してみただけです

 

Scriptname NabeeFaceLightCandleLightToggle extends ObjectReference

Spell property NabeeFacelight auto
bool bHasSpell = false

Event OnEquipped(Actor akActor)
Nabeefacelight = Game.GetFormFromFile(0x0007FFA2, "Facelight.esp") as Spell
If akActor.HasSpell(Nabeefacelight)
Game.GetPlayer().RemoveSpell(Nabeefacelight)
bHasSpell = true
endif

EndEvent

Event OnUnequipped(Actor akActor)

If bHasSpell
akActor.AddSpell(NabeeFacelight,false)
bHasSpell = false
Endif

EndEvent

 

スクリプトの説明

僕もスクリプト超初心者なので、説明書きながら勉強してるノリです。なもんで書き方良くないとかあるかも。いくつかに区切って説明します。

Scriptname NabeeFaceLightCandleLightToggle extends ObjectReference

Spell property NabeeFacelight auto
bool bHasSpell = false

「Nabeefacelight」という器を用意します。Facelightのアドレスを入れる予定地です。

「bHasSpell」というFlagを使って、Nabeeを装備する前にFacelightが使われていたのか否かを識別します。

Facelight未使用>Nabee装備>Nabee外す>Facelight付いちゃったテヘッ!

という流れにならない為のメモのようなもの。 

 

次いきます。

Event OnEquipped(Actor akActor)
Nabeefacelight = Game.GetFormFromFile(0x0007FFA2, "Facelight.esp") as Spell
If akActor.HasSpell(Nabeefacelight)
Game.GetPlayer().RemoveSpell(Nabeefacelight)
bHasSpell = true
endif

EndEvent

 Nabeeを装備した状態(OnEquipped)になったときに発動するしかけです。

「Nabeefacelight」にはFacelightのアドレスを格納して、このスクリプトで直接Facelightをコントロールできるようにします

GetFormFromFime()で特定esp内のアドレスを指定すると、現在のロードオーダーから割り出した上位2桁を足したアドレスを返してくれます。これによりFacelight.espをマスター指定しなくても、Facelightの現在のアドレスがわかります。ロードオーダーが変わっても大丈夫ですが、espファイル名とアドレスを直接指定しているので、Facelightが別のMODとマージされている場合は動きません

※OnEquipedの中にこれ入れるのは微妙な気がするのですが(1回だけ取得すればいいから)、OnLoadだとうまく出来なかったので、とりあえずはこれで。

あとは、Facelightが使われていた場合はFacelightを取り外し(RemoveSpell)、付いてたことを覚えておき(bHasSpell=true)、終了します。

これでNabee装備時にはFacelightが外れます。

最後はNabeeを外した時です。

Event OnUnequipped(Actor akActor)

If bHasSpell
akActor.AddSpell(NabeeFacelight,false)
bHasSpell = false
Endif

EndEvent

 外した時にbHasSpellをチェックして、真であれば「Facelightが使われていた」ということになるので、Facelightを戻します(AddSpell)。

偽であれば、もともとFacelightが使われていなかったということなので、そのまま終わります。

 

スクリプトをNabeeにくっつける

CKで見たNabeeです。右下でスクリプトをくっつけてます。

スクリプトをNabeeに貼る

 

Skyrimで確認

ゲームを起動してNabeeを装備してみます。Facelightが消えてNabeeの光源が有効になっています。顔ちょっとコワイ。

排他スクリプトをつけたNabeeの確認

やっぱりMagic EffectのLightって、キャラクターに対して1個しか付けられないんですかね?光源として使うにはこれでいいですけど、松明みたいにMagic Effect通さないと共存できるようなので、何かいい方法あると良いのですが。

 

このゴーグルもほぼ同じようなスクリプト使ってライトと併用してます。Eventがちょっとだけ違うとか、その程度。Dwemer Goggles and Scouterのホットキーで呼ばれるスクリプト部分に突っ込んでます。

スクリプトのゴーグル適用

 

【おまけ】GetFormFromFile()の補足

GetFormFromFile()ですが、上記のように特定espを指定した上で、その中のアドレスを走査します。今回の例だと、もしFacelightを外していなかった場合は、

「探したけどそんなesp無かったよ!」という報告(スタックエラー)がデバッグログに出るだけでスキップされます。

Wet and Coldでログにでてくるやつがまさにこれです。対応MODがインストールされているかチェックしてます。無かった場合はエラーが出てるだけです。導入環境によっては出るに決まってるエラーです

逆に言うと、この対応MODをマージしてしまうと、Wet and Coldが見つけてくれません。

※改造したMODの配布はしてないです。というかしちゃダメです。作者さんの許可あれば別ですけど。