MCS extensionで起きる不具合について

こちらの画像をご覧頂きたい。

Oblivion_2011_0613_222645_00b.gif

…お分かり頂けただろうか?

(From2ch Livesのジャムさんに被写体になって頂きました、ごめんなさい!)

2011/6/15 追記
2011/6/20 追記
 

 
この現象は前から度々起きていたのですが「原因が不明」「対処方法も不明」ということで放置されいたのですが、今回有力な情報を頂きいろいろ試していた所、なんとなく発生条件がわかりました。

●発生条件と特徴

・WeaponOutバグが発生している状況で特定モーションへ移行しようとすると起こるっぽい?

●WeaponOutバグとは?

これは私が勝手にそう呼んでいるだけなのですが…

・NPCが戦闘状態ではない(IsInCombat==0)
・SetAlert 1は行っていない
→それなのに「武器を構えた状態」のまま戻らなくなる現象

このバグが起きている状態だと「SetAlert 0」しても武器を収めません。
MadCompanionshipSpellsやmpcでコンパニオンを連れて戦闘をしているとよく起きるので、見覚えがある方も多いかと思われます。

少し遠くにいる敵と戦闘しそうになったけど離れて戦闘しなかった時や、(スクリプト等で)戦闘を強制的に停止させたけどまだ近くに戦闘していた相手がいる場合などに起きやすい気がします。
上記画像は試しにプレイヤーと戦闘を行ってからStopCombatで停止させた後に起きた状況です。

このWeaponOutバグが起きている時に特定モーション(?)を再生しようとすると上記画像の状態が起きてしまうようです。
「特定モーション」というのは今のところよくわかっておらず、上記画像の場合は「寝ようとするモーション」を再生しようとした瞬間にこの現象が起きてしまった所です。
(右側にベッドが見えます)

●事前の対処策

ないんじゃ…(´Д`;

●事後の対処方法

いろいろやってみましたが…

×セーブしてロードする
×セーブして一度オブリを終了させて再起動してからロードする
×Update3Dする
×MCS extension.espを外してからセーブデータをロードしてみる

△PickIdleする(直らない場合もあって不確定)
△SetUnconscious 1で意識不明状態にして数フレーム放置してからSetUnconsciou 0で元に戻す
 (数フレームがどれくらいなのかがよくわからず不確定)

○Disableして次フレームは放置してその次フレームでEnableする

結局はお約束の↑コレが一番確実のようです。
ただコレをやるとアクターが画面から消えていなくなってから再び現れるので見た目が非常に不自然…
Enableした時にアクターのOnLoad処理が走ってしまうこともあり、あまり常用したくない方法ですがしょうがない(つД`;

…とか言ってますが、根本的な問題がありまして。

●そもそもこの「武器構え→解除の繰り返し現象」が発生中なのかを判定する方法は?

わかりません(´Д`;
「短時間でIsWeaponOut==1とIsWeaponOut==0を繰り返したらバグってると判定する」という単純な方法も思い付いたのですが、それだと「プレイヤーが武器を構える→解除をFキー連打でしていた場合にコンパニオンが追従して同じ動作をしていただけの場合でも誤認識してしまう」のでダメでした。



2011/6/15 追記

「MCS extension」を導入していない「MadCompanionshipSpells」単体の環境でも、この現象が発生することを確認できました。
根本的な原因はオブリ内部の奇妙な挙動(私が「WeaponOutバグ」と勝手に呼んでいるもの)にあると思われることや、CTDのように致命的なエラーを起こすわけでもないことを考慮し、一旦この現象への対策をあきらめようと思います(´・ω・`)

でも引き続き防止策や対処方法のアドバイス等はお待ちしております!



2011/6/20 追記

この現象が起きている状態なのかを判定する方法を思い付きました!
コンパニオンが「Equip/Unequipアニメ」を再生中なのかを監視して再生中であれば再生秒数を累積します。
5秒間の累積で「Equip/Unequipアニメの再生時間が3秒以上を占めていたら「WeaponOutピクピク現象が発生中」と判定し「Disable→Enableによる修復処理を行う」ようにしました。
(Follow状態でプレイヤーの武器構えに連動して武器を構えていた場合にはタイマーをリセット)
これにより「Fix WeaponOut Bug」とは別の独立した方法で修復が可能になりました。
(次バージョンのv1.13にて搭載予定)

これまでの「Fix WeaponOut Bug」をOnにして事前に対処するという方法だと、ダンジョンなどの閉所でやや近くに敵がいる場合に「修復→WeaponOut状態→修復→WeaponOut状態…」を延々と繰り返してしまうことがあり、実用性が疑問視されていました(´Д`;
スポンサーサイト

コメント

非公開コメント

No title

>もそもこの「武器構え→解除の繰り返し現象」が発生中なのかを判定する方法は?
構えてると言うことは戦闘状態のAIが走ってって、
構えていない場合は非戦闘状態のAIが走ってると想定すると、
OBSEのGetCurrentPackageProcedure で今の状態拾えないかな・・・

コメントありがとうございます

imaさんコメントありがとうございます。

OBSEv0020の「GetCurrentPackageProcedure」は、Vanillaの「GetCurrentAIProcedure」の戻り値が文字列になったものではないんですかね…?
あ、でもPackageとAIで違うのかな…
Package=AIの集合体と思っていたけど違うのかな…
うおおおおおおお!頭が混乱してきました (´Д`;

GetCurrentPackageProcedure

WeaponOutバグが発生している状態のNPCに対して「GetCurrentPackageProcedure」を試してみました。

AIPackageがFollow → TRAVEL
AIPackageがFollowで戦闘中 → TRAVEL
AIPackageがSleep → WANDER
AIPackageがSleepで寝ている最中 → WANDER

となり、この関数がどういう働き?をしていて、どう実用すべきかはわかりませんでした…

No title

>AIPackageがFollow → TRAVEL
>AIPackageがFollowで戦闘中 → TRAVEL
>AIPackageがSleep → WANDER
>AIPackageがSleepで寝ている最中 → WANDER
>となり、この関数がどういう働き?をしていて、どう実用すべきかはわかりませんでした…
正常な時はどうでしょう?
正常なとき
Follow→Follow
Sleep→Sleep
なら、それで異常と検出できませんか?
少なくともFollowで戦闘中なのにTRAVELとかおかしな形がでているので

コメントありがとうございます

imaさんコメントありがとうございます。

平常時でも
PackageTypeが「Follow」なのにGetCurrentPackageProcedureの戻り値は「TRAVEL」
PackageTypeが「Wander」なのにGetCurrentPackageProcedureの戻り値は「TRAVEL」
という異常値(?)が帰ってくるので、判定できない状況です (´・ω・`)

前回の繰り返しになってしまいますが、この「GetCurrentPackageProcedure」関数が何をどう判定をしてこの戻り値を選んでいるのかがよくわかりません…
プロフィール

r_basilico

バジリコ風味 (r_basilico)
Twitter: r_basilico
Steam: r_basilico
艦これ: 嫁艦は祥鳳

リンク
最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム