Jump to content

Recommended Posts

Ooooh wait, seems like the gag talk isn't native from DDi is it? I tried using Devious Devices Interactions and now the gag talk works. Still doesn't work properly with NPC though, they still talk through DD gags as if it was nothing, but they cannot talk through ZAP gags.

Link to comment
5 hours ago, Seismonov said:

Hello,

I would like to ask about an issue;

I recently tried version 4.2 and I'm having a minor problem. Whenever I equip a gag to an NPC, the usual 'gagged dialogue' (the one where the gagged goes "mmphs" and the ungagged subject has some teasing dialogue) somehow doesn't work and they just talk normally as if they weren't gagged. When the player wears the gag however they are able to go into 'gagged dialogue'. This only applies to DD items, ZAZ items can still do 'gagged dialogue' when equipped on NPC and the player.

 

Any suggestion on how to fix this? Every help is much appreciated and thank you in advance!

The teasing dialogue was only ever in Zaz as far as I know, and applied to items with the relevant Zaz gag keyword. As DD removed all Zaz dependency in recent versions it won't ever happen with devious gags. There is GagSFX though, which can add in a lot of extra gag noises for devious gags. (It still requires Zaz, unlike DD.) It's predominantly aimed at adding voice packs for characters to play during SexLab animations when gagged, but it looks like it does also affect npc and follower dialogue as well.

Link to comment
34 minutes ago, SleepyJim said:

The teasing dialogue was only ever in Zaz as far as I know, and applied to items with the relevant Zaz gag keyword. As DD removed all Zaz dependency in recent versions it won't ever happen with devious gags. There is GagSFX though, which can add in a lot of extra gag noises for devious gags. (It still requires Zaz, unlike DD.) It's predominantly aimed at adding voice packs for characters to play during SexLab animations when gagged, but it looks like it does also affect npc and follower dialogue as well.

I see, that explains why there's no more gag talk on it, well there goes my immersion. I've tested GagSFX just now, as well as running the game only with ZAP 7.0 or ZAP 8.0+, the gag talk is not even working despite it's enabled in ZAP options. Well thanks for the info though, I'll just tinker around until I somehow get what I want.

Link to comment
35 minutes ago, Shilra284 said:

Does anyone have an alt download link? The standard one doesn't work at all for me.

Can you download anything from LL at all? ?

The small 76MB DDI package is usually not a problem at all. Or are you lost in the DD universe and are asking about the (much) bigger packages for DDx (Expansion) or DDa (Assets) ?

Link to comment

I came up with a suggestion, the device difficulty modifier should affect also unlocking success chance. I set difficulty to hardest and consume keys off, but the unlock for a red ball gag works on first try about 90% of the times. It would be fun to have this different kind of gameplay where even if you have the keys, it would take a bit of struggling to get free. Or maybe you'd give up, play a while and try later as it might trigger a cooldown.

 

On second thought this might need a different setting for "Unlock difficulty".

Link to comment

 

2 hours ago, kupa11 said:

I use zzjay's warderobe and everytime i equip pants they just get invisible. It look's like i got them equipped in inventory but they are invisible. Any ideas how 2 fix it?

this is due to some of the armor using the same armor slot as DD. 

 

go to your MCM -> Devious Devices -> Devices Underneath(1) -> find Body-Full(32)

 

try and find which slot the corresponding armor uses by selecting from the drop down menu "None (Disabled)"

 

 

Link to comment

Hi, seems like DDi is the only mod causing my game to crash during save load (not startup). I have the usual 250~ plugins and they are all working stably. Masters were checked,
DDa v3 is in fact working no problem. I have sexlab plus other animations working no problem. It's just DDi (v4.2). Animations are not maxed I'm at ~1500.
So my first question is, what are some mods that can be incompatible with DDi? And 2nd question is: Since DDi is an esm, load order does not matter correct?
I can't think of anything else :classic_unsure: Any help would be appreciated.

Link to comment
17 hours ago, darktej said:

 

this is due to some of the armor using the same armor slot as DD. 

 

go to your MCM -> Devious Devices -> Devices Underneath(1) -> find Body-Full(32)

 

try and find which slot the corresponding armor uses by selecting from the drop down menu "None (Disabled)"

 

 

Thank you! It helped out! If anyone has same issue then it's slot 49

Link to comment

Ok… so I’ve decided to make it my life’s mission to create items that allow me to filter sexlab animations.

i.e. if an actor is wearing the “pillory  ring” item, only pillory animations will be chosen when a sexlab animation is triggered.

I’m trying to reverse engineer how this is done using the DDi framework, and this is what I’ve got so far…

 

In zadSLBoundAnims I’ve added this to create the animations themselves...

 

Inside function LoadAnimations:

Spoiler

SexLab.GetSetAnimationObject("BFA_FB_PilloryDoggy", "CreateBFA_FB_PilloryDoggy", filterQuest)

SexLab.GetSetAnimationObject("BFA_FB_PilloryDoggyRedone", "CreateBFA_FB_PilloryDoggyRedone", filterQuest)

SexLab.GetSetAnimationObject("BFA_FB_PilloryHardDoggy", "CreateBFA_FB_PilloryHardDoggy", filterQuest)

