ryobg / JContainers

JSON-based data structures for Papyrus - the TESV Skyrim SE scripting language
MIT License
107 stars 23 forks source link

Fix Domains population to avoid CDTs #17

Closed Forgemaster closed 6 years ago

Forgemaster commented 6 years ago

Everything worked fine until for some reason loading any save game made after what seems to be a loadable file. The next save game made with it will crash after a few seconds when loading it.

https://pastebin.com/5UAmfhUR - Crash log https://pastebin.com/tpBcXj7n - JContainers64.log

Hopefully the file "__delete_if_empty" made by Vortex mod manager inside JCData folder isn't causing issues, as everything worked fine before.

I'm using the version that came with mod VioLens, it has version 4.0.1b of JContainers64. I tried re-installing but that did not help. It is the only mod that is actively using it.

If I save indoors where I saved already, the save game is fine. If I go outside to save, that save game refuses to load.

Edit: I did those steps in order and the log is different and comes with some garbled text when the save is loaded.

https://pastebin.com/RkmuvaMJ

Completely deleting all folders associated and installing JContainers64 outside of the mod manager seems to be working fine. Those spare files inside the working directory for the plugin seem to be the cause, but what is strange the issue only appeared after a number of saves, rather than immediately.

Regardless, I have sent a bug report to the Vortex team.

ryobg commented 6 years ago

Hi @Forgemaster thanks for your report. If I'm getting it right, issue is fixed by installing JC outside of this Vortex manager? I didn't understand well the situation with these "spare" files - which ones? You removed them or left them? One thing which comes to mind to be likely pecular is that JC includes one dummy file inside an otherwise empty folders - this is to force Nexus Mod Manager installing that folder and avoid issues/crashes.

Forgemaster commented 6 years ago

"__delete_if_empty" dummy file is included with every new directory and sub-directory installed in the data folder via Vortex in hardlink mode for mods. I essentially got rid of them and extracted JC outside Vortex so JC doesn't conflict. I saw the dummy file that JC uses, and that one I immediately knew I had to leave alone because it was different and comes with JC.

Hopefully the SKSE co-save games that I used aren't permanently corrupted to some degree. As gameplay stability seemed to degrade with each save game made for a character afterwards leading to random crashes. Testing this though would take some time (and I already used up my weekend).

Though, according to size, they seem consistently identical to the others used. So it might actually be fine then.

ryobg commented 6 years ago

Are these Vortex files empty? At best I can see whether JC can ignore empty or not well formatted domains...

Forgemaster commented 6 years ago

All they have is "This directory was created by Vortex deployment and will be removed during purging if it's empty" in plain text written in them. And are 96 bytes. Pretty much every directory in the data folder has one of these files, but not all of them.

They should be safe to remove though.

Purge removes all hardlinks and all directories created by the mod manager. Which is something that you don't want to do unless you want to leave the game directory as clean as possible or "refresh" the hardlinks before re-deploying mods again.

Doing so would remove spare folders left over and any of those stray "__delete_if_empty" dummy files. But if you're installing JC or a mod containing it through Vortex, there's no doubt one of those files will be created again in the JC working directory.

A quick fix seems to be either deleting those files from JC folders, or dropping the files outside of Vortex.

ryobg commented 6 years ago

Hi @Forgemaster, I have added small workaround. JC will ignore any files with two leading underscores. This looks safe enough. So it may do. Better solution would be to add real JSON validation, but this may introduce some resource usage which in general I would like to avoid. After I do #18 I'm going to release new version, so you may compile as it is now from the develop banch or wait a bit.

ryobg commented 6 years ago

P.S. You can try now the release with workaround at https://github.com/ryobg/JContainers/releases/tag/v4.1.0

ryobg commented 6 years ago

Hi! I have uploaded here a build with more elaborated procedure for domain population. I believe it should work, but you can try throw at it whatever junk you may find.

ryobg commented 6 years ago

So I think this should be solved now. JC should consider only folders. Let hope that sombody does not decide to put and junk folders inside. In any case, if this issue persist, feel free to reopen.