Jump to content

Recommended Posts

View File

WARNING: Unattached Instances are a normal part of how Fallout 4 operates. Until I've determined how to distinguish between important unattached instances (still in active use) and the other kind (left behind by mods that were uninstalled), I recommend that you do NOT use the Remove Unattached Instances action on Fallout 4 savefiles.

 

NOTE: If you're having a problem with a savefile, and you want my help, you'll need to post the savefile here in the support thread so that I can run tests on it.

 

WHAT IT DOES

 

ReSaver is a savegame editor for Skyrim Legendary, Skyrim Special Edition, and Fallout 4. It is designed to provide more information that earlier tools, and to work with savefiles that other tools wont touch. It is relatively stable and reliable. Performance has gotten pretty good!

 

The interface is modelled after Save Game Script Cleaner; it's not quite as fast (because of Java instead of super speedy assembly language) but it is actively maintained and has a much richer feature set. Like filtering using regular expressions, and scanning your scripts and esps for context! For Skyrim Legendary, it should read and write saves that exceed the string table limit, as long as you're using Crash Fixes v10 or later.

 

INSTALLATION

  • Unzip the archive into a folder somewhere.
  • Double-click on the file "ReSaver.exe".


INSTRUCTIONS

  • Unzip the FallrimTools archive somewhere.
  • Double-click on ReSaver.exe.
  • Choose your savegame.
  • You should see a tree structure that has all of the save's script elements.


The #1 thing that most people need is to remove script instances that are left behind when a mod is uninstalled.

  • Go to the "Clean" menu and select "Show Unattached Instances". This will filter the list and show only the script instances that aren't attached to anything.
  • Go to the "Clean" menu and select "Remove Unattached Instances".
  • Save to a new file.
  • Load your savegame in Skyrim/Fallout and make sure it's working properly.


ReSaver is quite stable and I use it myself. Fallout 4 support is still new and in a beta state.

 


I have hundreds of mods, including dozens of major quest mods. I NEED a serious save editor. That's why I wrote one. I can't promise that it's perfect. It's possible that it will ruin your savegame, hard drive, childhood, and kidneys all major organ systems. In other words, there is no guarantee of fitness for any particular purpose, etc. But it's pretty good.

 

REQUIREMENTS

  • Java is a requirement -- ReSaver is written entirely in Java.


WHAT YOU CAN DO TO HELP

  • Test the tools! Report any problems! Report any annoyances!
  • Try cleaning a few savegames with ReSaver, see it the new tool works at all.
  • Play with the tool, try to get it to crash in exciting ways. Let me know how you crashed it.
  • Find problems or annoyances with the user interface.


DONATIONS

  • If you would like to donate, Steam gift cards are good, or donations through Nexus.
  • Really, I'll accept anything. :-)
  • Seriously, I'll take a high-five, or a photo your cats. An envelope full of your pubes? Sure!
  • But it's not necessary. I wrote these tools because I love Skyrim and Fallout.


  • Submitter
  • Submitted
    05/06/2016
  • Category
  • Requires
    Java, Skyrim (any) or Fallout 4
  • Special Edition Compatible

 

Link to comment

Just out of curiosity - Crash Fixes 8 has support for the string issue. Are there any other string related issues left when using that?

 

The only two issues with Crash Fixes 8 are

  1. The save files are incompatible with TesVEsse, SaveTool, and Script Scalpel -- which is only a serious issue for people who add and remove mods from their game on a regular basis. But for those people, it's a BIG issue.
  2. A large string table may impact performance when scripts get loaded into memory or garbage collected because of the requirement to maintain the uniqueness of strings.

Ultimately what it comes down to is that Restringer was nearly complete when Crash Fixes 8 was released, so I finished it up and posted it.

 

I'll probably see about writing a new Save Editor for the updated save format, unless someone beats me to it.

Link to comment

Any chance for TES Mod Manager support?

 

Restringer works on mods that are stored in their own directories. So all you need to do is extract mods into folders so that you can load them into Restringer and make a patch. Then install the mod, and install the patch folder over it.

 

The advantage of Mod Organizer is that it stores each mod in its own folder, which makes things really easy.

Link to comment

 

Just out of curiosity - Crash Fixes 8 has support for the string issue. Are there any other string related issues left when using that?

 

