Jump to content

Recommended Posts

Posted
8 minutes ago, indolu said:

Have you tried the "setstage Ski_configmanagerinstance 1" command or "jaxonz mcm kicker" yet? If not then those are worth a shot. If that doesnt help make for sure you have all mods this depends on and that they are updated. If those dont work I am out of my depth.

Okey so I got the MCMs to work by saving removing loading etc..

 

But still don't get the messages when equipping/removing devices and they are still visually stuck.

 

As far as I know all dependencies are met and updated. I mean it worked before I updated theese specific mods?

Posted
13 hours ago, mrkill3r said:

But still don't get the messages when equipping/removing devices and they are still visually stuck.

The likely answer is that your savefile could be the problem, and it would work well in a new game. You can try cleaning your equipped items, that includes the scripted DD items by using console. Each restraint has the script and rendered item to it, it is extremely rare but glitch like you describe can happen, and could result from some mod conflict too. Don't use mods that depend on old DD versions.

Posted

More research on the timed restraints, especially "LockShield" mechanic.

 

Lets see script from DDI's zadEquipScript.psc, line 581:

LockShieldTimer = ((Utility.RandomFloat(LockShieldTimerMin, LockShieldTimerMax)) * CalculateCooldownModifier(False))

 

Line 1070:

Spoiler

Float Function CalculateCooldownModifier(Bool operator = true)
    ; We don't modify for quest items
    If deviceInventory.HasKeyword(libs.zad_BlockGeneric) || deviceRendered.HasKeyword(libs.zad_BlockGeneric) || deviceInventory.HasKeyword(libs.zad_QuestItem) || deviceRendered.HasKeyword(libs.zad_QuestItem)
        ; except the modder specifically allowed the system to be used for that item!
        If !AllowDifficultyModifier
            libs.log("Difficulty modifier not applied - custom/quest item!")
            return 1.0
        EndIf
    EndIf
    Float val = 1.0
    Int mcmValue = libs.config.CooldownDifficulty    
    Int mcmLength = libs.config.EsccapeDifficultyList.Length
    Int median = ((mcmLength - 1) / 2) As Int ; This assumes the array to be uneven, otherwise there is no median value.
    Float maxModifier = 0.9 ; set this as desired - it's the maximum possible +/- modifier. It should not be larger than 1 (=100%)
    Float StepLength = maxModifier / median
    Int Steps = mcmValue - median    
    If operator
        val = 1 + (Steps * StepLength)
    Else
        val = 1 - (Steps * StepLength)
    EndIf
    libs.log("Difficulty modifier applied: " + val + " [setting: " + mcmValue + "]")
    return val
EndFunction

 

So what we know is quest items will always get a value 1.0, but what if it's a timed restraint you buy from a shop or give with console... First, it was called with operator = false, and from "Vanilla" to "Born slave" that is 9 difficulty levels. So what we get with difficulty 0 and 8:

 

mcmValue = 0

mcmLength = 9

median = (9-1)/2 As Int = 4

StepLength = 0.9 / 4 = 0.225

Steps = 0 - 4 = -4

val = 1 - (Steps * StepLength) = 1- (-4 * 0.225) = 1.9  -- Multiplier on hardest difficulty.

 

mcmValue = 8

Steps = 8 - 4 = 4

val = 1- (4 * 0.225) = 0.1 -- Multiplier on easiest difficulty.

 

Expected range for val with mcmValue 0..8 is around 0.5 to 1.5 or so. We don't want them to unlock too fast even on easiest difficulty, and not last several weeks on hardest.

 

Edit: Oops, i realize in the DD's MCM menu the first one in the list is actually hardest, so i should have said inverse. 0 = hardest and 8 easiest. But i tried timed restraint with both difficulty ingame (ones given in DCL's esp) and it unlocks instantly both times. I had given all keys to follower but i had the Unlock menu available (by timed release i assume).

 

Edit2: Fixed val error with setting 8 and cleaned meanings. Bottom line is still that the reason timed restraints unlock instantly is somewhere else than in this function.

Posted
21 hours ago, Zaflis said:

More research on the timed restraints, especially "LockShield" mechanic.

 

Lets see script from DDI's zadEquipScript.psc, line 581:

