2016年3月13日日曜日

Floating Menu & Ballon Widget

詳しい説明は時間が出来たときに書きます。
とりあえず簡単な説明だけ。

(2016/03/21)
SWF側に機能を追加しました。
 ・SWFからPapyrus関数やイベントを呼び出せるようになりました。(ただし戻り値取得は不可)
 ・SWFに音を鳴らす機能を付けました。
 ・SWFでキー入力を拾えるようにしました。

使用方法は・・・使用例(BalloonWidget)を見て悟ってください。



FloatingMenu

「フローティングメニュー」を追加するMOD。
アクターやオブジェクトの位置にウィジェットを表示できるようになります。

※ ただし、これ単体では何の役にも立ちません。


要skse 1.7.3以上、SkyUIは不要

(MODのダウンロード)
https://drive.google.com/open?id=0B6YyKRZ4dV_2MnJ3VTVEblJYMkU


BalloonWidget

FloatingMenuの使用例です。
アクターが喋ったときに、頭上に吹き出しウィジェット表示します。

(MODのダウンロード)
https://drive.google.com/open?id=0B6YyKRZ4dV_2R003V0JRRmJFSWc


見た目はこんな感じ。
https://twitter.com/himika/status/693827749689995265





Floating MenuとBallon Widgetで使っているdllとswfのソースファイル
https://drive.google.com/open?id=0B6YyKRZ4dV_2MVI3b05mQkxTSFk





 まだ作ってる最中なので、バグ多いです。API等の仕様も変わると思うのでご了承ください。
あと、飽きたら唐突に終わると思います。終わったらゴメンナサイ。

SkyUIではHUD Menu上にウィジェットを追加していますが、こちらはFloating Menuという名前の新規メニューを作り、そこにウィジェットを追加します。HUD Menuとは「完全に別」なので、HUD Menu上のコンパスや各種バー、SkyUIのウィジェットとは干渉しません。






ウィジェットを自作する方へ。
ものすごくハマりそうなポイント。

(1)
セーブ&ロードやエリア移動などでローディング画面を挟むと、自動でウィジェットのswfをロード・アンロードする仕様になっています。
(その際、パピルススクリプトに OnWidgetRemoved と OnWidgetLoaded を飛ばします)

swf側ではデータを保存しておくことができないため、再ロードによって真っ白の状態に戻ります。
swfの表示に必要なデータはパピルス側で変数に保存しておき、OnWidgetLoadedイベントを受け取ったら、データを再送信してください。


(2)
FloatingWidget.Destroy() でウィジェットを削除しても、削除したFloatingWidget上でスクリプトが動いている間は、メモリ上に残り続けます。ただし、スクリプトのselfはウィジェットをくっつけたObjectReferenceから完全に切り離されてNoneになります。
削除後のselfを主体にした呼び出し(例えばself.GetPositionX()など)は全てエラーが出るので注意してください。


(3)
FloatingWidgetManager.GetWidget() 関数は、最初に見つけたFloatingWidgetを返します。
同じオブジェクト/アクターに複数のFloatingWidgetがくっついていた場合は、最初に見つけたものしか取得できませんので、注意してください。


(4)
FloatingWidgetでは、RegisterForUpdate系の関数やイベントを使わないほうが良いです。

ひとつのアクターに複数のスクリプトがついている場合、発生するイベントはスクリプト同士で干渉します。(これはパピルス自体の仕様なので、どうしようもないです)
たとえば、FloatingWidgetでOnUpdateイベントが発生すると、他のスクリプトにもOnUpdateイベントが発生しますし、さらには、UnregisterFor~()でイベントを止めると、他のスクリプトのイベントも止まります。
ユニークなアクターには、たいていの場合、死後に死体を消すためのスクリプトWIDeadBodyCleanupScript がついています。またAIパッケージで後からスクリプトがくっつくこともあります。例えばNPCが何か物をはこぶ際はCarryActorScriptが付きます。場合によっては、
同じアクターに複数のFloatingWidgetを貼り付けることもあるでしょう。

これらすべてで干渉するため、安易にRegisterFor~()を使うと思わぬ誤動作の原因になります。

回避策ですが、ReferenceAliasやActiveMagicEffectなら、くっついた先のObjectReferenceやActorと干渉しません。同じActorにくっついたReferenceAlias同士で干渉することもありませんので、RegisterFor~系の関数はReferenceAliasやActiveMagicEffectをつけて、そちらで使うのが良いと思います。

余談ですが、ReferenceAliasには別の問題が存在します。
ReferenceAliasをアクターにくっつけると必ずEvaluatePackage()が発生し、AIパッケージが再計算されるのですが、アクターの行動中にEvaluatePackage()がおきると、実行中の行動に支障が生じて中断されることがあります。
それがストーリーイベントの重要なシーンだったりすると、 最悪の場合、そのままクエストが進行不能になる危険性があります。

2016年2月28日日曜日

Quick Loot ver.1.1f


Quick Loot ver.1.1f
 http://www.nexusmods.com/skyrim/mods/73096/


CTDの原因を特定できたため、 1.1fで修正を行いました。
(無効化したMODの残骸がコンテナに残っていると、クラッシュしていたようです)


なにこれ?