The only two issues with Crash Fixes 8 are

  1. The save files are incompatible with TesVEsse, SaveTool, and Script Scalpel -- which is only a serious issue for people who add and remove mods from their game on a regular basis. But for those people, it's a BIG issue.
  2. A large string table may impact performance when scripts get loaded into memory or garbage collected because of the requirement to maintain the uniqueness of strings.

Ultimately what it comes down to is that Restringer was nearly complete when Crash Fixes 8 was released, so I finished it up and posted it.

 

I'll probably see about writing a new Save Editor for the updated save format, unless someone beats me to it.

 

 

 I'm confused, you mean don't run this (your) program with crash fixes?. CrashFixes won't load in Script Scalpel?.

 

Link to comment

Personally I'd still recommend using this as well as the Crash Fixes 8 solution. I purposefully stress tested the stringcount on a save yesterday, using a load order I knew to corrupt a game at start due to a high stringcount. Although it was playable with the CrashFixes 8... after a few hours Sexlab constantly forgot it was installed, DD items forgot they were DD items and Estrus kept having a version check error at reload.

 

I cannot 100% confirm that these issues were the result of the Stringcount value... because before this fix, I wouldn't have been able to load the save to test it.... but I've been going through the same modlist today with this patcher and will run the same sequence to see if there is an impact.

Link to comment

 

 

Just out of curiosity - Crash Fixes 8 has support for the string issue. Are there any other string related issues left when using that?

 

The only two issues with Crash Fixes 8 are

  1. The save files are incompatible with TesVEsse, SaveTool, and Script Scalpel -- which is only a serious issue for people who add and remove mods from their game on a regular basis. But for those people, it's a BIG issue.
  2. A large string table may impact performance when scripts get loaded into memory or garbage collected because of the requirement to maintain the uniqueness of strings.

Ultimately what it comes down to is that Restringer was nearly complete when Crash Fixes 8 was released, so I finished it up and posted it.

 

I'll probably see about writing a new Save Editor for the updated save format, unless someone beats me to it.

 

 

 I'm confused, you mean don't run this (your) program with crash fixes?. CrashFixes won't load in Script Scalpel?.

 

 

 

There should not be a problem running this and still having Crash Fixes in your load order. The issues he mentions are related to saves that crash fixes allows to be playable. If your stringcount goes over the 65k limit, the new CrashFixes will still let it be played, because it removes that 65k limit, but Script Scalpel, Savetool and TesVEsse still have that limitation in their code, and thus will stall and crash when you try to load a save which has a stringcount over 65k, meaning you won't be able to clean a save if you remove a mod.

Link to comment

Personally I'd still recommend using this as well as the Crash Fixes 8 solution. I purposefully stress tested the stringcount on a save yesterday, using a load order I knew to corrupt a game at start due to a high stringcount. Although it was playable with the CrashFixes 8... after a few hours Sexlab constantly forgot it was installed, DD items forgot they were DD items and Estrus kept having a version check error at reload.

 

I cannot 100% confirm that these issues were the result of the Stringcount value... because before this fix, I wouldn't have been able to load the save to test it.... but I've been going through the same modlist today with this patcher and will run the same sequence to see if there is an impact.

Did you report that on the Crash Fixes thread? H38f is a godammed wizard about Skyrim's insides, he can probably help work out whether it's a bug in skyrim or not. There may be a few 16 bit string indices that he missed, so your bug report would help him locate them. :-)
Link to comment

 

Personally I'd still recommend using this as well as the Crash Fixes 8 solution. I purposefully stress tested the stringcount on a save yesterday, using a load order I knew to corrupt a game at start due to a high stringcount. Although it was playable with the CrashFixes 8... after a few hours Sexlab constantly forgot it was installed, DD items forgot they were DD items and Estrus kept having a version check error at reload.

 

I cannot 100% confirm that these issues were the result of the Stringcount value... because before this fix, I wouldn't have been able to load the save to test it.... but I've been going through the same modlist today with this patcher and will run the same sequence to see if there is an impact.

Did you report that on the Crash Fixes thread? H38f is a godammed wizard about Skyrim's insides, he can probably help work out whether it's a bug in skyrim or not. There may be a few 16 bit string indices that he missed, so your bug report would help him locate them. :-)

 

 

