Wet and Cold SE

Modの紹介

雨や雪に関するイマーシヴな要素を追加するWet and Coldの紹介です。

雨や雪の時の表現が追加される

雪が積もっているような寒い地域に行くと、アクターの吐く息が白くなります。

雨に降られると水滴がポタポタと滴り落ちたり、地面がビチャビチャとぬかるんだりします。画像だとわかりづらいですが、実際はすごくきれいです。

水滴は川や海に入って出た時にも付きます。他にも雨が降り出すとNPCがフードを被ったり、屋内に引っ込んだりもします。没入感がすごく増すのでとてもオススメです。

頭上に見えない何かが現れる

この問題はバージョン2.3で修正されたようです。

困ったことに、雨が降り出すとアクターの頭上に見えない何かが表れ、ジャンプできなくなったり、矢や魔法が飛ばなくなってしまいます。以下の手順で修正しましたので説明します。

_wetpolling.pscのCastDetectSpell関数です。

4 (papyrus)

function CastDetectSpell()

    Shooter.MoveTo(targ as ObjectReference, 0.000000, 0.000000, 200.000, false)
    Detector.MoveTo(targ as ObjectReference, 0.000000, 0.000000, 1000.00, false)
    utility.Wait(0.250000)
    _WetShelterDetectSpell.Cast(Shooter, Detector)
    self.RegisterForSingleUpdate(8.00000)
endFunction

Shooterを200.000に、Detectorを1000.000に書き換えてコンパイルします。

これでジャンプしてもぶつからなくなり、矢が飛ぶようになりました。

Shooterは魔法の発射元、Detectorが魔法を受ける的です。Detectorは魔法を受けるためにコリジョンが設定されています。間に遮る何かがあると魔法が届かないので、屋根の下にいると判定するようです。

問題はDetectorがプレイヤーの足元から200の高さに置かれるので、低すぎてジャンプするとぶつかるということのようです。

ShooterとDetectorの位置を互いに入れ替えることで解決できます。Shooterにはコリジョンがないので、ジャンプしてもぶつからないということです。

足音の処理が壊れている?

雨が降っている間は足音を鳴らすスペルがかかるのですが、_wetfootwet.pscを読むと、結果的に一切何もすることのないスペルになっています。

やりたいことは、ActorがMuffledMovementというPerkを持っていたら何もしない、そうでなければ着地の際に足音を鳴らす、ということのようです。ただ、pexファイルのタイムスタンプがpscファイルより古いので、再コンパイルしなければ問題ないのかもしれません。

これを修正して、あと非常に些末な問題ですが、効率の悪いところを修正したコードを貼っておきます。

_wetfootwet.psc (papyrus)

Scriptname _WetFootWet extends activemagiceffect

ImpactDataSet FootImpact

_WetQuestScript Property _WetQuest Auto

Actor targ
Perk Property MuffledMovement Auto

;====================================================================================

Event OnEffectStart(Actor akTarget, Actor akCaster)
    if !akTarget
        return
    endif

    MuffledMovement = Game.GetFormFromFile(0x00058213, "Skyrim.esm") as Perk

    if akTarget.hasPerk(MuffledMovement)
        return
    endif

    targ = akTarget
    FootImpact = _WetQuest._WetFootWetSoundIPDS
    RegisterForAnimationEvent(targ, "FootLeft")
    RegisterForAnimationEvent(targ, "FootRight")
    If targ == _WetQuest.PlayerRef
        RegisterForAnimationEvent(targ, "JumpUp")
        RegisterForAnimationEvent(targ, "JumpDown")
        GoToState("Alive")
    Else
        GoToState("AliveNPC")
    EndIf
EndEvent

;====================================================================================

State Alive

    Event OnAnimationEvent(ObjectReference aktarg, String EventName)
        If EventName == "FootLeft"
            targ.PlayImpactEffect(FootImpact, "NPC L Calf [LClf]")
        ElseIf EventName == "FootRight"
            targ.PlayImpactEffect(FootImpact, "NPC R Calf [RClf]")
        Else
            targ.PlayImpactEffect(FootImpact, "NPC L Calf [LClf]")
            targ.PlayImpactEffect(FootImpact, "NPC R Calf [RClf]")
        EndIf
    EndEvent

    Event OnDying(Actor akKiller)
        GoToState("Dead")
    EndEvent

EndState

;====================================================================================

State AliveNPC

    Event OnAnimationEvent(ObjectReference aktarg, String EventName)
        If EventName == "FootLeft"
            targ.PlayImpactEffect(FootImpact, "NPC L Calf [LClf]")
        Else
            targ.PlayImpactEffect(FootImpact, "NPC R Calf [RClf]")
        EndIf
    EndEvent

    Event OnDying(Actor akKiller)
        GoToState("Dead")
    EndEvent

EndState

State Dead
EndState

起動時のデバッグログとエラーログを抑制する

完全にModder向けです。通常の利用ではまったく意味がないので不要です。

Modderはトレースログがとても重要なので、余計なログは邪魔になってしまいます。そこで抑制する方法です。

修正するのは_wetquestscript.pscになります。

Wet and Coldのエラー抑制 (papyrus)

function CheckCoSPlugins()

    ;if game.GetFormFromFile(3431, "Cloaks.esp")
    if game.GetModByName("Cloaks.esp") != 255
        self.SetCoSCloaks("Cloaks.esp")
    ;elseIf game.GetFormFromFile(3431, "Cloaks - No Imperial.esp")
    elseif game.GetModByName("Cloaks - No Imperial.esp") != 255
        self.SetCoSCloaks("Cloaks - No Imperial.esp")
    ;elseIf game.GetFormFromFile(3431, "Cloaks - Player Only.esp")
    elseif game.GetModByName("Cloaks - Player Only.esp") != 255
        self.SetCoSCloaks("Cloaks - Player Only.esp")
    else
        CoSInstalled = false
    endIf
endFunction

debug.traceの行はすべてコメントアウトすればいいです。

問題はGame.GetFormFromFile関数で、バニラで使えるのはこの関数なのですが、espファイルが見つからないと警告をログに出すので、これを警告が出ないSKSE版のGame.GetModByName関数に置き換えます。

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