今更なオブリビオンブログ
おもにMOD関連のメモを書いていくと思います、MODをいじったり、作ってるのが楽しいです。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

色つきライト

以前作った松明落としのMODの応用で、明かりをプレイヤーに追従するようにして、もっと種類を増やすことで、色んな色のライトを作れないかと思って作ってみました。



明かりは3Dデータが無いため「Begin OnLoad」が使えませんでした。
しかし、基本は同じ処理で、松明扱いにした明かりを、「PlaceAtMe」というコマンドで呼び出しています。
制御や消去する処理は、明かりに付けたスクリプトで行っています。




あと、今回はアイテムを消去する際にメッセージを表示させない方法として、「Message」の仕様を利用した方法をとりました。




本当にただ色つきのライトなだけではつまらないと思い、プレイヤーがスニーキング中なら追従しないという処理を付けました。
スポットライトとして使えます。




重ね掛けをすると陰影がすごいことになります。



ダウンロードは次の記事で。

テーマ:Oblivion - ジャンル:ゲーム

MOD作り16
松明落しのMODですが、せっかくなので、MODで追加される松明にも対応したヴァージョンも作ってみることにします。

対応させるMODは、人気MODの「tona's mods store」です。
http://oblivion.nexusmods.com/mods/29090/
このMODで追加されるランプ3種類とランタン2種類に対応させてみたいと思います。

ちなみに、tonaさんのアイテムは置くだけで普通に光源として使えるため、ヴァニラの松明のように別途明かりを用意する必要は無いです。
なので、「begin GameMode」を使う必要が無いため、ランプとランタンに直接スクリプトを付けても負荷の問題はないでしょう。
それに、付けるスクリプトはだいぶ簡略化できそうです。

…暗いところで置いて見たところ、光が出てませんでした。
なぜか人は照らすのに、周りは暗いままでした。
これは、松明全般の仕様なんでしょうか?

テーマ:Oblivion - ジャンル:ゲーム

MOD作り15
「落とす松明」に付けるスクリプトの中身をどんなものにしたか、簡単に解説していきたいと思います。

都合、4つのブロックに分かれました。

■まず一つ目、「begin OnActivate」で「落とす用の松明」を拾った時に「ヴァニラの松明」に交換するスクリプトを書きました。
このブロックは、スクリプトの中でも最初に書いています。
後ろのほうに書くと、なぜか正常に動きませんでした。
ちなみにこの部分は「begin OnAdd」でもよさそうですが、そうすると後述するリスポーン時の処理の時に誤動作を引き起こしそうだったので「begin OnActivate」で書きました。

以下が実行する内容で、
Player.AddItem Torch02 1
LightRef.Activate Player
Player.RemoveItemNS Torch02DropLight 1
Activate Player
Player.RemoveItemNS Torch02Drop 1

…という感じです。

1行目でヴァニラの松明を追加しています。
2行目で「LightRef」をスクリプトでアクティベートしています。このRefIDは、「松明の明かり」です。
 明かりは「Can carry」にチェックを入れて作ったため、このスクリプトで強制的にアクティベートして持ち物の中に入れます。
3行目で持ち物の中の「松明の明かり」を「RemoveItemNS」を使って消去します。
4行目で「落とす用の松明」をアクティベートして持ち物の中に入れます。
5行目で「落とす用の松明」を「RemoveItemNS」を使って消去します。


プレイヤーが落としたアイテムはリスポーンしても消えず、Disableしても残っていることは以前の記事で実験済みなので、このようにして「落とす松明」と「松明の明かり」を一旦取得してから消すことで、世界から完全に消去しています。


■二つ目の「begin OnLoad」では、主に「松明の明かり」を召喚する部分です。
 それが、
Set LightRef to PlaceAtMe Torch02DropLight

ここでは、「PlaceAtMe」というコマンドを使っています。これは指定したモノを呼び出す(実質新しく作り出す)ことが出来るコマンドで、しかも、呼び出すと同時にそのオブジェクトのRefIDを取得することも出来ます。
この命令文では、「Torch02DropLight」というモノを呼び出すと同時にそれを「LightRef」というRef変数に格納しています。


・また、ここでは「SetOwnership」のコマンドも実行しています。どうやら、スクリプトで落としたアイテムの所有権は、そのセルの所有者のものになるらしく、お店の中で落としたら、泥棒呼ばわりされてしまいました。
 なので、このコマンドで松明の所有権をプレイヤーの物にする必要があります。


・さらに、2度目のロードが起こるまで放っておいたら、消すという処理も付け加えました。
 上記のものと内容は同じです。


■三つ目の「begin OnReset」は、リスポーン時にまで放っておいたら、消すという処理です。

「落とす松明」と「松明の明かり」を一旦取得してから消すことで、世界から完全に消去しています。
上記のものと内容は同じです。



■四つ目の「begin GameMode」では、明かりを松明に追従させる処理です。

set fPosX to getpos x
set fPosY to getpos y
set fPosZ to getpos z
LightRef.SetPos x, fPosX
LightRef.SetPos y, fPosY
LightRef.SetPos z, fPosZ

まず、「getpos x, y, z 」で「落とす用の松明」の指定した軸(X, Y, Z)におけるその現在の位置を取得して、「fPosX」「fPosY」「fPosZ」という変数に格納しています。
その後、「SetPos x, y, z 」で「LightRef(松明の明かり)」を取得した数値にセットしています。
これを毎フレーム繰り返すことで、明かりを松明に追従させることが出来ます。

初めは、「MoveTo」を使ってみたのですが、それだとうまく動きませんでした。
どうも、「MoveTo」は対象がActorの場合でしか正常に働かないようです。



これが、大まかな内容です。