I haven't as of yet, I wanted to run a test using your restringer to get the same load order under the string limit, so I knew the only real variable was the string count. (Unless using the Restringer somehow lowers the papyrus script weight of a mod too?)

 

Having ran through the exact same game sequence on both load orders, Im pretty sure of the difference. So Ill throw a post on H3's thread too. Basically, using the exact same load order (only one with string patches, one without), I ran a playthrough up to High Hrothgar. Without restringer (using only the crashfixes) The game was considered instacorrupt on start by Save editors, so it was already over the 65k limit. Problems included the trapped corridors in Bleakfall not running, The Keystone for the Golden Claw Puzzle Door refusing to activate (had to delete the door to get through), Sexlab forgetting it was installed, and prompting me to run its install four separate times, Mod injected conversation topics not showing up, Cursed Loot events triggering but not finishing (As in, a trap would trigger but nothing would happen), and Worn Devious Devices being removable without any contextual boxes, on three separate occasions.

 

I ran your restringer on 14 sets of mods, but kept the load order and mod list the same. Starting stringcount on a new game after everything activated was 55k, and have ran into none of the same errors.

Link to comment

Restring report:  Legacy of the Dragonborn 15.3.4 (plus CACO patch, which alters the horker display script)

 

Mod seems to work.  However, I cannot interract with items carried over from previous save via persistence.  Never having used this mod before I don't know if that's as-intended.  I tried a new save without restringing, and emptying the safe removes all of the displays but does not allow me to actually obtain the items, so I'm guess that's normal, but its quite disappointing.

 

Link to comment

So I'm working on two things:

1) Making Restringer work on the entire mod order at once.

2) Making Restringer run on 32bit Java... because right now it is about a thousand times slower for some reason. Which is exactly the OPPOSITE of how Java is supposed to be. Seriously, that's the whole goddam point of Java, is that the developer shouldn't have to worry about whether the system is 32 bit or 64 bit or RISC or a cellphone or a goddam Commodore 64.

 

So far I've improved performance quite a bit, and made the logging window work correctly.

Link to comment

Restring report:  Immersive Armors


 


The MCM menus are all prefixed with $. For example Immersive Armors now appears as $Immersive Armors. The initialization text is also broken only showing $stopvar. 


 


Restring report: INeed


 

The visual icon widget display breaks and no longer displays.

 

It'd be nice if the restringer remember which set of mods you'd tried to string last. Or dump the restring log to a file.

Link to comment

Restring report:  Immersive Armors

 

The MCM menus are all prefixed with $. For example Immersive Armors now appears as $Immersive Armors. The initialization text is also broken only showing $stopvar. 

 

Restring report: INeed

 

The visual icon widget display breaks and no longer displays.

 

It'd be nice if the restringer remember which set of mods you'd tried to string last. Or dump the restring log to a file.

I've replicated the bug in iNeed. Just analyzing it now; it's a tricky one because there don't seem to be any error messages from iNeed in the papyrus log at all.
Link to comment

I use C:/Steam/ModOrganizer to store my mods

I use C:/Games/Skyrim Tools/Reconfigurator to host this program, i have it installed correctly into MO.

 

this program asks me to identify that folder as the MO folder, but I keep getting an error that it doesn't contain a profiles folder when it clearly does.

Any idea what's wrong?

Link to comment

I use C:/Steam/ModOrganizer to store my mods

I use C:/Games/Skyrim Tools/Reconfigurator to host this program, i have it installed correctly into MO.

 

this program asks me to identify that folder as the MO folder, but I keep getting an error that it doesn't contain a profiles folder when it clearly does.

Any idea what's wrong?

That directory check doesn't work quite right, so I took it out two versions ago. Are you sure you have an uptodate version?
Link to comment

Worked in Windows, but in linux openjdk8: trying to change the output path

INFO: Choosing an output path.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at restringer.gui.Configurator.selectOutputDirectory(Configurator.java:115)
	at restringer.gui.ModChooser.setOutputDirectory(ModChooser.java:303)
	at restringer.gui.ModChooser.access$1200(ModChooser.java:46)
	at restringer.gui.ModChooser$ActionHandler.actionPerformed(ModChooser.java:460)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
	at java.awt.Component.processMouseEvent(Component.java:6535)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6300)
	at java.awt.Container.processEvent(Container.java:2236)
	at java.awt.Component.dispatchEventImpl(Component.java:4891)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Component.dispatchEvent(Component.java:4713)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
	at java.awt.Container.dispatchEventImpl(Container.java:2280)
	at java.awt.Window.dispatchEventImpl(Window.java:2750)
	at java.awt.Component.dispatchEvent(Component.java:4713)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

