最終更新:ID:BTE/slQlEA 2019年07月06日(土) 23:17:22履歴
- Modder向け SexLab Tips & Tricks
- はじめに
- とりあえずSexする
- もうちょっと真面目にSexする
- アニメーションの構築方法
- アニメーションのタグの話(嘘あるかも)
- ActorがSex中かどうか
- ベッド探す
- SSLの「ベッド」の取り扱い
- 適当に相手を探す
- Arousal値 (SSLの機能ではないが、細かいことは気にしない)
- 精液関係
- アニメーション実行できるクリーチャーかどうか
- アニメーションを制御するsslThreadController
- sslThreadController活用法・(何かあったら)Sex止める
- 特定のSSL Eventに割り込み処理を入れる
- 全てのSSL Eventに割り込み処理を入れる
- SSLアニメ中に死んだActorが固まったりするのを防止する
- SSLのアニメで脱がせない
- SSL自身の設定値を取得する
- アニメーションに設定されているSOSの角度の取得と反映
- CK上で日本語で開発を進める(クエストとか、ダイアログとか)
- リンク
- その他
既にModを作ったことがある人向けの内容で、知識共有を目的としています。記述もそういった人向けです。これを書けばOKではなく、実装の出発点になることを目的としています。
うそ、おおげさ、まぎらわしい部分、またより良い方法があればぜひ修正してください。記述は1.62のものです。1.61では機能しないものもあるかもしれませんが調べるのはめんどいので1.62を使ってください。
SexLabFramework.pscをSexLabとします。ファイル名.関数名()という記述を使います。オブジェクト名.関数名()という記述も使います。
LLのWikiはAshal氏が何回直しても落ちてしまうので、詳細はSexLabのソースを直接読みましょう。関数名の前に説明が書いてあります。Sourceフォルダで"grep function *"とかしておくと楽しいです。
網羅するつもりは全くなく、SexLab.GetGender()とか特に説明が必要なく有名なものは省きます。
ぜひ勝手に追加&修正してください。
この文書に書いてある知識はSexLabのソースはもとより、LoversLabのフォーラムやBBSPinkのスレッドの投稿、両者で公開されているModのコードなどから得たものです。
全てのModderに感謝するとともに、この文書が新たなModder誕生に役立つことを願います。
めんどい時はSexLab.QuickStart()。Actor[]を作らなくて済む。
sslThreadController function QuickStart(Actor Actor1, Actor Actor2 = none, Actor Actor3 = none, Actor Actor4 = none, Actor Actor5 = none, Actor Victim = none, string Hook = "", string AnimationTags = "")
QuickStart()はほとんどデフォルト値を持っているので、SSLを使う最小コードは下記になる。
SexLab.QuickStart(Game.GetPlayer())
SexLabのプロパティをCKで間違いなく指定できれば上記だけでPCがオナニーする。
QuickStart()だけを使った簡単なModの実例は下記。
普通の時はSexLab.StartSex()。基本。
int function StartSex(Actor[] Positions, sslBaseAnimation[] Anims, Actor Victim = none, ObjectReference CenterOn = none, bool AllowBed = true, string Hook = "")
以下はより細かく設定したい時。前戯なしとか。
SexLabFramework.pscにあるStartSex()のコードを参照。例えば次みたいな感じで作る。
int Function QuickSex(Actor[] Positions, sslBaseAnimation[] Anims, Actor Victim = None, Actor CenterOn = None) ; 脱衣スロットの前準備 bool[] stripoverwrite = new bool[33] int i = 0 while (i != 33) stripoverwrite[i] = false ; trueなら脱衣 i += 1 endwhile sslThreadModel Thread = SexLab.NewThread() if !Thread return -1 elseIf !Thread.AddActors(Positions, Victim) return -1 endIf ; ここらへんから設定・もちろんどれかだけ指定が可能 Thread.SetAnimations(Anims) Thread.DisableBedUse(true) ; ベッド使わない Thread.DisableLeadIn() ; 前戯なし Thread.CenterOnObject(CenterOn) Thread.SetStrip(Positions[0], stripoverwrite) ; 脱衣させない Thread.SetStrip(Positions[1], stripoverwrite) ; 脱衣させない Thread.DisableUndressAnimation() ; 脱衣アニメしない Thread.DisableRedress() ; 再着衣させない Thread.DisableRagdollEnd() ; ラグドールエンドさせない if Thread.StartThread() return Thread.tid endIf return -1 EndFunction
SexLab.StartSex()とかに渡すsslBaseAnimation[]の話。
直打ちで、
sslBaseAnimation[] anims anims = SexLab.GetAnimationsByTags(2, "mf,kissing", "sex")
こうやって用意するのもいいけど、3Pとか4Pとかゲイとかレズとか考えるとifelseの嵐になるので、同じコードはこう書ける。
sslBaseAnimation[] anims string tag = SexLab.MakeAnimationGenderTag(sexActors) tag += ",kissing" anims = SexLab.GetAnimationsByTags(sexActors.Length, tag, "sex")
sexActorsが"MM","FF"の時、tagがそうなるので、それが嫌な場合はコードを足すこと。
- "MF"と"fm"に違いはない
- アニメ作者が"MF"とか指定していても、SSLのほうで登録時に勝手に(アニメの設定ファイルを元に)"fm"をつける
- "fccc"とかも同じ
↓はDefeat作者もおすすめしてる方法。Form.HasKeywordString()はSKSEの関数なので、SSL以外で使用する場合は注意。
Actor.HasKeyWordString("SexLabActive")
CKのConditionでも使えるやつ。(と思ったけど、上のもStringじゃなくてKeywordなら使える)
Actor.IsInFaction(SexLabAnimatingFaction)
他にもSexLab.IsActorActive()(IsInFaction()とやってること同じ)とか、SexLab.IsValidActor()とかSexLab.ValidateActor()とかいろいろ。詳細はsslActorLibrary.pscとかに。
とりあえずHasKeyWordString()のを使っておけば間違いない。
SexLab.FindBed()
ObjectReference function FindBed(ObjectReference CenterRef, float Radius = 1000.0, bool IgnoreUsed = true, ObjectReference IgnoreRef1 = none, ObjectReference IgnoreRef2 = none)
- SexLabBedsというFormListで管理されてる
- 追加するにはそこにFurnitureを突っ込む
- BedrollやDoubleBedはその後に、更にSexLabBedRollsとかのFormListに突っ込むと、Bedrollとかの判定になる
- 1.62ではSexLab.AddCustomBed()ができた。SexLab.SetCustomBedOffset()とかもある。
- ベッドのオフセットは「前、横、上、回転」。デフォルトは「30, 0, 37, 0」。ベッドロールは「30, 0, 0, 0」。
SexLab.FindAvailableActor()
Actor function FindAvailableActor(ObjectReference CenterRef, float Radius = 5000.0, int FindGender = -1, Actor IgnoreRef1 = none, Actor IgnoreRef2 = none, Actor IgnoreRef3 = none, Actor IgnoreRef4 = none)
クリーチャー用とかの別の関数もあるよ。
マスター指定がいらない取り方もあるが(思い違いで、なかったかも)、まあもう必要ないでしょう。
Actor.GetFactionRank(sla_Arousal)
SexLabFramework.pscのここらへん。
function AddCum(Actor ActorRef, bool Vaginal = true, bool Oral = true, bool Anal = true) function ClearCum(Actor ActorRef) int function CountCum(Actor ActorRef, bool Vaginal = true, bool Oral = true, bool Anal = true) int function CountCumVaginal(Actor ActorRef) int function CountCumOral(Actor ActorRef) int function CountCumAnal(Actor ActorRef)
今選択しているアニメーションの射精位置を取得して受け側に精液つけるのは下記な感じ(本当はSexLabがしていること)
int cumid = controller.Animation.GetCum(0) SexLab.ActorLib.ApplyCum(controller.Positions[0], cumid)
ApplyCumは(DEPRECATED)で使うんじゃねえって言われてるんだけど、こういう用途ではこっちのが楽。
事前にActorTypeNPC使って人型は弾いた上で下みたいにする。要するに、SexLab.ValidateActorの実体のActorLib.ValidateActor(sslActorLibrary.psc)からクリーチャー部分を抜き出したもの。
int Function ValidateCreature(Actor ActorRef) ; from ActorLib.ValidateActor ActorBase BaseRef = ActorRef.GetLeveledActorBase() if !SexLab.Config.AllowCreatures return -17 elseIf !sslCreatureAnimationSlots.HasCreatureType(ActorRef) return -18 elseIf !SexLab.CreatureSlots.HasAnimation(BaseRef.GetRace(), SexLab.GetGender(ActorRef)) return -19 endIf return 1 EndFunction
素のValidateActorは試した限りではFormListFindとFormListAddのせいでうまく判定できなかった。正しい仕様がわからないので何とも言えない。
SexLab自身が持っているSpace押すと次のステージとか、Shift+Spaceで前のステージとか、そういう制御をするにはsslThreadControllerを使う。
SSLは15本スレッドを持ってるんで、スレッドIDを指定して、
sslThreadController controller = SexLab.GetController(tid)
ゲットする。tidはStartSex()の返り値とか、↓のEventで勝手に入るtidとかで使われてる。
あとSSLが走っているActorからも、
sslThreadController controller = SexLab.GetActorController(Actor)
でsslThreadControllerをゲットできる。QuickStart()のほうの返り値もsslThreadController。
sslThreadControllerにはいろいろな機能があって、例えば、
sslThreadController controller = SexLab.GetActorController(Actor) Actor aggr = controller.Positions[1] ; => Actorを取得できる int stagecnt = controller.Animation.StageCount ; => アニメのステージ数を取得できる controller.Stage ; => 現在のステージを取得できる controller.GoToStage(stagecnt - 2) ; => 任意のステージに変更できる controller.ChangeAnimation() ; => アニメを変更できる。いわゆる「O」キー ; controller.EndAnimation() ; => アニメを終了
とかとか。
ReferenceAliasに以下のようなスクリプトをくっつける。かなりはしょったコード。
このコードではOnHit()なので、攻撃を受けたら中止する。
応用すると、敵を発見して戦闘状態になったら(赤丸状態の敵)Sex中止とかもできる。
試作した山賊さんの夜の営みModでは、見つかりまくってSexが見れないという本末転倒になった。
隠密プレイなら楽しいかもしれないと、Sex中は発見率を下げて……とかやってるうちにお蔵入り。
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, Bool abPowerAttack, Bool abSneakAttack, Bool abBashAttack, Bool abHitBlocked) Actor selfact = self.GetActorRef() if selfact.HasKeyWordString("SexLabActive") sslThreadController controller = SexLab.GetActorController(selfact) controller.EndAnimation() endif EndEvent
要するにこのStartSexしたSexが終わったら(はじまったら、ステージが変わったら、絶頂に達したら、とか色々可能)〜〜したいという時。
TrackActor()でもできるはず。TrackActorのほうは指定できるフックが「Added / Start / Orgasm / End」の4種類。特定のActorに対して、このEvent時にCallbackを起動する。
Hookの方はあげるのが面倒なほどたくさんあるので、SexLabFramework.pscの"HOOK"のところを参照のこと。
Function Something(Actor act) SexLab.QuickStart(act, Hook="SomethingHookName") RegisterForModEvent("HookAnimationEnd_SomethingHookName", "EndSexEventSomethingHookName") EndFunction Event EndSexEventSomethingHookName(int tid, bool HasPlayer) sslThreadController controller = SexLab.GetController(tid) ; dosomething() EndEvent
他のModで発生するすべてのSSLのアニメに割り込みを入れる時に使う。
以下はコードの例。常時立ち上げのQuestのスクリプトにすること。
Event OnInit() RegisterForModEvent("HookOrgasmEnd", "SSLSomethingPluginOrgasmEnd") EndEvent Event SSLSomethingPluginOrgasmEnd(int tid, bool hasPlayer) ; 引数はこのまま sslThreadController controller = SexLab.GetController(tid) ; dosomething() EndEvent
アニメーション中に死ぬとおかしくなるやつ。死んでるのに足踏みしてたり、空中で固定されていたり。
多分誰でも一度は遭遇していると思う。
ReferenceAliasに以下のスクリプトをくっつける。
Event OnDying(Actor akKiller) ObjectReference wobj = self.GetActorRef() as ObjectReference wobj.SetPosition(wobj.GetPositionX(), wobj.GetPositionY() + 10.0, wobj.GetPositionZ()) debug.sendAnimationEvent(wobj, "ragdoll") EndEvent
SexLab.Configで取れる。変数名はsslConfigMenu.pscをgrepすれば何となく。後はMCMのtranslationファイル見てもヒントがあるかも。
SexLab.Config.AutoAdvance SexLab.Config.DisablePlayer SexLab.Config.StageTimerAggr[4]
何らかの理由でSOSがふにゃった状態で出現してしまった場合は、アニメーションからSOSの角度の設定を取得して反映して直す。
act ; 対象Actor controller ; sslThreadController position ; contoller.Positions中のactのindex ; の時 sslBaseAnimation anim = controller.Animation int sosbend = anim.GetSchlong(controller.AdjustKey, position, controller.Stage) debug.SendAnimationEvent(act, "SOSBend"+sosbend) ; ちなみに debug.SendAnimationEvent(act, "SOSFastErect") だと元気いっぱいの角度になる
SSLとは全く関係ない。
クエストModとか複雑に入り組んだダイアログとかで、CK上で英語で入力→xTranslatorで翻訳を通す、がやってられない時に。
CK上で何もなしに入力された日本語はcp932になる。Skyrim上ではUTF-8しか正常に表示できないため、xTranslatorで強制的にUTF-8に変換する。
昔おばちゃんところでString LocalizerのほうのSSLでしていた方法のxTranslator版。赤丸のところが強制変換。
- (元々日本語化されているespの場合は、ここでUTF-8→932に変換する)
- CKで932のespを開いて作業して保存する。保存後もCKは終了させない
- xTranslatorでUTF-8に強制変換して、espを保存
- Skyrimを立ち上げてテストして、終わったら終了する
- 開きっぱなしのCKで修正など作業、終わったら保存
- xTranslatorでCtrl+Wで一度espを閉じる
- xTranslatorで再度espを開いてUTF-8に変換して、espを保存
- Skyrimを立ち上げて……以下ループ
いったん終了して、続いてそのまま作業を進めたい場合は最後にCKで保存。配布する場合はxTranslatorでUTF-8になった状態で保存すること。
- SexLabUtil.pscにいろいろ便利そうな関数がたくさんある
- 長くModを作るなら、
- 必ずエディタからコンパイルできるようにするべき。作業効率が全然違う
- 何らかのバージョン管理システムは必ず使うべき。人間はバックアップしない生き物だから
- 以下のページをブラウザにピン止めするのをお勧め
- あまり紹介されていない開発に便利なコンソールコマンド
- sqv questid => ShowQuestVars : クエストが立ち上がっているんだかいないんだか、エイリアスが埋まっているんだかいないんだか調べるときに
- (キャラクリックして) sv => ShowVars : そのキャラのエイリアスの状態とか調べるときに
- その他の色々便利なコンソールコマンド:Console Commands (Papyrus)
このページへのコメント
エロmod弄りやり出すとこう言う経験に基づいた細かい便利テクの話は有難いね。ゲージンさんの書いたスクリプトソースを何の指標も無しに調べるのって結構疲れるし。DDやDCLの特定イベントの挙動にどのスクリプトが関わってるのか調べるだけで素人には半月掛かったりしたよ・・・
素晴らしい。こういうの。