SexLab.GetSetAnimationObject("BFA_FB_PilloryMissionary", "CreateBFA_FB_PilloryMissionary", filterQuest)

 

And at the end of the file:

 

Spoiler

Function CreateBFA_FB_PilloryDoggy(int id)           

            ; Define animation prefixes for each actor (must correspond to names in FNIS), add more if necessary

            String asAnim1 = "FB_PilloryDoggy"

            String asAnim2 = "FB_PilloryDoggy"

 

            libs.Log("Creating BFA_FB_PilloryDoggy")

            sslBaseAnimation Anim = SexLab.GetAnimationObject("BFA_FB_PilloryDoggy")

            if Anim != none && Anim.Name != "BFA_FB_PilloryDoggy"

                        Anim.Name = "BFA_FB_PilloryDoggy"

                        Anim.SetContent(Sexual)

                        Anim.SoundFX = Squishing

 

                        Int a1 = Anim.AddPosition(Female, addCum = Vaginal)

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S1")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S2")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S3")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S4")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S5")

 

                        Int a2 = Anim.AddPosition(Male)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S1", sos = 3, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S2", sos = 3, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S3", sos = 3, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S4", sos = 3, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S5", sos = 3, strapon = True)

 

                        Anim.SetStageSoundFX(1, None)

 

                        Anim.AddTag("FunnyBizness")

                        Anim.AddTag("Sex")

                        Anim.AddTag("Dirty")                 

 

                        Anim.AddTag("Furniture")

                        Anim.AddTag("FM")

 

                        Anim.AddTag("Pillory")

                        Anim.AddTag("AnimObject")

                        Anim.AddTag("Vaginal")

                        Anim.AddTag("Doggy")

                        Anim.AddTag("Doggystyle")

                        Anim.AddTag("DeviousDevice")

 

                        Anim.Save(-1)

            EndIf

endFunction

 

Function CreateBFA_FB_PilloryDoggyRedone(int id)        

            ; Define animation prefixes for each actor (must correspond to names in FNIS), add more if necessary

            String asAnim1 = "FB_PilloryDoggyRedone"

            String asAnim2 = "FB_PilloryDoggyRedone"

 

            libs.Log("Creating BFA_FB_PilloryDoggyRedone")

            sslBaseAnimation Anim = SexLab.GetAnimationObject("BFA_FB_PilloryDoggyRedone")

            if Anim != none && Anim.Name != "BFA_FB_PilloryDoggyRedone"

                        Anim.Name = "BFA_FB_PilloryDoggyRedone"

                        Anim.SetContent(Sexual)

                        Anim.SoundFX = Squishing

 

                        Int a1 = Anim.AddPosition(Female, addCum = Vaginal)

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S1")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S2")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S3")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S4")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S5")

 

                        Int a2 = Anim.AddPosition(Male)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S1", sos = 2, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S2", sos = 2, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S3", sos = 2, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S4", sos = 2, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S5", sos = 2, strapon = True)

 

                        Anim.SetStageSoundFX(1, None)

 

                        Anim.AddTag("FunnyBizness")

                        Anim.AddTag("Sex")

                        Anim.AddTag("Dirty")                 

 

                        Anim.AddTag("Furniture")

                        Anim.AddTag("FM")

 

                        Anim.AddTag("Pillory")

                        Anim.AddTag("AnimObject")

                        Anim.AddTag("Vaginal")

                        Anim.AddTag("Doggy")

                        Anim.AddTag("Doggystyle")

                        Anim.AddTag("DeviousDevice")

 

                        Anim.Save(-1)

            EndIf

endFunction

 

Function CreateBFA_FB_PilloryHardDoggy(int id) 

            ; Define animation prefixes for each actor (must correspond to names in FNIS), add more if necessary

            String asAnim1 = "FB_PilloryHardDoggy"

            String asAnim2 = "FB_PilloryHardDoggy"

 

            libs.Log("Creating BFA_FB_PilloryHardDoggy")

            sslBaseAnimation Anim = SexLab.GetAnimationObject("BFA_FB_PilloryHardDoggy")

            if Anim != none && Anim.Name != "BFA_FB_PilloryHardDoggy"

                        Anim.Name = "BFA_FB_PilloryHardDoggy"

                        Anim.SetContent(Sexual)

                        Anim.SoundFX = Squishing

 

                        Int a1 = Anim.AddPosition(Female, addCum = Vaginal)

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S1")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S2")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S3")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S4")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S5")

 

                        Int a2 = Anim.AddPosition(Male)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S1", sos = 2, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S2", sos = 2, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S3", sos = 2, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S4", sos = 2, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S5", sos = 2, strapon = True)

 

                        Anim.SetStageSoundFX(1, None)

 

                        Anim.AddTag("FunnyBizness")

                        Anim.AddTag("Sex")

                        Anim.AddTag("Dirty")                 

 

                        Anim.AddTag("Furniture")

                        Anim.AddTag("FM")

 

                        Anim.AddTag("Pillory")

                        Anim.AddTag("AnimObject")

                        Anim.AddTag("Vaginal")

                        Anim.AddTag("Doggy")

                        Anim.AddTag("Doggystyle")

                        Anim.AddTag("DeviousDevice")

 

                        Anim.Save(-1)

            EndIf

endFunction

 