as a general suggestion: can we maybe just make the output default to a created folder like ./output/ ?

 

Feature request:

 

Can you add a total string count per mod to the output?

 

I don't just want to reallocate as many strings as possible I want context: I want to know which mods are the largest offenders and/or what ratio of reallocated strings against total strings this mod could fix.

 

I kinda want the same thing for save analysis, since TESV ESS Editor doesn't seem to know where each string comes from, only listing them all from the table sequentially, but that's probably a lot harder to implement and beyond the scope of this program.

Link to comment

Worked in Windows, but in linux openjdk8: trying to change the output path

INFO: Choosing an output path.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at restringer.gui.Configurator.selectOutputDirectory(Configurator.java:115)
	at restringer.gui.ModChooser.setOutputDirectory(ModChooser.java:303)
	at restringer.gui.ModChooser.access$1200(ModChooser.java:46)
	at restringer.gui.ModChooser$ActionHandler.actionPerformed(ModChooser.java:460)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
	at java.awt.Component.processMouseEvent(Component.java:6535)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6300)
	at java.awt.Container.processEvent(Container.java:2236)
	at java.awt.Component.dispatchEventImpl(Component.java:4891)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Component.dispatchEvent(Component.java:4713)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
	at java.awt.Container.dispatchEventImpl(Container.java:2280)
	at java.awt.Window.dispatchEventImpl(Window.java:2750)
	at java.awt.Component.dispatchEvent(Component.java:4713)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
as a general suggestion: can we maybe just make the output default to a created folder like ./output/ ?

 

Feature request:

 

Can you add a total string count per mod to the output?

 

I don't just want to reallocate as many strings as possible I want context: I want to know which mods are the largest offenders and/or what ratio of reallocated strings against total strings this mod could fix.

 

I kinda want the same thing for save analysis, since TESV ESS Editor doesn't seem to know where each string comes from, only listing them all from the table sequentially, but that's probably a lot harder to implement and beyond the scope of this program.

Part of the issue is that strings don't belong to mods. Scripts don't really belong to individual mods either.

 

Every script had a string table, but it gets merged into the main string table when the save loads. Once it's in the table, there is no ownership or anything, the table is just a big shared resource.

 

If two different scripts from two different mods use the same string, it only appears once in the table. So which mod do we say it belongs to? And if one of those mods gets restrung, the string will still be in the table because the other mod still uses it.

 

Basically there's no easy way to determine which mod a string comes from or exactly how many strings a restringing will save you.

 

That said, yes I will add per-mod statistics and a nice formatted log file. But some of the data will be estimations.

 

Would you be interested in a feature in Restringer that lets you load a savegame and analyze it using the data that restringer already collects? My save editor wont be ready for a while, but this is certainly something I could do now.

 

Also, thank you for the bug report, and for including the stack trace. Would it be alright if I PM you about doing a few tests as I address that bug? I don't have Linux installed anymore...

Link to comment
Also, thank you for the bug report, and for including the stack trace. Would it be alright if I PM you about doing a few tests as I address that bug? I don't have Linux installed anymore...

 

I would think it would be easier for you to install linux in a VM to test it locally, but I can play a part as an intermittent testing bed, sure.

 

I didn't really plan on using it in linux exclusively or anything, just don't want to switch back to windows for every little thing, wouldn't be that big of a concern to me if it never worked under linux in reality.

 

Would you be interested in a feature in Restringer that lets you load a savegame and analyze it using the data that restringer already collects? My save editor wont be ready for a while, but this is certainly something I could do now.

 

That would probably be useful.

 

Cross comparing should tell you which strings are used by which mods (even if being re-used in multiple places), I wonder if you can detect strings that don't have a mod (strings maybe don't get cleared from the save if removed?)

 

Certainly more information is always useful.

 

That said, yes I will add per-mod statistics and a nice formatted log file. But some of the data will be estimations.

 

Thanks!

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