Jump to content

Dynamic Armor Variant - Keywords


Recommended Posts

Posted (edited)
5 hours ago, michel1234 said:

Needs some patches to come out for clothing packs 

Also does it behave well with the curtain keywords?

 

It will add or remove whatever keywords you want. 

Edited by nagothm
Posted

The new version working perfectly reversing clothing back to their normal version. Ty so much for this. Gonna start playing around with your keyword feature cause i think it might solve one of my issue playing with IED where i have to choose between having weapons display during scene or not having them display at all wearing certain armor. Does the reset function introduce in new version reverse the keyword that got add on to the armor as well or just the model?

Posted (edited)
On 9/18/2026 at 11:31 AM, DipSh8t said:

The new version working perfectly reversing clothing back to their normal version. Ty so much for this. Gonna start playing around with your keyword feature cause i think it might solve one of my issue playing with IED where i have to choose between having weapons display during scene or not having them display at all wearing certain armor. Does the reset function introduce in new version reverse the keyword that got add on to the armor as well or just the model?

You are welcome, and the reset reverses both the model and the keywords.

Edited by nagothm
Posted (edited)

Hi, thanks for making this.

Quick question: does DAVKeywords support replaceBySlot, or only replaceByForm?

I have a DAV config that hides armor by slot, like "replaceBySlot": { "32": "Skyrim.esm|000D67" }, with addKeywords and removeKeywords on the same variant. At startup everything resolves — the log says Resolved 20 addKeywords, 50 removeKeywords, and 35 replacement form mappings, with no failures. But nothing happens in game, and with VerboseLog = 1 there are no runtime lines at all.

Those 35 form mappings all come from other mods' configs that use replaceByForm. My slot-based variants contribute zero, which makes me think slot matching isn't supported.

Is that right? And if so, would you consider adding it? One slot rule could cover every armor in that slot instead of listing every outfit by FormID.

I basically want it to say for example by advanced nudity detection to be considered topless if slot 32 is used anything other than default (e.g. hidden, loosentop), slot 52 exposed bottoms if anything other than default on slot 52 which is for the modesty animation, bonus points if npc can detect it by Advanced nudity detection

Edited by Evanderxx
more clarification
Posted
3 hours ago, Evanderxx said:

Hi, thanks for making this.

Quick question: does DAVKeywords support replaceBySlot, or only replaceByForm?

I have a DAV config that hides armor by slot, like "replaceBySlot": { "32": "Skyrim.esm|000D67" }, with addKeywords and removeKeywords on the same variant. At startup everything resolves — the log says Resolved 20 addKeywords, 50 removeKeywords, and 35 replacement form mappings, with no failures. But nothing happens in game, and with VerboseLog = 1 there are no runtime lines at all.

Those 35 form mappings all come from other mods' configs that use replaceByForm. My slot-based variants contribute zero, which makes me think slot matching isn't supported.

Is that right? And if so, would you consider adding it? One slot rule could cover every armor in that slot instead of listing every outfit by FormID.

I basically want it to say for example by advanced nudity detection to be considered topless if slot 32 is used anything other than default (e.g. hidden, loosentop), slot 52 exposed bottoms if anything other than default on slot 52 which is for the modesty animation, bonus points if npc can detect it by Advanced nudity detection

Yeah, I screwed that up sorry.  I accidentally broke the link to that replacebyslot function.  I will fix it.

Posted
27 minutes ago, nagothm said:

Yeah, I screwed that up sorry.  I accidentally broke the link to that replacebyslot function.  I will fix it.

Got it, thank you so much for the mod by the way.

For more information only if needed, replaceByForm does work on my end, I switched my slot rules over to form mappings and the keywords fired correctly. So it looks like it's just the slot path.

Posted (edited)

New version is up. I worked out some bugs in the code making it a little faster (honestly not something anyone would have noticed, but every little bit counts.).  It also corrects my breaking of the replaceBySlot function.  Should be working correctly now.  I also added a configurable cooldown to how long after a sexlab scene before DAV switches any "open" ARMA swaps back to their normal setting.  It is lightly tested with no issues i could find.  I probably won't have much time over the next few days if another issue crops up, so just report it if you find it, I'll get to it when I am able.

