拘束してみたの続きになります。
Buxom Wench Yuriana -Tank Healer Support Follower- and Captured Wenches Quests
YurianaというWenchにまつわるクエストModになります。
このModは規模が大きく、各地のダンジョンに拘束具が設置されたりします。せっかくなのでこれらを有効的に使えないかと思い、作ってみました。
装備や道具といったものは、元々は別のModとして配布されているものを同梱して使っているようです。
拘束具を使わせる
拘束具は家具になります。仕組みは砥石や錬金台と同じです。プレイヤーがアクティベートしても使えます。家具をNPCに使わせればいいわけです。そのためのPackageを用意して適用します。
PackageのProcedureとしてはSandboxとSitTargetがあります。
Sandboxは周囲の家具をランダムに使うので今回のケースでは向いておらず、またBuxom Wench Yurianaの拘束具はSandboxでは無視する設定がなされているため、使えません。
SitTargetは家具を指定することでその家具を確実に使わせることができます。椅子に座らせる意味で名前がついているようですが、家具全般で使用できます。
Buxom Wench Yurianaに汎用的に使えるYW_GENERIC_EnslavedWench_usefurnitureというPackageがありますので、これをそのまま使います。
拘束具を取得する
FindClosestReferenceOfAnyTypeInListFromRef関数で検索します。
ObjectReference kDeviceRef = Game.FindClosestReferenceOfAnyTypeInListFromRef(eqListDevice, akTargetRef, 2000.0)
if !kDeviceRef
Debug.Notification("Device not found")
return
endif
if kDeviceRef.IsFurnitureInUse()
Debug.Notification(kDeviceRef.GetDisplayName() + " is in use")
return
endif
あらかじめ拘束具の一覧をeqListDeviceというFormListに入れておきます。
もっとも近くにある拘束具を検索するようにしました。
拘束具が見つからなかった場合と、見つかっても使用中であった場合は中断します。
2番目に近い拘束具を探すのは面倒なので妥協しました。
標的に拘束具をリンクさせる
SitTargetは対象となる家具の指定が必要です。YW_GENERIC_EnslavedWench_usefurnitureでは家具の指定にLinkedRefが設定されています。
Buxom Wench YurianaではCellにActorを配置して、そのActorに拘束具をリンクさせてあります。ですのでPackageが適用されている間はその拘束具に座り続けるわけです。
任意のActorにリンクさせるにはpowerofthree’s Papyrus ExtenderのSetLinkedRef関数を使います。
PO3_SKSEFunctions.SetLinkedRef(akTargetRef, kDeviceRef)
Packageを取得する
プラグインを参照してもいいのですが、マスター指定を増やすのが面倒だったので、スクリプトで取得しました。
Package YW_GENERIC_EnslavedWench_usefurniture = Game.GetFormFromFile(0xB149B2, "YurianaWench.esp") as Package
Packageを割り当てる
PapyrusUtil SEのActorUtilにAddPackageOverrideという関数があります。ActorにたいしてPackageを割り当てるものです。優先度を100として最優先にしました。
Debug.SendAnimationEvent(akTargetRef, "IdleChairExitStart")
(akTargetRef as Actor).SetRestrained(false)
Utility.Wait(2.0)
ActorUtil.AddPackageOverride(akTargetRef as Actor, YW_GENERIC_EnslavedWench_usefurniture, 100)
割り当てると座るので、その前に拘束中(その場で後ろに手を縛られ座っている状態)の処理を解除しています。
2秒の待機時間をいれていますが、Packageは放っておいてもそのまま実行されつづけるので、そのうち拘束具に座ってくれます。
拘束具から解放する
割り当てたPackageを解除すれば本来のPackageに戻るため、自動的に拘束具から立ち上がります。
Package YW_GENERIC_EnslavedWench_usefurniture = Game.GetFormFromFile(0xB149B2, "YurianaWench.esp") as Package
if (akTargetRef as Actor).GetCurrentPackage() == YW_GENERIC_EnslavedWench_usefurniture
ActorUtil.RemovePackageOverride(akTargetRef as Actor, YW_GENERIC_EnslavedWench_usefurniture)
endif
念のため、現在実行中のPackageを確認した上で解除しています。