Function CreateBFA_FB_PilloryMissionary(int id)  

            ; Define animation prefixes for each actor (must correspond to names in FNIS), add more if necessary

            String asAnim1 = "FB_PilloryMissionary"

            String asAnim2 = "FB_PilloryMissionary"

 

            libs.Log("Creating BFA_FB_PilloryMissionary")

            sslBaseAnimation Anim = SexLab.GetAnimationObject("BFA_FB_PilloryMissionary")

            if Anim != none && Anim.Name != "BFA_FB_PilloryMissionary"

                        Anim.Name = "BFA_FB_PilloryMissionary"

                        Anim.SetContent(Sexual)

                        Anim.SoundFX = Squishing

 

                        Int a1 = Anim.AddPosition(Female, addCum = Vaginal)

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S1")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S2")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S3")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S4")

                        Anim.AddPositionStage(a1, asAnim1 + "_A1_S5")

 

                        Int a2 = Anim.AddPosition(Male)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S1", sos = 3, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S2", sos = 3, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S3", sos = 3, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S4", sos = 3, strapon = True)

                        Anim.AddPositionStage(a2, asAnim2 + "_A2_S5", sos = 3, strapon = True)

 

                        Anim.SetStageSoundFX(1, None)

 

                        Anim.AddTag("FunnyBizness")

                        Anim.AddTag("Sex")

                        Anim.AddTag("Dirty")                 

 

                        Anim.AddTag("Furniture")

                        Anim.AddTag("FM")

 

                        Anim.AddTag("Pillory")

                        Anim.AddTag("AnimObject")

                        Anim.AddTag("Vaginal")

                        Anim.AddTag("DeviousDevice")

 

 

                        Anim.Save(-1)

            EndIf

endFunction

 

To zadBQ00 I added this code to call on the animations created...

 

In the end of sslBaseAnimation function GetBoundAnim(actor a, actor b):

 

Spoiler

If HasPillory(a)

                        if !b.WornHasKeyword(libs.zad_DeviousHeavyBondage)

                                    ;check if partner is a male

                                    If b.GetLeveledActorBase().GetSex() == 0

                                                i = Utility.RandomInt(0,3)

                                                If i == 0

                                                            return SexLab.GetAnimationObject("BFA_FB_PilloryDoggy")                                                           

                                                ElseIf i == 1

                                                            return SexLab.GetAnimationObject("BFA_FB_PilloryDoggyRedone")

                                                ElseIf i == 2

                                                            return SexLab.GetAnimationObject("BFA_FB_PilloryHardDoggy")

                                                ElseIf i == 3

                                                            return SexLab.GetAnimationObject("BFA_FB_PilloryMissionary")                    

                                                EndIf                         

                                    EndIf                         

                        EndIf

            EndIf

 

 

On line 1100:

 

Spoiler

Bool Function HasPillory(Actor akActor)

            Return (akActor != None) && (akActor.WornHasKeyword(libs.bfa_pillory))

EndFunction

 

In zadlibs I added this (which I don’t know if it’s even necessary… than again, I don’t really know if anything I'm doing here is even in the right direction, so that’s no surprise :)

 

Spoiler

Armor Property pillory Auto

Armor Property pilloryRendered Auto

 

And I made this change:

Spoiler

bool Function IsBound(actor akActor)

            return akActor.WornHasKeyword(zad_DeviousHeavyBondage) || (akActor.WornHasKeyword(zad_DeviousArmbinder) || akActor.WornHasKeyword(zad_DeviousArmBinderElbow) || akActor.WornHasKeyword(zad_DeviousYoke) || akActor.WornHasKeyword(bfa_pillory) || akActor.WornHasKeyword(zad_DeviousYokeBB) || akActor.WornHasKeyword(zad_DeviousStraitJacket))

EndFunction

 

And added this (which again... do I know what I'm doing?):

 

Spoiler

RegisterGenericDevice(pillory, "DDi,ring,metal")

 

And that’s where I get stuck pretty much. I try creating the item in CK, but that’s not working.

 

After playing around with the CK for quite a while and trying to duplicate the yoke, and change the keywords in the Editor ID to bfa_pillory (among other things) I get that’s not how it’s done.

 

When I duplicate zad_yoke_scriptInstance, it appears in my inventory in game etc.

 

I now get that adding the item itself is done using papyrus, and the equipdevice function.

But I don’t really know how to do that, and also, I don’t even know if I’m in the right direction.

 

I would really appreciate any help that at least directs me in the right way.

 

Examples would be awesome. I don’t know how to code much… (can you tell?) but I do know how to reverse engineer :) referring me to any existing mod that does this (i.e. adding a new custom devious device) would also be greatly appreciated.

And any info on how I connect a keyword to the device would be great.

 

I really want to get this done and I've sunk hours into this. I know I’m going to need to stumble my way to success. But I’d at least like to know I’m stumbling in the right direction.

Link to comment

Hi,

 

I wanted to leave some suggestions:

- the inflatable plugs don't seem to have physics on the pumps (whereas chains and such do nowadays, would be awesome if you could include those to!)

- For the "tail" plugs, it would be nice to see some different colors, maybe make one additional one that copies the characters hair color?

- Not sure if possible, but it would be cool if the standard devices have a minigame when you try to use "pick lock" (standard lockpick game / or maybe a custom one)? With the vanilla minigame it would make sense to make it more difficult depending on the characters arousal and ofc only 1 try per / time interval.

- It would be nice if devices could have some more color options (pink / blue), I noticed there are dyes, but they are rather limited right now. Would it be possible to allow players to create a custom dye with their own color (kinda like how racemenu allows you to make your own colors)?

 

And one sorta oddity I encountered:

It seems the rubber catsuit stuff (from mxm or something) don't seem to have everything bodyslide-able (if that's even a word), I tripple checked to make sure everything was working fine, but those are the only items which don't get fitted properly (on CBBE, I don't know if the same problems are there with UUNP). Most noticable are the rubber gloves, they are completely off and it's collar is a bit to much forward.

 