Edited by nagothm
Posted (edited)
1 hour ago, nagothm said:

New version is up. I worked out some bugs in the code making it a little faster (honestly not something anyone would have noticed, but every little bit counts.).  It also corrects my breaking of the replaceBySlot function.  Should be working correctly now.  I also added a configurable cooldown to how long after a sexlab scene before DAV switches any "open" ARMA swaps back to their normal setting.  It is lightly tested with no issues i could find.  I probably won't have much time over the next few days if another issue crops up, so just report it if you find it, I'll get to it when I am able.

Hey, thanks for turning that around so fast. Slot 32 is now tagging perfectly. It fixes so much and slot 32 works perfectly now. But now i have some requests if you could (it is completely okay if you don't want them, since you are the creator)
 

Two things I've run into, no rush on either:

Variants that hide a piece don't tag. I use DAV to hide armor, so the replacement ARMA has no model, nothing renders, by design. Since no skeleton node gets created, IsReplacementARMARendered never matches it. Across 500+ matches in my verbose log it only ever shows the one replacement that has a real mesh; the model-less one doesn't appear once. So "hide this slot" variants can't tag at all, and I think that's a fairly common way people use DAV. Would it be possible to read variant state from DAV itself rather than inferring it from the skeleton?
For example, I like that if when i hide slot 52 underwear (from TAWOBA for example) then the player character will hide her bottom, and A.N.D will detect it as exposed bottom. currently, it works perfect on slot 32
 

Keywords often need a re-equip. After switching a variant the keywords usually don't update until I unequip and re-equip the item. Looks like the node check runs before the 3D rebuild finishes and doesn't retry, so it misses the new node until the next equip event.
Like for example I wear iron armor slot 32, then i hide it, i need to re-equip it so that it works okay (A.N.D detect it as topless/naked and PC covers her top or top and bottoms depends if slot 52 is equipped or not)
 

But still, thank you so much again, the slot 32 side is working perfectly

Edited by Evanderxx
Posted (edited)
15 minutes ago, Evanderxx said:

Hey, thanks for turning that around so fast — slot 32 is tagging perfectly now. It fixes so much and slot 32 works perfectly now. But now i have some requests if you could (it is completely okay if you don't want them, since you are the creator)

Two things I've run into, no rush on either:

Variants that hide a piece don't tag. I use DAV to hide armor, so the replacement ARMA has no model, nothing renders, by design. Since no skeleton node gets created, IsReplacementARMARendered never matches it. Across 500+ matches in my verbose log it only ever shows the one replacement that has a real mesh; the model-less one doesn't appear once. So "hide this slot" variants can't tag at all, and I think that's a fairly common way people use DAV. Would it be possible to read variant state from DAV itself rather than inferring it from the skeleton?
For example, I want that when i hide slot 52 underwear (from TAWOBA for example) then the player character will hide her bottom, and A.N.D will detect it as exposed bottom. currently, it works perfect on slot 32
 

Keywords often need a re-equip. After switching a variant the keywords usually don't update until I unequip and re-equip the item. Looks like the node check runs before the 3D rebuild finishes and doesn't retry, so it misses the new node until the next equip event.
Like for example I wear iron armor slot 32, then i hide it, i need to re-equip it so that it works okay (A.N.D detect it as topless/naked and PC covers her top or top and bottoms depends if slot 52 is equipped or not)
 

But still, thank you so much again, the slot 32 side is working perfectly

I played with something kind of similar(kinda sorta maybe similar)  a couple weeks ago reading from keywords rather than the skeleton.  I couldn't get it working properly. (mine was trying to figure out a way to basically make all body and facial piercings combined to use one bodyslot, but still be able to be selected individually and hidden or displayed only by their keywords.)  I am still working with it, and if I get an idea that might work for that I'll try it out.   On the keywords needing a re-equip, can you give me a sample json that you are using?  I haven't ran into that issue at all on mine, but my state declarations might not be as intricate.  I'll take a look and see what I can do.  Likely no result for a few days though.

Edited by nagothm
Posted (edited)
53 minutes ago, nagothm said:

I played with something kind of similar(kinda sorta maybe similar)  a couple weeks ago reading from keywords rather than the skeleton.  I couldn't get it working properly. (mine was trying to figure out a way to basically make all body and facial piercings combined to use one bodyslot, but still be able to be selected individually and hidden or displayed only by their keywords.)  I am still working with it, and if I get an idea that might work for that I'll try it out.   On the keywords needing a re-equip, can you give me a sample json that you are using?  I haven't ran into that issue at all on mine, but my state declarations might not be as intricate.  I'll take a look and see what I can do.  Likely no result for a few days though.

Here's my config. Two things that might explain why you haven't hit the re-equip issue: it's entirely replaceBySlot, no replaceByForm anywhere, and I have no states block at all even when I switch everything manually through the DAV menu rather than by conditions. So if you've been testing with form-based variants and state declarations, our setups are pretty different.

The re-equip behaviour shows up on DAV_HiddenSlot32 , hide a slot-32 armor from the menu, and the keywords usually dont apply until I unequip and re-equip the piece. but sometimes too it works like normal (i dont need to reequip)

Spoiler

json:

{
  "$schema": "https://raw.githubusercontent.com/Exit-9B/DynamicArmorVariants/main/docs/DynamicArmorVariants.schema.json",
  "variants": [
    {
      "name": "DAV_HiddenCirclet",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "42": "DAV_HiddenEquipment.esp|800"
      }
    },
    {
      "name": "DAV_HiddenHelmet",
      "displayName": "$Hidden",
      "linkTo": "DAV_HiddenCirclet",
      "overrideHead": "showAll",
      "replaceBySlot": {
        "30": "DAV_HiddenEquipment.esp|801",
        "31": "DAV_HiddenEquipment.esp|801"
      }
    },
    {
      "name": "DAV_HiddenBackpack",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "47": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenCloak",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "46": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot32",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "32": "Skyrim.esm|000D67"
      },
      "addKeywords": [
        "Modesty",
        "AND_ArmorTop_NoCover"
      ],
      "removeKeywords": [
        "NoModestyTop",
        "AND_ArmorTop",
        "AND_CoversAll",
        "AND_ChestCurtain",
        "AND_Bra"
      ]
    },
    {
      "name": "DAV_HiddenSlot33",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "33": "Skyrim.esm|000D6C"
      }
    },
    {
      "name": "DAV_HiddenSlot37",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "37": "Skyrim.esm|000D6E"
      }
    },
    {
      "name": "DAV_HiddenSlot34",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "34": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot35",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "35": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot36",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "36": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot38",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "38": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot39",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "39": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot40",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "40": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot41",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "41": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot43",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "43": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot44",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "44": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot45",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "45": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot48",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "48": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot49",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "49": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot52",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "52": "DAV_HiddenEquipment.esp|802"
      },
      "addKeywords": [
        "TNG_RevealingOnlyWomen",
        "AND_ArmorBottom_NoCover"
      ],
      "removeKeywords": [
        "NoModestyBottom",
        "AND_ArmorBottom",
        "AND_PelvicCurtain",
        "AND_Underwear",
        "AND_Thong"
      ]
    },
    {
      "name": "DAV_HiddenSlot53",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "53": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot54",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "54": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot55",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "55": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot56",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "56": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot57",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "57": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot58",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "58": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "DAV_HiddenSlot59",
      "displayName": "$Hidden",
      "replaceBySlot": {
        "59": "DAV_HiddenEquipment.esp|802"
      }
    },
    {
      "name": "loosenBra",
      "addKeywords": [
        "Modesty",
        "AND_ArmorTop_NoCover"
      ],
      "removeKeywords": [
        "NoModestyTop",
        "AND_ArmorTop",
        "AND_CoversAll",
        "AND_ChestCurtain",
        "AND_Bra"
      ]
    },
    {
      "name": "loosenTop",
      "addKeywords": [
        "Modesty",
        "AND_ArmorTop_NoCover"
      ],
      "removeKeywords": [
        "NoModestyTop",
        "AND_ArmorTop",
        "AND_CoversAll",
        "AND_ChestCurtain",
        "AND_Bra"
      ]
    },
    {
      "name": "Unbotton",
      "addKeywords": [
        "Modesty",
        "AND_ArmorTop_NoCover"
      ],
      "removeKeywords": [
        "NoModestyTop",
        "AND_ArmorTop",
        "AND_CoversAll",
        "AND_ChestCurtain",
        "AND_Bra"
      ]
    },
    {
      "name": "loosenPanty",
      "addKeywords": [
        "TNG_RevealingOnlyWomen",
        "AND_ArmorBottom_NoCover"
      ],
      "removeKeywords": [
        "NoModestyBottom",
        "AND_ArmorBottom",
        "AND_PelvicCurtain",
        "AND_Underwear",
        "AND_Thong"
      ]
    },
    {
      "name": "LiftSkirt",
      "addKeywords": [
        "TNG_RevealingOnlyWomen",
        "AND_ArmorBottom_NoCover"
      ],
      "removeKeywords": [
        "NoModestyBottom",
        "AND_ArmorBottom",
        "AND_PelvicCurtain",
        "AND_Underwear",
        "AND_Thong"
      ]
    },
    {
      "name": "RipPantyhose",
      "addKeywords": [
        "TNG_RevealingOnlyWomen",
        "AND_ArmorBottom_NoCover"
      ],
      "removeKeywords": [
        "NoModestyBottom",
        "AND_ArmorBottom",
        "AND_PelvicCurtain",
        "AND_Underwear",
        "AND_Thong"
      ]
    },
    {
      "name": "Undress",
      "addKeywords": [
        "Modesty",
        "AND_ArmorTop_NoCover",
        "TNG_RevealingOnlyWomen",
        "AND_ArmorBottom_NoCover"
      ],
      "removeKeywords": [
        "NoModestyTop",
        "AND_ArmorTop",
        "AND_CoversAll",
        "AND_ChestCurtain",
        "AND_Bra",
        "NoModestyBottom",
        "AND_ArmorBottom",
        "AND_PelvicCurtain",
        "AND_Underwear",
        "AND_Thong"
      ]
    },
    {
      "name": "loosenDress",
      "addKeywords": [
        "Modesty",
        "AND_ArmorTop_NoCover",
        "TNG_RevealingOnlyWomen",
        "AND_ArmorBottom_NoCover"
      ],
      "removeKeywords": [
        "NoModestyTop",
        "AND_ArmorTop",
        "AND_CoversAll",
        "AND_ChestCurtain",
        "AND_Bra",
        "NoModestyBottom",
        "AND_ArmorBottom",
        "AND_PelvicCurtain",
        "AND_Underwear",
        "AND_Thong"
      ]
    }
  ]
}

 

 

