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

DropTorchMOD
松明落しのMOD、完成しました。

http://www.4shared.com/zip/vCL74Ez0/DropTorchMOD_v103.html

■概要
松明を掲げている時に武器を構えるとその場に松明を落とすことで、落とした松明を照明として使るようにするMODです。
同じ機能のMODで「Drop Lit Torches in Combat」がありますが、これはヴァニラの松明に直接スクリプトを付けているため、ヴァニラの松明にスクリプトを付けない、負荷の軽い同じようなMODを作れないかと思い作りました。



「Tona's_ModsStore」のランプ二種類とランタン三種類に対応したヴァージョンも作りました。
ただし、そちらを使う場合注意が一点。

・tona's mods storeの二種類のランプは、当たり判定が小さいためか、たまに床をすり抜けて奈落の底へ落ちていってしまいます。
 作ってから気づいたのですが、これは元ファイルの問題なので対処が出来ません。
続きを読む
スポンサーサイト

テーマ: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 - ジャンル:ゲーム

松明、落とし始めました
松明を落とすというMODがあります。

・Drop Lit Torches in Combat
http://oblivion.nexusmods.com/mods/3429/
これは、松明を掲げている時に武器を構えるとその場に松明を落とすというMODで、落とした松明を照明として使えてなかなかいい感じのMODです。
(このMODはOOOにマージされています。)

・Drop Lit Torches Clean Ver1.2.2
http://www.4shared.com/file/32921767/60e8d5d2/Drop_Lit_Torches_Clean122.html?dirPwdVerified=32657ff4
(※見直したら、リンク切れになっていました。)
これも、松明を掲げている時に武器を構えるとその場に松明を落とすというMODで、製作者が日本人で、上のMODとは若干違う仕様になっているMODです。
…ですが、何が悪いのか分かりませんが、ちゃんと落としてくれません。このMODは自分の環境では使えませんでした。



で、ここからが本題で、今まで「Drop Lit Torches in Combat」を愛用していたのですが、一時的にこのMODを外した時に、軽くなったのに気づきました。
これは、プレイヤーの状態を監視するスクリプトをヴァニラの松明に直接スクリプトを付けているため、松明を沢山持っていればその分スクリプトが走り、その負荷で重くなっていたようです。

そこで、ヴァニラの松明にスクリプトを付けない、負荷の軽い同じようなMODを作れないかと思い、挑戦してみることにしました。
プレイヤーの状態を監視するスクリプトをクエストスクリプト一つにするだけでもだいぶ軽くなるはずです。
あと、時間経過で燃え尽きて消火される機能は実装しない予定です。
「GameMode」を使わなければその分軽くなるだろうし、個人的には落とした松明は全て戦闘後に拾っているため、要らない機能だからです。

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

ウィンドウモードのサイズ変更について
オブリビオンはフルスクリーンモードで起動すると、色々な問題が発生することがあります。
そこで、それを解決することが出来る「Oblivion Fullscreen」というMODがあります。
http://oblivion.nexusmods.com/mods/38800/

ちなみに正式名称は「Fake Fullscreen Mode Windowed - Alt Tab Fix」で、実行ファイルの名前が「Oblivion Fullscreen」です。


これは要するに、オブリビオンをウィンドウモードのままで無理やり画面を引き伸ばすことで擬似的にフルスクリーンにするというToolです。
一度このToolからオブリビオンを起動すれば、画面サイズは固定されます。
ウィンドウモードで起動すれば色んな問題が解消されるため、わりとお勧めです。
(フルスクリーンモードだと、環境によってはAlt+Tabを使って画面を切り替えると動かなくなる、日本語入力の時に日本語が表示されないなどの不具合が出たりします。)

しかし、これで起動した後、「Oblivion Fullscreen.exe」以外から起動すると、画面の下のほうが見切れてしまいます。
(「Oblivion Fullscreen」からだとウィンドウの上のバーが表示されないようになるけれど、それが表示されてしまうので、そのサイズ分)


ですが、実はウィンドウのサイズを変えるだけならば、「Oblivion.ini」の中の数値を変更するだけで実現可能です。
この中の「iSize」の数値をいじれば、デフォルトで用意されているサイズ以外に、自由に変更することが出来ます。
ただし、「Oblivion.ini」をいじってサイズを変更した場合は「Oblivion Fullscreen」を使って起動した場合と違ってウィンドウの上のバーと下のタスクバーが表示されたままになります。

一度「Oblivion Fullscreen」で起動した後だと、縦のサイズをちょっといじるだけなので簡単です。

いじる場所は以下の箇所です。


参考までに、Win7の自分の環境では以下の数値だとちょうどいい感じになります。
(「Oblivion Fullscreen」で起動後に、縦のサイズを-50しています。)
iSize W=1680 …横幅の定義
iSize H=990  …縦幅の定義


あと、多くの人はもう知っているでしょうが「Oblivion.ini」の場所は「Oblivion.exe」と同じ場所ではありません。
「C:\Users\[ユーザー名]\Documents\My Games\Oblivion」
の場所にあります。ここはセーブデータの在るところでもあります。

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



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