And one question, I noticed that the items from the zaz animation pack don't have "devious" properties, but it does have some nice stuff in there. How could I make some items "devious"? (I have never modded before).

 

Anyways, great stuff!

Link to comment
6 minutes ago, jujoco said:

- For the "tail" plugs, it would be nice to see some different colors, maybe make one additional one that copies the characters hair color?

I believe most of the tail plugs should copy the player characters hair color when worn.

Link to comment
2 hours ago, LazyBoot said:

I believe most of the tail plugs should copy the player characters hair color when worn.

? oh that's really cool!

I never noticed

 

Link to comment

Hey I have a gamebraking problem with this mod.

It's about the animation filter - It just doesn't work.

Is there any fix for that?

 

I also get thing like: Game says playing blowjob and he fucks her in a pussy.

 

May be related to this: 

Edit: I fixed it. It's a bug in DDi script. It's the use bound animation option - it has a higher priority than the animation filter.

Link to comment

This mod is broken!

 

First of all it adds new sex animations and there is nothing about that in the mod description. It took me 2 days to find where those animations are coming from.

Those animations do not show up in SexLab neither can be successfully unregistered with SexLab Tools.

Animations added by DDi are incompatible with Devious devices - they ignore the animation filter.

 

Here is my stream, where this mod is preventing me from playing normally:

Problems start about 23:30 and persist till the end of the video.

 

https://www.pornhub.com/view_video.php?viewkey=ph5cc2838505b3f

Link to comment
2 hours ago, TheArchlich said:

First of all it adds new sex animations and there is nothing about that in the mod description. It took me 2 days to find where those animations are coming from.

Those animations do not show up in SexLab neither can be successfully unregistered with SexLab Tools.

Animations added by DDi are incompatible with Devious devices - they ignore the animation filter.

Unless another mod has registered them in sexlab, any animations from DDi should not show up in normal scenes, only when wearing devices...

And they are specifically designed to be compatible with devices.

Link to comment
2 hours ago, LazyBoot said:

Unless another mod has registered them in sexlab, any animations from DDi should not show up in normal scenes, only when wearing devices...

And they are specifically designed to be compatible with devices.

They are not specifically designed to be compatible with the devices, and if they are they fucked it up, cause it's clearly not working.

I'm getting pussy-fucked through a chastity belt using a DDi animation.

Link to comment
36 minutes ago, TheArchlich said:

They are not specifically designed to be compatible with the devices, and if they are they fucked it up, cause it's clearly not working.

I'm getting pussy-fucked through a chastity belt using a DDi animation.

Did you check Cursed Loot that attackers can strip chastity belts, and that chastity prevents rape? It also seemed that you may have some other mod starting sex too but i didn't look too carefully. Not many mods talk about "your master". There are 2 main filters that matter for bound animations, one from DDi and other from ZAP.

Link to comment
34 minutes ago, Zaflis said:

Did you check Cursed Loot that attackers can strip chastity belts, and that chastity prevents rape? It also seemed that you may have some other mod starting sex too but i didn't look too carefully. Not many mods talk about "your master". There are 2 main filters that matter for bound animations, one from DDi and other from ZAP.

As I said, I didn't do anything wrong, that's a DDi only issue.

 

Edit: That is not even a DCL rape so why would it matter?

Link to comment

@Kimy,

After trying DDi 4.2, I have some suggestions. 

 

1. I have noticed you are no longer using ‘zadRestraintArmBinderScript’ on armbinders or any other extending script, is there a reason for this?

It is a good practice to create a script for each device that will extend the ‘zadEquipScript’ and attaching that to the corresponding device instead of attaching ‘zadEquipScript’ directly to every device. This will allow for more customization of each device type. 

When used on armbinders for example, it will allow you to do this.  

 

Spoiler

ScriptName iDDeResArmBinderScr Extends zadEquipScript

STRING[] Property sDefStruggleIdles
	STRING[] Function Get()
		STRING[] sIdles = NEW STRING[5]
			sIdles[0] = "DDRegArmbStruggle01"
			sIdles[1] = "DDRegArmbStruggle02"
			sIdles[2] = "DDRegArmbStruggle03"
			sIdles[3] = "DDRegArmbStruggle04"
			sIdles[4] = "DDRegArmbStruggle05"
		RETURN sIdles
	EndFunction
EndProperty

STRING[] Property sDefStruggleIdlesHob
	STRING[] Function Get()
		STRING[] sIdles = NEW STRING[2]
			sIdles[0] = "DDHobArmbStruggle01"
			sIdles[1] = "DDHobArmbStruggle02"
		RETURN sIdles
	EndFunction