Edited by Evanderxx
Posted
1 hour ago, Evanderxx said:

Here's my config. Two things that might explain why you haven't hit the re-equip issue: it's entirely replaceBySlot, no replaceByForm anywhere, and I have no states block at all even when I switch everything manually through the DAV menu rather than by conditions. So if you've been testing with form-based variants and state declarations, our setups are pretty different.

The re-equip behaviour shows up on DAV_HiddenSlot32 , hide a slot-32 armor from the menu, and the keywords usually dont apply until I unequip and re-equip the piece. but sometimes too it works like normal (i dont need to reequip)

  Reveal hidden contents

 

 

I had this envisioned differently, and you are right, I hadn't ever used the replacebyslot (i honestly had forgotten completely about it which is why i bungled the other implementation.)  If there is a delay, it is not coming from the json, as your code is pretty frugal.  I will take a look when I can and see if I can figure it out. Probably not till end of the week.

Posted
7 hours ago, nagothm said:

I had this envisioned differently, and you are right, I hadn't ever used the replacebyslot (i honestly had forgotten completely about it which is why i bungled the other implementation.)  If there is a delay, it is not coming from the json, as your code is pretty frugal.  I will take a look when I can and see if I can figure it out. Probably not till end of the week.

Yeah don't worry take your time, no rush. And again, thank you for the mod !

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