雨や雪の時の表現が追加される
雪が積もっているような寒い地域に行くと、アクターの吐く息が白くなります。
雨に降られると水滴がポタポタと滴り落ちたり、地面がビチャビチャとぬかるんだりします。画像だとわかりづらいですが、実際はすごくきれいです。
水滴は川や海に入って出た時にも付きます。他にも雨が降り出すと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関数に置き換えます。