EndProperty

Keyword[] Property DefEquipConflictingDevices
	Keyword[] Function Get()
		Keyword[] kws = NEW Keyword[3]
			kws[0] = libs.zad_DeviousArmbinderElbow
			kws[1] = libs.zad_DeviousYoke
			kws[2] = libs.zad_DeviousPetSuit
		RETURN kws
	EndFunction
EndProperty

Event OnInit()
	SetDefaults()
EndEvent

Function SetDefaults()
	If (struggleIdles.Length < 1) ;only overwrite them if they are not already manually set in CK
		struggleIdles = sDefStruggleIdles
	EndIf
	If (struggleIdlesHob.Length < 1)
		struggleIdlesHob = sDefStruggleIdlesHob
	EndIf
	If (EquipConflictingDevices.Length < 1)
		EquipConflictingDevices = DefEquipConflictingDevices
	EndIf
EndFunction

 

 

which will make it way easier to add or remove default idles for armbinders, and help tremendously with the existing armbinders’ backward compatibility as modders would not have to add all those idles manually. 
Also, notice the similar implementation of device conflict keywords which does not seem implemented atm.

 

Since this method is dependent on the ‘OnInit’ event, should you decide to add that event to the ‘zadEquipScript’ don’t forget to add an empty function like ‘SetDefaults()’ so other scripts can also use the ‘OnInit’ event, and let me know so I can remove my ‘OnInit’ event as only the last one in the chain will execute. 

 

This can also be done for other devices types as well, by creating their own scripts of course.  

 

Spoiler

ScriptName iDDeResElbowBinderScr Extends zadEquipScript

STRING[] Property sStruggleIdlesDef
	STRING[] Function Get()
		STRING[] sIdles = NEW STRING[5]
			sIdles[0] = "DDRegElbStruggle01"
			sIdles[1] = "DDRegElbStruggle02"
			sIdles[2] = "DDRegElbStruggle03"
			sIdles[3] = "DDRegElbStruggle04"
			sIdles[4] = "DDRegElbStruggle05"
		RETURN sIdles
	EndFunction
EndProperty

STRING[] Property sStruggleIdlesHobDef
	STRING[] Function Get()
		STRING[] sIdles = NEW STRING[2]
			sIdles[0] = "DDHobElbStruggle01"
			sIdles[1] = "DDHobElbStruggle02"
		RETURN sIdles
	EndFunction
EndProperty

Keyword[] Property EquipConflictingDevicesDef
	Keyword[] Function Get()
		Keyword[] kws = NEW Keyword[3]
			kws[0] = libs.zad_DeviousArmbinder
			kws[1] = libs.zad_DeviousYoke
			kws[2] = libs.zad_DeviousPetSuit
		RETURN kws
	EndFunction
EndProperty

Event OnInit()
	SetDefaults()
EndEvent

Function SetDefaults()
	If (struggleIdles.Length < 1) ;only overwrite them if they are not already manually set in CK
		struggleIdles = sStruggleIdlesDef
	EndIf
	If (struggleIdlesHob.Length < 1)
		struggleIdlesHob = sStruggleIdlesHobDef
	EndIf
	If (EquipConflictingDevices.Length < 1)
		EquipConflictingDevices = EquipConflictingDevicesDef
	EndIf
EndFunction

 

 

You should add a dedicated script for each device type even if empty because it will afford you more flexibility in the future.

 

The armbinders for instance, can very easily be done in TESV Edit as you would only need to change the script name (from zadEquipScript to zadRestraintArmBinderScript), and all the properties already assigned will remain because ‘zadRestraintArmBinderScript’ extends ‘zadEquipScript’ already.  

 

Also, just by applying a filter in TESV edit you can simplify and expedite the process by quite a bit. 

  

Spoiler

TESV01.png

 

Then rename the script, just make sure it is compiled before opening it in CK.

 

Spoiler

TESV02.png

 

 

2. You might want to expand this function 

 

Spoiler

string Function LookupDeviceType(keyword kwd)
...
ElseIf kwd == zad_DeviousHobbleSkirtRelaxed
	return "HobbleSkirt"
ElseIf (kwd)
	RETURN (kwd AS STRING) ;or 
	RETURN kwd.GetName() ; Not sure if this works for keywords, tho. 
EndIf
...
[/code]

 


in ‘zadLibs’ to accommodate for new custom keywords added by other mods (e.g. Mech Suit from DDe).
 

 

3. You’ve emphatically shut me down on this before, but I will suggest a change to the DDi versioning one last time.   
Keeping 2 different version numbers for a mod is just a bad practice because it creates a lot of confusion, as least for modders, which is more prevalent when it comes to frameworks such as DDi. If I need to see which version of DDi is installed I have to go into DDi’s code and see whether the script version 10.0 corresponds to DDi 4.2 or 4.00 or whatever. 

 

How about this simpler implementation? 

It seems that since most scripts are already using 'zadLibs' as a property, it cannot be called for global functions as well. So, you'll have to create a separate script extending a quest, you do not need to attach it to a quest, tho.  But, this will afford you the opportunity to provide users with even more functionality such as an API function.

 

Something like this,

 

Spoiler

ScriptName zadUtil Extends Quest