LockShieldTimer = ((Utility.RandomFloat(LockShieldTimerMin, LockShieldTimerMax)) * CalculateCooldownModifier(False))

 

Line 1070:

  Reveal hidden contents

Float Function CalculateCooldownModifier(Bool operator = true)
    ; We don't modify for quest items
    If deviceInventory.HasKeyword(libs.zad_BlockGeneric) || deviceRendered.HasKeyword(libs.zad_BlockGeneric) || deviceInventory.HasKeyword(libs.zad_QuestItem) || deviceRendered.HasKeyword(libs.zad_QuestItem)
        ; except the modder specifically allowed the system to be used for that item!
        If !AllowDifficultyModifier
            libs.log("Difficulty modifier not applied - custom/quest item!")
            return 1.0
        EndIf
    EndIf
    Float val = 1.0
    Int mcmValue = libs.config.CooldownDifficulty    
    Int mcmLength = libs.config.EsccapeDifficultyList.Length
    Int median = ((mcmLength - 1) / 2) As Int ; This assumes the array to be uneven, otherwise there is no median value.
    Float maxModifier = 0.9 ; set this as desired - it's the maximum possible +/- modifier. It should not be larger than 1 (=100%)
    Float StepLength = maxModifier / median
    Int Steps = mcmValue - median    
    If operator
        val = 1 + (Steps * StepLength)
    Else
        val = 1 - (Steps * StepLength)
    EndIf
    libs.log("Difficulty modifier applied: " + val + " [setting: " + mcmValue + "]")
    return val
EndFunction

 

So what we know is quest items will always get a value 1.0, but what if it's a timed restraint you buy from a shop or give with console... First, it was called with operator = false, and from "Vanilla" to "Born slave" that is 9 difficulty levels. So what we get with difficulty 0 and 8:

 

mcmValue = 0

mcmLength = 9

median = (9-1)/2 As Int = 4

StepLength = 0.9 / 4 = 0.225

Steps = 0 - 4 = -4

val = 1 - (Steps * StepLength) = 1- (-4 * 0.225) = 1.9  -- Multiplier on easiest difficulty, still doesn't match behavior... I thought 0 or negative. So something else outside the function is not working either.

 

mcmValue = 8

Steps = 8 - 4 = 4

val = 1- (8 * 0.225) = -0.8 -- Multiplier on hardest difficulty. With this it would unlock instantly, easier than the easiest setting.

 

Expected range for val with mcmValue 0..8 is around 0.5 to 1.5 or so. We don't want them to unlock too fast even on easiest difficulty, and not last several weeks on hardest.

 

Edit: Oops, i realize in the DD's MCM menu the first one in the list is actually hardest, so i should have said inverse. 0 = hardest and 8 easiest. But i tried timed restraint with both difficulty ingame (ones given in DCL's esp) and it unlocks instantly both times. I had given all keys to follower but i had the Unlock menu available (by timed release i assume).

I propose a change in timed locks:

Spoiler

Function SetLockShield()
	If (LockShieldTimerMin > 0.0) && (LockShieldTimerMin <= LockShieldTimerMax)
		if LockShieldTimerMin == LockShieldTimerMax
			LockShieldTimer = LockShieldTimerMin
		else
			LockShieldTimer = CalculateTimerModifier(LockShieldTimerMin, LockShieldTimerMax)
		endif
	Else
		LockShieldTimer = 0.0
	EndIf
EndFunction
                                                                              
Function SetLockTimer()
	If (LockTimerMin > 0.0) && (LockTimerMin <= LockTimerMax)
		if LockTimerMin == LockTimerMax
			LockTimer = LockTimerMin
		else
			LockTimer = CalculateTimerModifier(LockTimerMin, LockTimerMax)
		endIf
	Else
		LockTimer = 0.0
	EndIf
EndFunction

