Jump to content

OBody blacklistedOutfits don't work on Devious Devices


Recommended Posts

Posted

Hi folks,

 

as said before, started on AE only four weeks ago, and I still don't see why everybody claims that this is sooo much better... but I don't want to discuss that here.

 

With OBody, there's the option to automatically add a pushup effect on the boobs when wearing armour, but as some of these are only a piece of nothingness, or leave the breasts exposed despite using slot 32, the author gives you the opportunity to have outfits blacklisted from this effect in a OBody_presetDistributionConfig.json which even comes with a comprehensible instruction.

 

This works for various outfits - but not for DDs. (talking of open chested staightjackets in this case, and I am aware that the mod uses the american spelling)

 

I've tried putting the names of the outfits in the appropriate section - nothing. (works wit stuff from other mods, though)

I've tried to use the form IDs in another section - nope.

Even tried to blacklist the whole "Devious Devices - Expansion.esp" - no, nothing. (works with other esp's)

 

When I disable ORefit in the mod's MCM, that works, so breast physics aren't bugged in general...

 

I am aware the Devious Lore changes the names from Ebonite to Waxed or Oil - but the instructions say, write them as they appear in-game. And ID-wise this shouldn't matter at all.

 

Any ideas?

 

Posted

I'm not sure what's causing your issue.  I am also using oBody and DDs, but my DD sets don't tend to trigger the oRefit items.  Certainly my open straitjackets aren't causing it and I haven't done any particular thing to prevent it.  I am not using Devious Lore, which is one difference from your setup but I have an example of Nude > Open Strait  > Orefit set here on my setup:

Spoiler

image.png.b9bb2e34f704ce08ae38a3ed4fc06b8a.png

I am using the oBody Master List JSON download, but since it also doesn't call out DD specifically I'm really at a loss...

 

OBody Next Generation ORefit JSON Master List at Skyrim Special Edition Nexus - Mods and Community

Posted
7 hours ago, IcicleInn said:

I am also using oBody and DDs, but my DD sets don't tend to trigger the oRefit items.  Certainly my open straitjackets aren't causing it and I haven't done any particular thing to prevent it. 

(...)

I am using the oBody Master List JSON download, but since it also doesn't call out DD specifically I'm really at a loss...

 

I just tried this - and it works, for no reason at all. It shouldn't make any difference on straitjackets, as there are, like you said, no DDs inside the masterlist.

 

On the other hand it doesn't work on straitjackets that cover the boobs (or on catsuits), because here I'd expect ORefit to trigger and squish the boobs.

So this is replacing one bug with another...

 

 

Posted (edited)

The mysteries deepen.

 

All things being equal, I probably prefer nosquish when there is supposed to be squish than the opposite.  I'll see if I can't figure out how to add catsuits or closed top jackets to the "force refit" and see if that breaks anything.

 

Post Testing Edit:

It looks like it works for me, putting the name of the specific outfits to under the   "outfitsForceRefit" list.  Test case done with "Red Leather Straitjacket" since one of my mods also has a "Comfortable Red Leather Straitjacket" which means I can check the differences without having to relaunch the game.

Spoiler

image.png.5fabc1dc373d5be88200c4b94c72b85c.png

 

The downside is entering the name of every single DD outfit you want Refitted is gonna be a pain, and I also don't know if this resolves your renaming issue with Devious Lore.  I just added it to the Master Json file fwiw.

Edited by IcicleInn
  • 3 months later...
Posted (edited)
On 12/28/2024 at 12:34 PM, CaptainJ03 said:

 

 

I am aware the Devious Lore changes the names from Ebonite to Waxed or Oil - but the instructions say, write them as they appear in-game. And ID-wise this shouldn't matter at all.

 

Any ideas?

 

 

Here's the issue.

 

DD items are actually 2 items, the inventory item and the rendered item.

Setting the name of the inventory item does nothing because orefit is refitting the rendered item.

 

The rendered item has no name.

 

Take, for example, this Red Rope Armbinder. If i type "Red Rope Armbinder" under blacklisted outfits, does nothing. I actually gotta type the name of the rendered item there. It has no name. So, I need to take its FORMID and place it in the blacklisted outfits by formid section

 

Opening up devious devices expansion esm in sseedit, youll see two items, their editorid's are

zadx_armbinder_rope_red_rendered

zadx_Armbinder_Rope_Red_Inventory

 

The one you want is the rendered one. It has a formid of 070592C9

 

So you place it in the json as so.

 

 

for example.

 

    "blacklistedOutfitsFromORefitFormID": {        
        "Devious Devices - Expansion.esm": ["592C9"]
    },

 

 

 

Edited by bandetlol
Posted (edited)

To facilitate this, I got ai to make a python script for me (FUUUUTUUUUUUUUUURE)

 

Useage:

1. Use bethkit to convert a plugin to XML format, the python parses an xml to get the formids

https://www.nexusmods.com/skyrimspecialedition/mods/120516?tab=description

2. run the python script

3. you will be asked for several variables.

3a. first variable is the path to the xml file for processing

3b. the script looks for items with editor id having two keywords, one is "Rendered" the second is user input. For example, you would input Armbinder and then it would get a list of all the rendered armbinders. You can input more than one keytword here, so you can do like armbinder, elbowbinder, boxbinder, open, topless, etc

3c. the third variable is the name of the plugin, so the output can easily be pasted into the orefit config.

 

example output

Quote

XML ID Extractor - For items with 'Rendered' and another keyword in EDID
Enter the full path to your XML file: B:\Rovaan\tools\DeviousDevicesExpansion_converted.xml
Enter the second keyword to look for (along with 'Rendered'): Elbowbinder
Enter the variable name for the output format: Devious Devices - Expansion.esm
Starting to parse B:\Rovaan\tools\DeviousDevicesExpansion_converted.xml...
Looking for EDIDs containing 'Elbowbinder' and 'Rendered'
This may take a while for large files. Please wait...
Processed 1000 items...
Processed 2000 items...
Parsing complete. Found 6 matching items.

Formatted Output:
"Devious Devices - Expansion.esm": ["31018"],
                "Devious Devices - Expansion.esm": ["415a4"],
                "Devious Devices - Expansion.esm": ["415a6"],
                "Devious Devices - Expansion.esm": ["415a8"],
                "Devious Devices - Expansion.esm": ["415aa"],
                "Devious Devices - Expansion.esm": ["415ac"]

Results saved to: B:\Rovaan\tools\Devious Devices - Expansion.esm_ids.txt

Press Enter to exit...

 

import xml.etree.ElementTree as ET
import re
import os
import csv

def extract_ids_by_edid_pattern(xml_file_path, keywords):
    # Primary keywords are fixed
    primary_keywords = ["Rendered", "scriptInstance"]
    
    # Create patterns for each combination of primary and secondary keywords
    patterns = []
    for primary in primary_keywords:
        for secondary in keywords:
            # Pattern checks for both orders: primary...secondary or secondary...primary
            pattern = re.compile(rf'.*{re.escape(secondary)}.*{re.escape(primary)}.*|.*{re.escape(primary)}.*{re.escape(secondary)}.*', re.IGNORECASE)
            patterns.append((primary, secondary, pattern))
    
    # List to store the results
    matches = []
    
    print(f"Starting to parse {xml_file_path}...")
    print(f"Looking for EDIDs containing either 'Rendered' or 'scriptInstance' AND any of these keywords: {', '.join(keywords)}")
    print("This may take a while for large files. Please wait...")
    
    try:
        # Parse the XML file
        context = ET.iterparse(xml_file_path, events=('end',))
        
        count = 0
        for event, elem in context:
            if elem.tag == 'ARMO':
                # Get the ID attribute
                item_id = elem.get('id')
                
                # Look for EDID child element
                edid_elem = elem.find('EDID')
                if edid_elem is not None and edid_elem.text:
                    edid_text = edid_elem.text
                    
                    # Check against each pattern
                    for primary, secondary, pattern in patterns:
                        if (primary.lower() in edid_text.lower() and 
                            secondary.lower() in edid_text.lower() and 
                            pattern.match(edid_text)):
                            
                            # Trim the first three characters from the ID
                            trimmed_id = item_id[3:] if len(item_id) > 3 else item_id
                            
                            # Add to our list
                            matches.append({
                                'edid': edid_text,
                                'id': trimmed_id,
                                'primary': primary,
                                'secondary': secondary
                            })
                            # Once we've found a match, no need to check other patterns
                            break
                
                # Clear element to free memory
                elem.clear()
                
                # Print progress indicator
                count += 1
                if count % 1000 == 0:
                    print(f"Processed {count} items...")
        
        print(f"Parsing complete. Found {len(matches)} matching items.")
        return matches
    
    except Exception as e:
        print(f"Error parsing XML file: {e}")
        return matches

# Get file path from user input
def get_file_path():
    while True:
        file_path = input("Enter the full path to your XML file: ")
        file_path = file_path.strip('"\'')  # Remove any quotes
        
        if os.path.exists(file_path):
            return file_path
        else:
            print(f"File not found: {file_path}")
            print("Please enter a valid file path.")

# Get keywords from user
def get_keywords():
    print("\nEnter keywords to search for (along with 'Rendered' or 'scriptInstance')")
    print("Enter one keyword per line. When finished, enter a blank line.")
    
    keywords = []
    while True:
        keyword = input("Keyword (or blank to finish): ").strip()
        
        if not keyword:
            if not keywords:
                print("Please enter at least one keyword.")
                continue
            else:
                break
        
        keywords.append(keyword)
    
    return keywords

# Get variable name from user
def get_variable_name():
    while True:
        var_name = input("\nEnter the variable name for the output format: ")
        var_name = var_name.strip()
        
        if var_name:
            return var_name
        else:
            print("Please enter a valid variable name.")

# Main execution
if __name__ == "__main__":
    print("XML ID Extractor - For items with 'Rendered' or 'scriptInstance' and keywords in EDID")
    file_path = get_file_path()
    keywords = get_keywords()
    variable_name = get_variable_name()
    
    results = extract_ids_by_edid_pattern(file_path, keywords)
    
    if results:
        # Create the formatted output strings
        output_strings = []
        for item in results:
            output_strings.append(f'"{variable_name}": ["{item["id"]}"]')
        
        # Join with commas and newlines
        formatted_output = ",\n\t\t".join(output_strings)
        
        # Print formatted output
        print("\nFormatted Output:")
        print(formatted_output)
        
        # Save to file
        output_file = os.path.join(os.path.dirname(file_path), f"{variable_name}_ids.txt")
        with open(output_file, 'w') as outfile:
            outfile.write(formatted_output)
        
        print(f"\nResults saved to: {output_file}")
        
        # Save a detailed CSV with all information
        detail_file = os.path.join(os.path.dirname(file_path), f"{variable_name}_details.csv")
        with open(detail_file, 'w', newline='') as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow(['ID', 'EDID', 'Primary Match', 'Secondary Match'])
            for item in results:
                writer.writerow([item['id'], item['edid'], item['primary'], item['secondary']])
        
        print(f"Detailed results saved to: {detail_file}")
    else:
        print("No matching items found.")
    
    input("\nPress Enter to exit...")

 

Edited by bandetlol
Posted

and finally, here is a list of all armbinders and elbowbinders from devious devices expansion to blacklist

 

Quote

    "blacklistedOutfitsFromORefitFormID": {        
        "Devious Devices - Expansion.esm": ["68bdf"],
        "Devious Devices - Expansion.esm": ["486dc"],
        "Devious Devices - Expansion.esm": ["486e4"],
        "Devious Devices - Expansion.esm": ["592c1"],
        "Devious Devices - Expansion.esm": ["592c2"],
        "Devious Devices - Expansion.esm": ["592c5"],
        "Devious Devices - Expansion.esm": ["592c7"],
        "Devious Devices - Expansion.esm": ["592c9"],
        "Devious Devices - Expansion.esm": ["592cb"],
        "Devious Devices - Expansion.esm": ["31018"],
        "Devious Devices - Expansion.esm": ["415a4"],
        "Devious Devices - Expansion.esm": ["415a6"],
        "Devious Devices - Expansion.esm": ["415a8"],
        "Devious Devices - Expansion.esm": ["415aa"],
        "Devious Devices - Expansion.esm": ["415ac"]
        
    },

 

  • 7 months later...
Posted

 "Devious Devices - Integration.esm": ["028A5A"],
        "Devious Devices - Integration.esm": ["068BDE"],
        "Devious Devices - Integration.esm": ["00CA38"],
        "Devious Devices - Integration.esm": ["068BDF"],
        "Devious Devices - Expansion.esm": ["068bdf"],
        "Devious Devices - Expansion.esm": ["0486dc"],
        "Devious Devices - Expansion.esm": ["0486e4"],
        "Devious Devices - Expansion.esm": ["0592c1"],
        "Devious Devices - Expansion.esm": ["0592c2"],
        "Devious Devices - Expansion.esm": ["0592c5"],
        "Devious Devices - Expansion.esm": ["0592c7"],
        "Devious Devices - Expansion.esm": ["0592c9"],
        "Devious Devices - Expansion.esm": ["0592cb"],
        "Devious Devices - Expansion.esm": ["031018"],
        "Devious Devices - Expansion.esm": ["0415a4"],
        "Devious Devices - Expansion.esm": ["0415a6"],
        "Devious Devices - Expansion.esm": ["0415a8"],
        "Devious Devices - Expansion.esm": ["0415aa"],
        "Devious Devices - Expansion.esm": ["0415ac"],
        "Devious Devices - Expansion.esm": ["001dd5"],
        "Devious Devices - Expansion.esm": ["001dd7"],
        "Devious Devices - Expansion.esm": ["001dd9"],
        "Devious Devices - Expansion.esm": ["001dde"],
        "Devious Devices - Expansion.esm": ["001de0"],
        "Devious Devices - Expansion.esm": ["001de2"],
        "Devious Devices - Expansion.esm": ["002353"],
        "Devious Devices - Expansion.esm": ["002359"],
        "Devious Devices - Expansion.esm": ["00235f"],
        "Devious Devices - Expansion.esm": ["02d9df"],
        "Devious Devices - Expansion.esm": ["02d9e1"],
        "Devious Devices - Expansion.esm": ["02d9e3"],
        "Devious Devices - Expansion.esm": ["02d9e5"],
        "Devious Devices - Expansion.esm": ["02d9e7"],
        "Devious Devices - Expansion.esm": ["02d9e9"],
        "Devious Devices - Expansion.esm": ["02d9f1"],
        "Devious Devices - Expansion.esm": ["02d9f3"],
        "Devious Devices - Expansion.esm": ["02d9f5"],
        "Devious Devices - Expansion.esm": ["02d9f7"],
        "Devious Devices - Expansion.esm": ["02d9f9"],
        "Devious Devices - Expansion.esm": ["02d9fb"],
        "Devious Devices - Expansion.esm": ["03acac"],
        "Devious Devices - Expansion.esm": ["04e2ef"],
        "Devious Devices - Expansion.esm": ["04e2f1"],
        "Devious Devices - Expansion.esm": ["04e2f5"],
        "Devious Devices - Expansion.esm": ["04e2fb"],
        "Devious Devices - Expansion.esm": ["04e2fd"],        
        "Devious Devices - Expansion.esm": ["A0000F"],
        "Devious Devices - Expansion.esm": ["A00015"],
        "Devious Devices - Expansion.esm": ["A00017"],
        "Devious Devices - Expansion.esm": ["A0001A"],
        "Devious Devices - Expansion.esm": ["A0001D"],
        "Devious Devices - Expansion.esm": ["0242a"],
        "Devious Devices - Expansion.esm": ["0242c"],
        "Devious Devices - Expansion.esm": ["0242e"],
        "Devious Devices - Expansion.esm": ["02430"],
        "Devious Devices - Expansion.esm": ["56d6b"],
        "Devious Devices - Expansion.esm": ["572d0"],
        "Devious Devices - Expansion.esm": ["10034"],
        "Devious Devices - Expansion.esm": ["1003a"],
        "Devious Devices - Expansion.esm": ["1003c"],
        "Deviously Cursed Loot.esp": ["61ac3"],
        "Deviously Cursed Loot.esp": ["6565e"],
        "Deviously Cursed Loot.esp": ["76121"],
        "Deviously Cursed Loot.esp": ["77cbd"],
        "Deviously Cursed Loot.esp": ["a1398"],
        "Deviously Cursed Loot.esp": ["c0b1d"],
        "Deviously Cursed Loot.esp": ["eb66d"],
        "Deviously Cursed Loot.esp": ["ef756"],
        "Deviously Cursed Loot.esp": ["fb931"],
        "Deviously Cursed Loot.esp": ["0a7d7"],
        "Deviously Cursed Loot.esp": ["177cd"],
        "Deviously Cursed Loot.esp": ["2825d"],
        "Deviously Cursed Loot.esp": ["2825f"],
        "UnforgivingDevices.esp": ["0120b8"],
        "UnforgivingDevices.esp": ["0120ba"],
        "UnforgivingDevices.esp": ["0120c9"],
        "UnforgivingDevices.esp": ["12a11b"],
        "UnforgivingDevices.esp": ["12a11d"],
        "UnforgivingDevices.esp": ["12a11f"],
        "UnforgivingDevices.esp": ["12C17a"],        
        "UnforgivingDevices.esp": ["12C17c"],
        "UnforgivingDevices.esp": ["12D1A7"],
        "UnforgivingDevices.esp": ["132D47"],
        "UnforgivingDevices.esp": ["135873"],
        "UnforgivingDevices.esp": ["154E65"],
        "UnforgivingDevices.esp": ["156EE9"],
        "UnforgivingDevices.esp": ["15B53E"],
        "UnforgivingDevices.esp": ["12D1A9"],
        "UnforgivingDevices.esp": ["12D1AB"],
        "UnforgivingDevices.esp": ["12D1AD"],
        "UnforgivingDevices.esp": ["1342E6"],
        "Deviously Vanilla.esp": ["98c8a"],
        "Deviously Vanilla.esp": ["98c9d"],    

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