Import Game

;Version
FLOAT Function GetVersion() GLOBAL  
	RETURN 4.20 
EndFunction 
STRING Function GetVersionStr() GLOBAL  
	RETURN StringUtil.Substring(GetVersion(), 0, 4)  
EndFunction 
 
;API
zadLibs Function GetAPI() GLOBAL
	If (GetModByName("Devious Devices - Integration.esm") < 255)
		RETURN GetFormFromFile(0x0000F624, "Devious Devices - Integration.esm") AS zadLibs 
	EndIf
	RETURN None
EndFunction

 

 

Then, in the zadLibs script for continuity,

 

Spoiler

FLOAT Function GetVersion()
	RETURN zadUtil.GetVersion()
EndFunction 
STRING Function GetVersionStr()
	RETURN zadUtil.GetVersionStr()
EndFunction 

 


Finally, in the MCM config script

 

Spoiler

Int Function GetVersion()
	RETURN ((zadUtil.GetVersion() * 100) AS INT)
EndFunction

 

 

With this, any mod looking just to check the DDi version would only need one line of code. 

 

zadUtil.GetVersion() 

works from any script with no dependency checks, no properties, no guesswork (i.e. wether the returned version of 10.0 = DDi 4.2 or some other DDi version; the official version is the script version), just simple and efficient. Also with every update you need only change one number in one place. 

 

 

4. Struggling out of an armbinder is utter nonsense IMHO (especially the elbowbinders), and having a NPC release you should be the only way out. Therefore, you should add back the armbinder/heavybondage dialogue release option (you can make it toggleable in the MCM), so all the small mods out there (DDe, DC, etc.) do not have to create their own dialogue system just to release the player from the armbinder, and end up with 50 different dialogs from 50 different mods. You could just move the DCL one to DDi. 
 

 

5. I have noticed that plugs (the rendered part of the device) are still being dropped (as they were in DDi 3) when wearing bondage mittens and equipped in script. This results in a broken device. You might want to add the zad_DeviousPlug keyword to the ‘IsDeviousDevice()’ function check in the bondage mittens effect script. 

 

 

6. When the elbowbinder is equipped there is a 3 time animation cycling between normal and bound pose. Is this a known issue, or is it just on my end?  
BTW, love the elbowbinder. Ouch! ❤️ Have I known it was in there I would have ‘converted’ earlier. :classic_wink:

 

 

7. Your usage of ‘zad_DeviousHeavyBondage’ keyword for all the devices that bind the arms is super convenient, however it seems to break the ‘ManipulateGenericDeviceByKeyword()’ function. In my tests it failed to add back the items removed (armbinder, elbowbinder) about 50% of the time where it worked perfectly in DDi 3.

 

 

8. What is the point of the extra keyword (token) on ‘quest’ devices? 

 

 

9. I still get belt message boxes after sleep and wait even tho I've unchecked that option in the MCM. 

 

 

Ninja edited, for better readability and more content.  

 

 

Link to comment
On 4/26/2019 at 11:14 PM, Inte said:

@Kimy,

After trying DDi 4.2, I have some suggestions. 

 

1. I have noticed you are no longer using ‘zadRestraintArmBinderScript’ on armbinders or any other extending script, is there a reason for this?

The old implementation was very, as in VERY complicated. Wrist restraints required several scripts and effects to set up, and it made making custom devices living hell. The new one? Just slap the standard script (zadEquipScript) on, put the generic enchantment on the rendered device, and you're done! No messing with multiple scripts!

On 4/26/2019 at 11:14 PM, Inte said:

It is a good practice to create a script for each device that will extend the ‘zadEquipScript’ and attaching that to the corresponding device instead of attaching ‘zadEquipScript’ directly to every device. This will allow for more customization of each device type. 

You CAN inherit that script for custom devices, but 99% of time you won't have to, and in fact, shouldn't. zadEquipScript is meant to be used unchanged for almost all devices. Pretty much all item behavior can be defined via script properties (see documentation in the code!). No custom code needed! Even the idles can be set individually via properties and without changing any code whatsoever. I know it's a bit of a paradigm change compared to 3.x, but I am absolutely convinced you will love the new implementation once you get used to it!

 

Some device types with non-standard behavior still use inherited device scripts (e.g. plugs and belts). If we ever introduce new device types that need non-standard code, they will get their own device script, of course. Right now, I can't imagine what that should be, though. There is almost no type of restraint left in the world we don't already cover.

On 4/26/2019 at 11:14 PM, Inte said:

in ‘zadLibs’ to accommodate for new custom keywords added by other mods (e.g. Mech Suit from DDe).

A mech suit's device keyword (as far as the framework is concerned) would still be zad_DeviousSuit (assuming it occupies slot 32). You can put as many custom keywords on a device as you wish, mind you, but if you need text replacement, you'd have to do that in your content mod.

On 4/26/2019 at 11:14 PM, Inte said:

 

 

3. You’ve emphatically shut me down on this before, but I will suggest a change to the DDi versioning one last time.   
Keeping 2 different version numbers for a mod is just a bad practice because it creates a lot of confusion, as least for modders, which is more prevalent when it comes to frameworks such as DDi. If I need to see which version of DDi is installed I have to go into DDi’s code and see whether the script version 10.0 corresponds to DDi 4.2 or 4.00 or whatever. 

