Simple Horse SEを改造しよう

Modを作ろう

Simple Horse SEは馬を拡張するModです。呼び出しキーを押すと馬がどこからともなくやってきます。フォロワーの分もやってきます。名前の通りシンプルですが、シンプルすぎて困るところもあるので、機能を追加します。

Simple Horse SEは馬を拡張するModです。呼び出しキーを押すと馬がどこからともなくやってきます。フォロワーの分もやってきます。

名前の通りシンプルですが、シンプルすぎて困るところもあるので、機能を追加します。

馬を送り返す

呼び出した時に馬が後ろから来てプレイヤーを押しのけるのが嫌なので、直ちにプレイヤーの目の前に来るようにします。そして、戦闘中に馬が殺されてしまうことがあるので、もう一度呼び出しキーを押したら送還(どこかに消えてもらう)できるようにします。

スクリプトはBSA内にあるので展開しておきます。手を加えるのはaaasimplehorsecallscript.pscです。

まず、プロパティを追加します。CKで紐づけするのを忘れないように。Autoで補完されます。死体安置所にあるマーカーです。詳しいことは「おばちゃんのスカイリム」で検索するとわかります。

Simple Horse SE 1 (papyrus)

ObjectReference Property WIDeadBodyCleanupCellMarker Auto

関数を追加します。引数に指定したものをプレイヤーの目の前に移動します。ただし、最終的な座標はゲームエンジンがNavMesh等を考慮して決定するので、多少位置がずれます。

Simple Horse SE 2 (papyrus)

Function MoveToFrontPlayer(ObjectReference akTarget)
    float angle = Player.GetAngleZ()
    float xoffset = 100.0 * math.sin(angle)
    float yoffset = 100.0 * math.cos(angle)
    akTarget.MoveTo(Player, xoffset, yoffset, abMatchRotation = true)
EndFunction

OnEffectStart関数を書き換えます。馬が十分に近いなら送還、そうでないなら召喚です。

Simple Horse SE 3 (papyrus)

Event OnEffectStart(Actor akTarget, Actor akCaster)
    ; (中略)

    if CurrentHorse.GetDistance(Player) <= 500.0
        ; 送還
        CurrentHorse.MoveTo(aaaHorseHomePoint)
        return
    elseif !Player.HasLOS(CurrentHorse)
        ; 召喚
        if CurrentHorse.GetDistance(Player) >= 1000.0
            ;MovetoBehindPlayer()
            MoveToFrontPlayer(CurrentHorse)
        endif
        ;MoveMarker()
        MoveToFrontPlayer(HorsePosition)
    else
        ; 召喚
        ;HorsePosition.MoveTo(player)
        MoveToFrontPlayer(HorsePosition)
    endif

これで、戦闘中にいつの間にか馬が死んでいるということもなくなるでしょう。目の前が崖だと召喚直後に落っこちていくので気を付けてください。

いきなり出たり消えたりするのがアレなら、Alphaを設定してフェードイン、フェードアウトさせてもいいですね。

遊んでいる時に間違えて騎乗中に送還キーを押してしまったのですが、ただちに馬が消えて地面に着地しました。普通に降りるよりも動作が早く、即戦闘にも入れるし、これはいい発見でした。

送還先をLeaf Rest SSEの馬小屋に変更して使ってみました。自宅に馬が待機するようになるのですごくいいです。馬小屋にマーカーを設置してそれを指定する形でもいいのですが、Simple Horse側でマーカーを用意しておき、スペルかMCMでプレイヤーの足元にマーカーを移動できるようにすれば、さらに使い勝手が向上します。

フォロワーへの指示

Simple Horseはフォロワーへ指示するタイミングを、以下のアニメーションイベントで検知しています。

  • SoundPlay.NPCHorseMount
  • SoundPlay.NPCHorseDismount

プレイヤーが馬に乗る際はどうやらSoundPlay.NPCHorseMountイベントが必ず発火するようなので、これは問題ないように思います。

それに対して、降りる際のSoundPlay.NPCHorseDismountイベントは状況によっては発火しないので、フォロワーが馬に乗りっぱなしになってしまうことがあるようです。

  • プレイヤーが降りる操作をしたが、何らかの理由で降りるアニメーションが再生されなかった。(しばらくすると救済措置か何かで宙に放り出されるので降りられます)
  • 馬が攻撃されて死んだ。(ラグドール状態になって起き上がります)
  • 馬がMoveToでどこかに飛ばされた。(このページで解説している送還を騎乗中に行うと起こります)

対策としては、アニメーションイベントのかわりにカメライベントを使うといいようです。10がhorse、つまり騎乗カメラなので、10へ移行したら馬に乗った、10から他へ移行したら馬から降りた、ということになります。

タイトルとURLをコピーしました