Float Function CalculateTimerModifier(float timerMin, float timerMax)
	; We don't modify for quest items
	If deviceInventory.HasKeyword(libs.zad_BlockGeneric) || deviceRendered.HasKeyword(libs.zad_BlockGeneric) || deviceInventory.HasKeyword(libs.zad_QuestItem) || deviceRendered.HasKeyword(libs.zad_QuestItem)
		; except the modder specifically allowed the system to be used for that item!
		If !AllowDifficultyModifier
			libs.log("Difficulty timer modifier not applied - custom/quest item!")
			return Utility.RandomFloat(timerMin,timerMax)
		EndIf
	EndIf
	Float timerRange = timerMax - timerMin
	;use escape difficulty for calculations
	Int mcmValue = libs.config.EscapeDifficulty	
	Int mcmLength = libs.config.EsccapeDifficultyList.Length
	Float StepLength = timerRange / mcmLength
	;let's call it escape chance instead - from zero to max
	float upperTargetBound = timerMax - mcmValue * StepLength
	float lowerTargetBound = timerMax - (mcmValue + 1) * StepLength
	float val = timerMin
	float fateValue = Utility.randomFloat(0.0,1.0)
	if fateValue < 0.2
		; lower range selected
		val = Utility.randomFloat(timerMin,lowerTargetBound)
	elseif fateValue < 0.37
		; upper range selected
		val = Utility.randomFloat(upperTargetBound,timerMax)
	else
		; target range selected
		val = Utility.randomFloat(lowerTargetBound,upperTargetBound)
	endIf
	;sanity checks just because
	if val < timerMin
		val = timerMin
	endIf
	if val > timerMax
		val = timerMax
	endIf
	libs.log("Difficulty timer modifier applied: " + val + " [setting: " + mcmValue + "]")
	return val
EndFunction
                                                            
                                                                              

 

The goals are:

1. when timer bounds are equal, just return one of them and don't bother with randomization - obviously, item creator have procise idea of what time he need.

2. when bounds aren't equal, we need to apply difficulty level. This is done by calculating target range inside provided minimum and maximum lock times. Then, there is 20% probability to get random time lower then target, 17% probability to get random time higher then target, and 53% probability to get lock time from inside the target. Theoretically, it skews probability of getting longer locked intervals on higher difficulty levels, while maintaining randomness.

3. Quest items without difficulty modifier get uniformly random lock time from inside the provided range.

P.S. While I managed to compile zadEquipScript with my modifications, I haven't tested it in game yet, as I don't have ready made timed restraints to test.

Posted
42 minutes ago, DeWired said:

I propose a change in timed locks ...

I had also made a typo in val = 1- (8 * 0.225), should have been val = 1- (4 * 0.225). That's what we get trying to run code in our heads ? The results look more reasonable, although 0.1 multiplier with easiest is too easy.

 

As for why timed restraints don't work, i didn't want to look into it much more unless @Kimy asks for help. The little bit i've checked is that zadEquipScript is inherited in the other device scripts. But we would have to do papyrus debugging to know more, and DD development is on pause so...

Posted
1 hour ago, Zaflis said:

I had also made a typo in val = 1- (8 * 0.225), should have been val = 1- (4 * 0.225). That's what we get trying to run code in our heads ? The results look more reasonable, although 0.1 multiplier with easiest is too easy.

 

As for why timed restraints don't work, i didn't want to look into it much more unless @Kimy asks for help. The little bit i've checked is that zadEquipScript is inherited in the other device scripts. But we would have to do papyrus debugging to know more, and DD development is on pause so...

About timed restraints not working - look in TES5Edit, maybe your modified versions are overwritten by originals from some other mod. For example, hobble dress from DDx mentioned in your earlier post in my setup is overwritten by two other mods.

Posted
1 hour ago, DeWired said:

About timed restraints not working - look in TES5Edit, maybe your modified versions are overwritten by originals from some other mod. For example, hobble dress from DDx mentioned in your earlier post in my setup is overwritten by two other mods.

Nope, ESP mods can't be overridden by other ESP mods, Skyrim limitation. It would have to be converted to ESM first. The timed restraints are from cursed loot esp, and i made a copy of it just to edit their shown names. Just so i can search with word "timed" in console. Specifically i tried with those timed boots last time.

 

Spoiler

timed.png.3b639ecab46f98cd455931663be66059.png

 

Posted
16 hours ago, cobra420 said:

where can i get a copy of ddi 4.0 or 4.1? it is required for slaverun reloaded. i have 4.3 now. 

There is a fix floating in Slaverun thread. The fix let´s you use DDi 4.3 without hassle. Just Google Skyrim +Slaverun + DDi +4.3. Should point to page 212. Start your search from there, because there is more than one script fix floating around.

