CaptainJ03 Posted December 28, 2024 Posted December 28, 2024 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?
IcicleInn Posted December 29, 2024 Posted December 29, 2024 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 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
CaptainJ03 Posted December 29, 2024 Author Posted December 29, 2024 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...
IcicleInn Posted December 29, 2024 Posted December 29, 2024 (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 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 December 29, 2024 by IcicleInn
bandetlol Posted April 6, 2025 Posted April 6, 2025 (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 April 6, 2025 by bandetlol 1
bandetlol Posted April 6, 2025 Posted April 6, 2025 (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 April 6, 2025 by bandetlol
bandetlol Posted April 6, 2025 Posted April 6, 2025 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"] },
bandetlol Posted November 29, 2025 Posted November 29, 2025 "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"], 1
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now