I know you disagree with me on that VERY much so, but I really think it's good practice to differ between an internal build number and the official version number. It's not that it's a not widespread practice in software development, you know? ;)

On 4/26/2019 at 11:14 PM, Inte said:

4. Struggling out of an armbinder is utter nonsense IMHO (especially the elbowbinders), and having a NPC release you should be the only way out. Therefore, you should add back the armbinder/heavybondage dialogue release option (you can make it toggleable in the MCM), so all the small mods out there (DDe, DC, etc.) do not have to create their own dialogue system just to release the player from the armbinder, and end up with 50 different dialogs from 50 different mods. You could just move the DCL one to DDi. 

I totally agree! Struggling out of a properly applied armbinder is utterly impossible. At least I am not aware of anyone who ever managed to accomplish such a feat. However, struggling has been in the framework since DD 1.0 (I suppose because there were otherwise no mechanics available to escape these things and Min wanted to avoid people getting stuck). If I change that device's behavior so drastically, I have no idea how much stuff I would break in people's mods. I consider the standard armbinders to be "practice restraints", and don't normally use them in my quest content etc. Good that DD4 made making custom devices so easy, so all I have to do is cloning an armbinder and set the struggle chance property to zero! Try that with DD3, haha!

The device dialogue I actually DID remove to prevent having 50 different dialogues from 50 different mods. There are so many good "help me out of my bonds" mods around, that there is simply no good reason for the framework to provide that feature. This way users can pick the mod they want to have. Personally, I am using Devious Followers.

On 4/26/2019 at 11:14 PM, Inte said:

5. I have noticed that plugs (the rendered part of the device) are still being dropped (as they were in DDi 3) when wearing bondage mittens and equipped in script. This results in a broken device. You might want to add the zad_DeviousPlug keyword to the ‘IsDeviousDevice()’ function check in the bondage mittens effect script. 

Will look into this! I think the mitten code needs some TLC in general.

On 4/26/2019 at 11:14 PM, Inte said:

6. When the elbowbinder is equipped there is a 3 time animation cycling between normal and bound pose. Is this a known issue, or is it just on my end?

Not quite sure what you mean?

On 4/26/2019 at 11:14 PM, Inte said:

BTW, love the elbowbinder. Ouch! ❤️ Have I known it was in there I would have ‘converted’ earlier. :classic_wink:

There are literally hundreds of new devices in DD4. Have fun exploring them!

On 4/26/2019 at 11:14 PM, Inte said:

7. Your usage of ‘zad_DeviousHeavyBondage’ keyword for all the devices that bind the arms is super convenient, however it seems to break the ‘ManipulateGenericDeviceByKeyword()’ function. In my tests it failed to add back the items removed (armbinder, elbowbinder) about 50% of the time where it worked perfectly in DDi 3.

I will have to test that. I never use that function for anything but removing devices, so no clue, really!

On 4/26/2019 at 11:14 PM, Inte said:

8. What is the point of the extra keyword (token) on ‘quest’ devices? 

It prevents mods from accidentally removing somebody's quest devices, so quest device removal can be done only REALLY on purpose.

On 4/26/2019 at 11:14 PM, Inte said:

9. I still get belt message boxes after sleep and wait even tho I've unchecked that option in the MCM. 

There is a MCM option for that? Haha!

 

Link to comment
On 4/21/2019 at 5:01 AM, Nimkal said:

Hi, seems like DDi is the only mod causing my game to crash during save load (not startup). I have the usual 250~ plugins and they are all working stably. Masters were checked,
DDa v3 is in fact working no problem. I have sexlab plus other animations working no problem. It's just DDi (v4.2). Animations are not maxed I'm at ~1500.
So my first question is, what are some mods that can be incompatible with DDi? And 2nd question is: Since DDi is an esm, load order does not matter correct?
I can't think of anything else :classic_unsure: Any help would be appreciated.

Can someone please help me with the issue above?

There is literally nothing that I can think of that would make DDi crash my game on loading screen. I just can't load game with this mod active. What is happening. I've checked everything. The only other explanation is if there is a mod incompatibility.

Link to comment
11 hours ago, Kimy said:
Quote

It is a good practice to create a script for each device that will extend the ‘zadEquipScript’ and attaching that to the corresponding device instead of attaching ‘zadEquipScript’ directly to every device. This will allow for more customization of each device type. 

You CAN inherit that script for custom devices, but 99% of time you won't have to, and in fact, shouldn't.

Although I agree that you do not have to extend the ‘zadEquipScript’ to make the device work, like I mentioned before you should extend it regardless (even if empty) for future expansion, always. Why? Because there is absolutely no downside in doing so. In fact doing it will make for a more robust modding. 

 

However, if not done and later on you find that someone has made some new cool idles that would work perfectly with your 500 devices you’ve already made, or the ‘zadEquipScript’ was changed so much that it cannot be used with your devices anymore, you are screwed. Your only choices then would be to,

1. Not use those new cool idles or the updated ‘zadEquipScript’.
2. Change about 30 properties for each one of your 500 devices for an estimated total of 15,000 properties. 
3. Abandon your now broken mod. 

 