Posted

After some digging I finally found out why the modevents from DDI where not working (properly). Not sure if this is the best place to post it but here goes:

 

The search started with the log lines regarding the removal event:

[Zad]: Player has failed to escape Harness
ERROR: Type mismatch for argument 1. Type mismatch for argument 2. 

 

After backtracking the scripts I found the error to be in the registering of the mod event in the zadlibs script file. The modevent is cast/required as a form, float, bool or int but pushed as an actor, keyword, armor etc. So that won't work. (the bool one does). So as per creationkit.com example I modified the script (starting at line 1632) to remedy this:

 

Function SendDeviceEquippedEventVerbose(armor inventoryDevice, keyword deviceKeyword, actor akActor)	
	Int Handle = ModEvent.Create("DDI_DeviceEquipped")
	If (Handle)		
		ModEvent.PushForm(Handle, inventoryDevice as Form)
		ModEvent.PushForm(Handle, deviceKeyword as Form)
		ModEvent.PushForm(Handle, akActor as Form)		
		ModEvent.Send(Handle)
	Endif	
EndFunction

Function SendDeviceRemovedEventVerbose(armor inventoryDevice, keyword deviceKeyword, actor akActor)
	Int Handle = ModEvent.Create("DDI_DeviceRemoved")
	If (Handle)		
		ModEvent.PushForm(Handle, inventoryDevice as Form)
		ModEvent.PushForm(Handle, deviceKeyword as Form)
		ModEvent.PushForm(Handle, akActor as Form)		
		ModEvent.Send(Handle)
	Endif
EndFunction

Function SendDeviceKeyBreakEventVerbose(armor inventoryDevice, keyword deviceKeyword, actor akActor)	
	Int Handle = ModEvent.Create("DDI_KeyBreak")
	If (Handle)		
		ModEvent.PushForm(Handle, inventoryDevice as Form)
		ModEvent.PushForm(Handle, deviceKeyword as Form)
		ModEvent.PushForm(Handle, akActor as Form)		
		ModEvent.Send(Handle)
	Endif	
EndFunction

Function SendDeviceJamLockEventVerbose(armor inventoryDevice, keyword deviceKeyword, actor akActor)	
	Int Handle = ModEvent.Create("DDI_JamLock")
	If (Handle)		
		ModEvent.PushForm(Handle, inventoryDevice as Form)
		ModEvent.PushForm(Handle, deviceKeyword as Form)
		ModEvent.PushForm(Handle, akActor as Form)		
		ModEvent.Send(Handle)
	Endif	
EndFunction

Function SendDeviceEscapeEvent(armor inventoryDevice, keyword deviceKeyword, bool successful)	
	Int Handle = ModEvent.Create("DDI_DeviceEscapeAttempt")
	If (Handle)		
		ModEvent.PushForm(Handle, inventoryDevice as Form)
		ModEvent.PushForm(Handle, deviceKeyword as Form)
		ModEvent.PushBool(Handle, successful)		
		ModEvent.Send(Handle)
	Endif	
EndFunction

////////////////////////Line 2488////////////////////////////////////

Function SendGagEffectEvent(actor akActor, bool isRemove)
    Int Handle = ModEvent.Create("DDI_GagExpressionStateChange")
    If (Handle)    
        ModEvent.PushForm(Handle, akActor as Form)
        ModEvent.PushBool(Handle, isRemove)
        ModEvent.Send(Handle)
    Endif  
EndFunction

This also requires the hooking of the events to change. For example using the "No Escape" rule of the Devious follower framework of @Kimy 's mod Cursed Loot

 

To "change" the form back into it's intended type (armor, keyword and actor in this example) I tried a proof of concept script like this. With the proper event parameters and the "recasting".

 

Event OnDeviceEscapeAttempt(form inventoryDevice, form deviceKeyword, bool successful)                
    ...
EndEvent


Event DDP_OnDeviceRemoved(form inventoryDevice, form deviceKeyword, form akActor)
	...
        libs.EquipDevice(libs.PlayerRef, inventoryDevice as Armor, libs.GetRenderedDevice(inventoryDevice as Armor), deviceKeyword as Keyword, skipmutex = True)
	...