テーマ:Oblivion - ジャンル:ゲーム

MOD作り14
一体なにが悪かったのか解りました。

結論から言うと、これは仕様のようです。
はっきりと確かめたわけではありませんが、おそらく松明のnifファイルの作りのせいのようです。
明かりを発生させる点が松明のオブジェクトの内部にあるため、松明自身に明かりが遮られ、周りを照らさないのだと思われます。
隙間から漏れ出た光がたまに周りのオブジェクトを照らすことがありますが、はっきり言って、このままでは扱えません。
「Drop Lit Torches in Combat」の中を覗いて見たところ、「落とす松明」と「松明の明かり」が別々で作ってあり、明かりをスクリプトで松明に追従するようにしてありました。
これと同じ仕組みにするしかないようです。

でも、それだと「begin GameMode」で書かなければいけません…
なるべくGameModeは使いたくなかったけれど…、まあ、これはしょうがないかな。

ちなみに自然光の作り方は、下画像の赤枠の部分、nifファイルを設定する箇所を何も指定していないことです。


こうして作った光は、オブジェクトに遮られません。

nifファイルがないオブジェクトには黄色いビックリマークが出たりしますが、「Light」オブジェクトの場合はなにも表示されません。



あと、何度かスクリプトを書き直していると、どういう訳か、いきなりCTDをするようになっていました。
原因はどうやら「RemoveItem」を書く位置にあったようです。
オブジェクトスクリプトの付いているアイテムを「RemoveItem」で自分自身のスクリプトで消すと、そのスクリプトを参照できなくなってしまうようで、CTDを引き起こすようです。

これは、実行するスクリプトの文の最後に「RemoveItem」を書くことで、問題は解決しました。

テーマ:Oblivion - ジャンル:ゲーム

MOD作り13
まず、「落とす用の松明」を作ります。
松明は、「Item」ではなくて、「WorldObjects」の中の「Light」の中にあります。

下の画像は、ヴァニラの松明「Torch02」の設定です。


この、赤枠で囲った部分の「Can carry」にチェックを入れるとアイテムとして持ち物の中に入る、松明の扱いになります。
この設定が無いと、アクティベートをすること自体が出来なくなります。(蝋燭や自然光等の設定)
その横の「Off by default」は、オブジェクトがロードされた時に初めから火がついているかどうかのチェックです。
ヴァニラの松明はこのチェックが無いため、落ちている松明には火がついていません。

ヴァニラの松明の「Off by default」のチェックを外したものを作れば、「落とす用の松明」の完成です。



次は、松明を落とすクエストスクリプトを作ります。
要点だけ書き出します。

Short WeaponType

begin GameMode
set WeaponType to player.GetWeaponAnimType

if player.IsWeaponOut == 1 && player.isshieldout == 1
 if player.GetEquipped torch02 == 1
  Player.AddItemNS Torch02Drop 1
  Player.EquipItemSilent Torch02Drop
  Player.UnequipItemSilent Torch02Drop
  Player.RemoveItemNS Torch02 1
  Player.Drop Torch02Drop 1
 endif
elseif player.IsWeaponOut == 1 && WeaponType > 1
 if player.GetEquipped torch02 == 1
  Player.AddItemNS Torch02Drop 1
  Player.EquipItemSilent Torch02Drop
  Player.UnequipItemSilent Torch02Drop
  Player.RemoveItemNS Torch02 1
  Player.Drop Torch02Drop 1
 endif
endif

・まず、「WeaponType」の変数を宣言して、現在の武器の種類を取得しています。
「GetWeaponAnimType」の返す値で、現在両手持ち武器かどうか判定しています。

・「IsWeaponOut」のコマンドで、現在武器を抜いているかどうかの判定、「GetEquipped」で何を装備しているかを取得出来るので、これを使います。
最初のif文の所で「戦闘態勢で、盾を装備している」状態の時に松明を装備するとスクリプトを実行しています。(左手で松明が使えない状態の時)
この条件だと、素手の時と盾が無い時には松明を落としません。
次のif文の所で「戦闘態勢で両手持ち武器を装備」の状態の時に松明を装備するとスクリプトを実行しています。
これは、最初のif文の条件だけでは、「盾を持たずに両手持ち武器を装備で松明を装備」した時に松明を落とさないため、必要となります。

・次に、実行しているスクリプトの内容です。
Player.AddItemNS Torch02Drop 1
Player.EquipItemSilent Torch02Drop
Player.UnequipItemSilent Torch02Drop
Player.Drop Torch02Drop 1
Player.RemoveItemNS Torch02 1

まあ、見ればなんとなく分かると思いますが、「Torch02Drop」が「落とす用の松明」です。
条件がそろった時に「落とす用の松明」をコッソリと持ち物に追加し、それを「装備」、「装備を外す」を実行することで、松明を持っていない状態にします。
(※後で気づいたんですが、条件がTorch02を装備している時なので、ここは別にTorch02の装備を外すだけでよかった。この処理が必要なのは、条件が「IsTorchOut」を使っている場合で、この条件なら、MODで追加された松明でも反応するが、武器構え中に松明を落とせなくなる)
その後、「落とす用の松明」を落とし、荷物の中のヴァニラの松明を減らしています。


当然クエストスクリプトの実行頻度は変更してあります。
あとは、「落とす用の松明」を拾った時に「ヴァニラの松明」に交換するスクリプトを付ければ完成です。



…あれ?意外と簡単にできた?と思いきや、問題が発生。
松明を落とすことは落とすのですが、なんと、落とした松明が周りを照らしてくれません。
?…なぜ?
ちょっと、わけが分かりません。

テーマ:Oblivion - ジャンル:ゲーム



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。