For instance, ‘luckily’ for me I did extend ‘zadEquipScript’ on every single one of the DDe devices and by just adding the code I mentioned previously and changing a couple of properties for each device I was able to save DDe.

 

11 hours ago, Kimy said:
Quote

in ‘zadLibs’ to accommodate for new custom keywords added by other mods (e.g. Mech Suit from DDe).

A mech suit's device keyword (as far as the framework is concerned) would still be zad_DeviousSuit (assuming it occupies slot 32). You can put as many custom keywords on a device as you wish, mind you, but if you need text replacement, you'd have to do that in your content mod.

 I was considering that, but the mech suit occupies all slots except for the gag and belt. Although the ‘zad_DeviousSuit’ keyword is already on it, I thought to use a custom keyword for removal. Or maybe ‘zad_DeviousStraightJacket now available in 4.2, IDK? 
Also, that function is not used for text replacement but to temporary store devices in StorageUtil for quicker removal. Therefore, every time the mech suit is equipped players get the error box at the end of that function, which can get annoying after a while.  

 

11 hours ago, Kimy said:
Quote

 

 

3. You’ve emphatically shut me down on this before, but I will suggest a change to the DDi versioning one last time.   
Keeping 2 different version numbers for a mod is just a bad practice because it creates a lot of confusion, as least for modders, which is more prevalent when it comes to frameworks such as DDi. If I need to see which version of DDi is installed I have to go into DDi’s code and see whether the script version 10.0 corresponds to DDi 4.2 or 4.00 or whatever. 

I know you disagree with me on that VERY much so, but I really think it's good practice to differ between an internal build number and the official version number. It's not that it's a not widespread practice in software development, you know? ;)

So let me see here, if modders want to check for the DDi 4.20 version it would be better to:

1. Just grab the version and compare it to 4.20 and... that’s it. Or...
2. Go digging through 100 scripts to find out that version 4.20 is actually version 10, then grab that version and check against that. They would have to do this with every new DDi release because they wouln’t know whether the new release is 11 or 10.5 or whatever? 

 

Give me one example where it is a good practice to have two different version numbers for the same mod build keeping in mind that, we are not talking Windows here, where you have 100 different departments working on the same build.  
 

11 hours ago, Kimy said:

If I change that device's behavior so drastically, I have no idea how much stuff I would break in people's mods. I consider the standard armbinders to be "practice restraints", and don't normally use them in my quest content etc.

That is just it. You are not changing that device’s behavior at all. You are adding back the dialogue that allows a NPC to free a player in heavy bondage, that’s all. 
 

11 hours ago, Kimy said:

Good that DD4 made making custom devices so easy, so all I have to do is cloning an armbinder and set the struggle chance property to zero! Try that with DD3, haha!

Actually in DDi 3 it was much simpler than that. All you had to do to is to call these functions after equipping the armbinder, 
DisableStruggling() - It will... well disable struggle escapes,
DisableDialogue() - It will remove the dialog where any NPC can let you out of the armbinder,
and the best part, it worked with any armbinder, new or old. 

 

11 hours ago, Kimy said:

The device dialogue I actually DID remove to prevent having 50 different dialogues from 50 different mods. There are so many good "help me out of my bonds" mods around, that there is simply no good reason for the framework to provide that feature. This way users can pick the mod they want to have. Personally, I am using Devious Followers.

So, having a centralized dialog option that all mods would have access to use and instead forcing each of them to create their own dialog option would prevent having 50 different dialogs from 50 different mods, how?  

 

Show me a mod that provides just that one dialog feature* nothing more, and I will gladly use it and shut up about this, and that is to say nothing about the extra LO slot for a feature that we already had.

 

Personally, I thought you’d be using DCL, no? :classic_wink: 

 

* - the feature DDi 3 has where a NPC would have the dialog to release the player from heavy bondage (for a price of course). Also it would allow the mod that equipped said heavy bondage to disable the dialog, and/or the struggle-out option. 

 

11 hours ago, Kimy said:
Quote

6. When the elbowbinder is equipped there is a 3 time animation cycling between normal and bound pose. Is this a known issue, or is it just on my end?

Not quite sure what you mean?

Sorry, English is my 3rd language and the other 2 don’t like it when I use it. :classic_tongue:
After the elbowbinder is equipped the arms go in, then they pop out (no hands) then they go back in. This repeats about 3 times and in the end they stay in as they should. 

 

11 hours ago, Kimy said:
Quote

8. What is the point of the extra keyword (token) on ‘quest’ devices? 

It prevents mods from accidentally removing somebody's quest devices, so quest device removal can be done only REALLY on purpose.

IDK, I think the previous system (DDi 3) worked fine for that. 

 

11 hours ago, Kimy said:
Quote

9. I still get belt message boxes after sleep and wait even tho I've unchecked that option in the MCM. 

There is a MCM option for that? Haha!

Why yes there is and it’s not working for those message boxes which gets really annoying after you click off the same message box 50 times.

 

Link to comment

Some kind of debug menu feature to remove devices from NPCs would be handy.

 

e.g. I accidentally traded Maiden's Shield to Chloe.

 

I wanted to remove it from her, as I didn't intend to put her in it.

 

I couldn't seem to remove it via the console. I removed the device and the render device, but the render device would reappear after every cell change.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more information, see our Privacy Policy & Terms of Use