SkyrimにFallout 4風のルートメニューを追加するMODです。
宝箱や死体からアイテムを拾う際に、いちいちインベントリメニューを開かなくてもアイテムを拾えるようになります。



必要要件


Skyrim 1.9.32
SKSE 1.7.1 以上 (http://skse.silverlock.org/)


インストール方法


圧縮ファイルを解凍して、Skyrimのインストール先Skyrim\Data にコピーしてください。

アンインストールは、ファイルを削除するだけでOKです。
セーブファイルを一切よごさないので、削除してもゲームへの影響は一切ありません。
気軽に試して頂けると嬉しいです。


操作方法


【キーボード】
 マウスホイール上下でアイテム選択、[E]キーで取得、[R]で調べる
【コントローラー】
 方向キー上下でアイテム選択、(A)ボタンで取得、(X)ボタンで調べる

武器を構える/しまうボタン長押しで、QuickLootを一時停止・再開することが出来ます。


現在判明してる不具合


大量のアイテムが入ったコンテナを表示すると、たまにクラッシュする。(環境によっては確定クラッシュ?)
アイテム自動整理スクリプトなどが付いているコンテナでCTDすることがある。
キリル文字(ロシア語)が文字化けする。(修正できたと思うのですが、動作報告がなくて・・・)

更新履歴


2016/02/22 (ver.1.1f)
    ・一部の拾えない光源アイテム(たいまつなど)が拾えてしまうバグを修正。
    ・無効化したMODの残骸が原因でCTDするバグを修正。
2016/02/22 (ver.1.1e)
    ・[R]キー長押しでQuickLootをON/OFFする機能を追加。
    ・ナミラの食人とBetterVampiresの死体吸血に対応。
2016/02/20 (ver.1.1d)
    ・大量のアイテム~CTD、減るといいな・・・
    ・設定にbDisableLootSingleを追加。「SHIFT押してないのに1つずつしか拾えない…」みたいなトラブルが発生したら1にしてください。
2016/02/17 (ver.1.1c)
    ・大量のアイテムが入ってる場合に表示しないオプション(iItemLimit)を追加。
    ・一部の宝箱で、お金の数が通常より増えることがある不具合の修正。
    ・アイテム並べ替えを高速化し、無駄な処理を削りました。
2016/02/14 (ver.1.1b)
    ・よく拾うアイテム(お金・ロックピックなど)が上にくるようにしました。
    ・HDT HighHeels Systemとの互換性を改善。
    ・キルムーブ中にメニューが表示される不具合を修正。
    ・複数スタックしたアイテムから1つだけ拾えるようにしました。SHIFTキーを押しながら拾ってください。
2016/02/07 (ver.1.1)
    ・エンチャント付き装備や既読本にアイコンが付きました。
    ・INIファイルでメニュー位置や表示条件を設定できるようにしました。
    ・専用のコンソールコマンドを追加。上記設定をゲームプレイ中に変更できます。
    ・キリル文字やアクセント記号などの西欧文字が文字化けしていた問題を修正しました。
    ・本来拾えないはずのアイテムを、ある条件下で拾えてしまった問題の修正。
    ・コントローラーのキーマップを変更し、方向キー上・下を別のコマンドに置き換えている場合、アイテムを選択できなくなる不具合の修正。(1.0できちんと修正できてなかった)
    ・一人称化MODを使ってる場合、クラフト中にクロスヘアが動いてルートメニューが開くことがある不具合の修正(これも不十分だった)
     ・死亡時にメニューが残ってしまう問題の修正。
2016/02/01 (ver.1.0)
    ・hdt Physics Extensions が動かなくなる不具合の修正。
    ・コントローラーのキーマップを変更し、方向キー上・下を別のコマンドに置き換えている場合に、アイテムを選択できなくなる不具合の修正。
    ・一人称化MODを使ってる場合、クラフト中にクロスヘアが動いてルートメニューが開くことがある不具合の修正。
    ・インベントリメニュー操作中にマウスカーソルが消えることがある不具合の修正。
2016/01/27 (ver.1.0 rc5)
    ・灰の山(死霊術などで灰になった死体)でもルートメニューが表示されるようにしました。
    ・クエストが紐付いた宝箱などで、きちんとアイテムを拾えなかった不具合を修正。
2016/01/24 (ver.1.0 rc4)
    ・スタック数が間違っていたり、表示されないアイテムがあった不具合を修正。
    ・長いロード画面を挟むと、アイテム一覧が不可視になっていた不具合を修正。
2016/01/21 (ver.1.0 rc3)
    ・このバージョン以降、esp無しで動きます
    ・ウェアウルフ状態で死体からアイテムを拾える不具合を修正
    ・(実験的) 空コンテナでもメニューが開くように
2016/01/15 (ver.1.0 rc2)
    ・プレイヤーが利用できないアイテムを拾えた不具合を修正
    ・稀にアイテムの個数がおかしくなる不具合を修正
    ・フォロワー指示中や死体運搬中に、メニューが開かないよう修正
    ・(実験的) メニューのデザインをFO4寄りに
    ・(実験的) 空のコンテナではメニューが開かない&空になったら自動で閉じるように


Credits


Hackfield for dialogue style interface.
SKSE Team for SKSE.
SkyUI Team for resources to make swf file.
Bethesda for Skyrim.