Jump to content

Beginners' Guide to Savegame Editing with Near Infinity


Recommended Posts

2 hours ago, Oloriniel said:

Unfortunately, I can't open Baldur.gam in the save folder (any save folder, I've tried several not just the most recent)

I know I've done this at least once before, when were trying to diagnose why mages suddenly couldn't use mage scrolls on transitioning to SoD.  But it's not working now.  I get the error message "Error reading BALDUR.GAM  null"

Could you post the error log after attempting to open the baldur.gam (menu Tools > Show Debug Console)? Or attach/upload your BALDUR.GAM, so that I could take a look at it myself.

Link to comment
Spoiler

Error reading BALDUR.GAM
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.gui.ResourceTree.valueChanged(Unknown Source)
    at javax.swing.JTree.fireValueChanged(Unknown Source)
    at javax.swing.JTree$TreeSelectionRedirector.valueChanged(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(Unknown Source)
    at javax.swing.JTree.setSelectionPath(Unknown Source)
    at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(Unknown Source)
    at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(Unknown Source)
    at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(Unknown Source)
    at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.ArrayDeque.<init>(Unknown Source)
    at org.infinity.util.IdsMapEntry.<init>(Unknown Source)
    at org.infinity.datatype.IdsBitmap.createResourceList(Unknown Source)
    at org.infinity.datatype.IdsBitmap.<init>(Unknown Source)
    at org.infinity.datatype.IdsBitmap.<init>(Unknown Source)
    at org.infinity.resource.Effect2.readCommon(Unknown Source)
    at org.infinity.resource.Effect2.read(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.Effect2.<init>(Unknown Source)
    at org.infinity.resource.cre.CreResource.readOther(Unknown Source)
    at org.infinity.resource.cre.CreResource.read(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.cre.CreResource.<init>(Unknown Source)
    at org.infinity.resource.gam.PartyNPC.read(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.gam.PartyNPC.<init>(Unknown Source)
    at org.infinity.resource.gam.NonPartyNPC.<init>(Unknown Source)
    at org.infinity.resource.gam.GamResource.read(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.gam.GamResource.<init>(Unknown Source)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.gui.ResourceTree.valueChanged(Unknown Source)
    at javax.swing.JTree.fireValueChanged(Unknown Source)
    at javax.swing.JTree$TreeSelectionRedirector.valueChanged(Unknown Source)
Error reading BALDUR.GAM
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.gui.ResourceTree.valueChanged(Unknown Source)
    at javax.swing.JTree.fireValueChanged(Unknown Source)
    at javax.swing.JTree$TreeSelectionRedirector.valueChanged(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(Unknown Source)
    at javax.swing.JTree.setSelectionPath(Unknown Source)
    at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(Unknown Source)
    at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(Unknown Source)
    at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(Unknown Source)
    at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.ArrayDeque.<init>(Unknown Source)
    at org.infinity.util.IdsMapEntry.<init>(Unknown Source)
    at org.infinity.datatype.IdsBitmap.createResourceList(Unknown Source)
    at org.infinity.datatype.IdsBitmap.<init>(Unknown Source)
    at org.infinity.datatype.IdsBitmap.<init>(Unknown Source)
    at org.infinity.resource.Effect2.readCommon(Unknown Source)
    at org.infinity.resource.Effect2.read(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.Effect2.<init>(Unknown Source)
    at org.infinity.resource.cre.CreResource.readOther(Unknown Source)
    at org.infinity.resource.cre.CreResource.read(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.cre.CreResource.<init>(Unknown Source)
    at org.infinity.resource.gam.PartyNPC.read(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.gam.PartyNPC.<init>(Unknown Source)
    at org.infinity.resource.gam.NonPartyNPC.<init>(Unknown Source)
    at org.infinity.resource.gam.GamResource.read(Unknown Source)
    at org.infinity.resource.AbstractStruct.<init>(Unknown Source)
    at org.infinity.resource.gam.GamResource.<init>(Unknown Source)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.gui.ResourceTree.valueChanged(Unknown Source)
    at javax.swing.JTree.fireValueChanged(Unknown Source)
    at javax.swing.JTree$TreeSelectionRedirector.valueChanged(Unknown Source)
Error reading BALDUR.GAM
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.resource.ResourceFactory.getResource(Unknown Source)
    at org.infinity.gui.ResourceTree.valueChanged(Unknown Source)
    at javax.swing.JTree.fireValueChanged(Unknown Source)
    at javax.swing.JTree$TreeSelectionRedirector.valueChanged(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(Unknown Source)
    at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(Unknown Source)
    at javax.swing.JTree.setSelectionPath(Unknown Source)
    at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(Unknown Source)
    at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(Unknown Source)
    at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(Unknown Source)
    at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
 

 

Link to comment
7 hours ago, Oloriniel said:

Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded

That confirms my suspicion. You're most likely using a 32-bit version of the Java Runtime to run NI. That version uses very conservative memory settings by default, which may have worked fine on Windows XP 20 years ago but are now largely outdated. I'd strongly recommend to install a 64-bit version which makes much better use of available memory.

You can download the official Oracle version or the Open Source version (choose package type 'JRE').

If you can't run the 64-bit version for some reason then try the "Hide NI DOS" script found somewhere in the first post of this topic. It attempts to run NI with extended memory settings.

Link to comment

@Oloriniel Could you post a screenshot of the system information that is shown in the main panel when you start up NI? If that's not available then enable menu Options > Display system information at startup, and restart NI.

Could you also zip and attach one of your saves, so that I can check it myself? You can use NI for that: Right-click on a savegame folder and choose "Create zip archive".

Link to comment
8 hours ago, argent77 said:

@Oloriniel Could you post a screenshot of the system information that is shown in the main panel when you start up NI? If that's not available then enable menu Options > Display system information at startup, and restart NI.

Could you also zip and attach one of your saves, so that I can check it myself? You can use NI for that: Right-click on a savegame folder and choose "Create zip archive".

The zip archive is 3327KB, and my max total size allowed here is 75.82KB.  So I can't put it here, but I think I can send it to an email address.

I can't even post a screenshot.  But I can copy the data:

NearInfinity      V2.2-20220408-1
Java Runtime      Java(TM) SE Runtime Environment
Java Version      1.8.0_341
Java VM      Java HotSpont(TM) 64-Bit Server VM (25.341-b10, mixed mode)
Java VM Architecture      amd64
Available Memory      2676 MB

Link to comment
28 minutes ago, Oloriniel said:

I can't even post a screenshot.  But I can copy the data:

NearInfinity      V2.2-20220408-1
Java Runtime      Java(TM) SE Runtime Environment
Java Version      1.8.0_341
Java VM      Java HotSpont(TM) 64-Bit Server VM (25.341-b10, mixed mode)
Java VM Architecture      amd64
Available Memory      2676 MB

The amount of available memory should be enough, but I have never tested it on a megamod installation with several hundred mods. I don't think trying out the "Hide NI DOS" script will improve the situation, since 32-bit apps can't reserve more than 2GB memory under normal circumstances.

If the whole savegame archive is too big for the size limit, then attach only the zipped BALDUR.GAM file (or use 7-zip for better compression.)

Link to comment

If this helps, the sole reason I moved to 64 bit Java (for NI) was because I couldn't review my EET megamod worldmap.  I never had an issue with baldur.gam in a save.

If the issue comes from savegames, I'd moreso blame OneDrive and it's aggressive tendencies of syncing the Documents folder. I've had it preventing other files within that subfolder.

Edited by Graion Dilach
Link to comment

A closer look at the error message reveals excessive data allocation while reading some kind of resource list. The error doesn't provide enough information, but only two files are read in the indicated data structure: PROJECTL.IDS and SLOTS.IDS.

Both files are not known to contain massive amounts of lines though. But could you look up the number of lines in these files anyway? PROJECTL.IDS should have several hundred entries at most. SLOTS.IDS should have only about 40 entries.

It is also possible that party members in the BALDUR.GAM contain an excessive amount (thousands?) of spell effects, which could also trigger this error. In that case, uploading/attaching the BALDUR.GAM would be helpful.

 

4 hours ago, Graion Dilach said:

If the issue comes from savegames, I'd moreso blame OneDrive and it's aggressive tendencies of syncing the Documents folder. I've had it preventing other files within that subfolder.

I don't use OneDrive, so I can't check. But if read operations on OnDrive files are corrupted for some reason, then that could also be a source for this error.

Link to comment

I also don't use OneDrive in Documents, but my last install ended up enabling it silently - it only broke down because I have the portraits and the override subfolders in my Documents (and the NWN profile subfolder outright) symlinked to a separate partition and it can't handle symlinks. I've seen systems where OneDrive managed to prevent certain applications to open folders/files under active sync.

Edited by Graion Dilach
Link to comment
On 8/24/2022 at 9:36 AM, argent77 said:

It is also possible that party members in the BALDUR.GAM contain an excessive amount (thousands?) of spell effects, which could also trigger this error.

I have definitely noticed that when opening a savegame in NI in a fairly heavily modded game, with savegames late in BG2, NI takes a long time to open the .GAM file. Like, 10-20 seconds long. Nothing crazy, but definitely indicative that it is working hard. And I tend to have party members with applied effects numbering in the range of 400-700. I've never seen characters with thousands of effects, though.

Link to comment

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...