EndEvent

 

Posted

Hello everyone, i have a strange bug in game, i can't see DDx equipment EQUIPPED on player....i can see it in inventory though...can someone help me? I run bodyslide, selected the preset, batch builded everything.

 

Path: C\..bla bla bla...skyrim\data\meshes\bondage

 

Posted
49 minutes ago, Garagulu said:

won't work :(...

Do you have a modern launcher like MO2 or Vortex? It would be easier to install mods with them because you get an actual installer similar to how you install games and software. No longer need to deal with extracting zip or 7z packages. But to get your game usable with those you would have to clean up your entire skyrim data folder from every mod. They will no longer be installed there in the future. Even if you uninstall whole Skyrim from Steam your mods would still be safe, i like it better that way.

 

Either way reinstall DD-Assets, Integration and Expansion again. That is also the order they should be in the load order. But you can also install LOOT to let it work out the whole load order for you. But if you still are using the old ways with zip and 7z, know that you cannot just extract the files directly as is in Skyrim\data\. When you see folders like "01 UUNP", think of it as Data\ folder itself. Don't install both CBBE and UUNP, choose one, and also the Core files. But again if you used the actual installer you wouldn't need to deal with anything this complicated.

Posted
10 hours ago, Zaflis said:

Do you have a modern launcher like MO2 or Vortex? It would be easier to install mods with them because you get an actual installer similar to how you install games and software. No longer need to deal with extracting zip or 7z packages. But to get your game usable with those you would have to clean up your entire skyrim data folder from every mod. They will no longer be installed there in the future. Even if you uninstall whole Skyrim from Steam your mods would still be safe, i like it better that way.

 

Either way reinstall DD-Assets, Integration and Expansion again. That is also the order they should be in the load order. But you can also install LOOT to let it work out the whole load order for you. But if you still are using the old ways with zip and 7z, know that you cannot just extract the files directly as is in Skyrim\data\. When you see folders like "01 UUNP", think of it as Data\ folder itself. Don't install both CBBE and UUNP, choose one, and also the Core files. But again if you used the actual installer you wouldn't need to deal with anything this complicated.

Yes i use vortex and i am very happy! Never installed a mod manually unless strictly reccomended....

always sorted my plugins with LOOT

And obviously i just use uunp.... I am not a total newby of modding, but can't find a solution :(

Posted
13 hours ago, Garagulu said:

Yes i use vortex and ...

Also started Bodyslide from Vortex, selected UUNP HDT preset and run batch build?

Posted
1 hour ago, Sucker343 said:

devious devices equipped by mods do not lock or show up n body. I can remove them like any other armor from inventory. help.

1. Do you have iEquip?

 

2. Does DD have MCM menus?

 

3. If you give yourself restraints with console command, will they lock? Alternatively download AddItemMenu mod, if you are less familiar with console. Don't mix with zbf* starting restraint names, ZAP restraints do not lock.

 

Either way we can't do much with that little info, this does not happen normally or ever. Posting your "load order" and "install order" might be a good start. Find a way to copy paste them from your mod launcher as text into forum spoiler here or file attachment. Only other tip i can give is to reinstall DD.

Posted
12 minutes ago, Zaflis said:

1. Do you have iEquip?

 

2. Does DD have MCM menus?

 

3. If you give yourself restraints with console command, will they lock? Alternatively download AddItemMenu mod, if you are less familiar with console. Don't mix with zbf* starting restraint names, ZAP restraints do not lock.

 

Either way we can't do much with that little info, this does not happen normally or ever. Posting your "load order" and "install order" might be a good start. Find a way to copy paste them from your mod launcher as text into forum spoiler here or file attachment. Only other tip i can give is to reinstall DD.

1. iEquip installed.

 

2. DD does have MCM

 

3. yes and yes item from additemmenu also works.

 

4. self bondage from DD equip cause CTD or nothing.

Posted
14 minutes ago, Zaflis said:

thanks. I will just remove iEquip.

 

Cursed loot quest was completely bugged because of the issue. I had to remove cursed loot. now i can install it again. i had iEquip before cursed loot but this bug started to show up after i install DCL. but it was not limited to DCL, all other DD mod started causing the problem.

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...