bcssov / ironymodmanager Goto Github PK
View Code? Open in Web Editor NEWMod Manager for Paradox Games. Official Discord: https://discord.gg/t9JmY8KFrV
Home Page: https://bcssov.github.io/IronyModManager/
License: MIT License
Mod Manager for Paradox Games. Official Discord: https://discord.gg/t9JmY8KFrV
Home Page: https://bcssov.github.io/IronyModManager/
License: MIT License
Add an option to rename a collection.
Investigate reports when there are many objects as to what is happening.
While investigating #34 locally I also noticed that in order to see the correct sort order in Irony (which I presume is the order it supplies the game), I had to first set the sort order to z-a in the left side, activate all the mods, confirm the right side was also z-a then import the collection.
Not a priority but apparently useful to some people.
In this phase CWTools will replace most of the existing parsers once the API to utilize community rules is available. We'll need to:
After giving it much thought I've decided to change course and have file validation as well due to potential number of false flags and or errors in using dumb parsers. At the moment all existing parser will be present and mapping infrastructure will remain, this will be phased out in a referenced issue in #36.
Crashing when applying collection or when pressing conflict solver it just gets stuck in random %
error log
19:27:09.8554 System.AggregateException: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (Object reference not set to an instance of an object.)
---> System.NullReferenceException: Object reference not set to an instance of an object.
at IronyModManager.IO.Mods.ModWriter.MapPdxPath(ModRegistry registry, IMod mod)
at IronyModManager.IO.Mods.ModWriter.SyncData(DLCLoad dLCLoad, GameData gameData, ModRegistryCollection modRegistry, IMod mod, Boolean isEnabled)
at IronyModManager.IO.Mods.ModWriter.ApplyModsAsync(ModWriterParameters parameters)
at IronyModManager.Services.ModService.ExportModsAsync(IReadOnlyCollection1 enabledMods, IReadOnlyCollection
1 regularMods, String collectionName)
at IronyModManager.ViewModels.Controls.ModHolderControlViewModel.ApplyCollectionAsync() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModHolderControlViewModel.cs:line 191
--- End of inner exception stack trace --- System.NullReferenceException: Object reference not set to an instance of an object.
at IronyModManager.IO.Mods.ModWriter.MapPdxPath(ModRegistry registry, IMod mod)
at IronyModManager.IO.Mods.ModWriter.SyncData(DLCLoad dLCLoad, GameData gameData, ModRegistryCollection modRegistry, IMod mod, Boolean isEnabled)
at IronyModManager.IO.Mods.ModWriter.ApplyModsAsync(ModWriterParameters parameters)
at IronyModManager.Services.ModService.ExportModsAsync(IReadOnlyCollection1 enabledMods, IReadOnlyCollection
1 regularMods, String collectionName)
at IronyModManager.ViewModels.Controls.ModHolderControlViewModel.ApplyCollectionAsync() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModHolderControlViewModel.cs:line 191
Would be mighty useful alongside the ability to rename collections.
The left/right side views update correctly but the list box retains 'resolved' items.
Edit: clicking the item that the left/right side are showing results in the following: https://i.imgur.com/I6RW5sq.png
Hello! I am getting a crash when trying to resolve an issue. Here's the log.
2020-04-27 09:36:45.5125 System.AggregateException: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (Additional text encountered after finished reading JSON content: b. Path '', line 1, position 5926.) ---> Newtonsoft.Json.JsonReaderException: Additional text encountered after finished reading JSON content: b. Path '', line 1, position 5926. at Newtonsoft.Json.JsonTextReader.Read() at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value) at IronyModManager.IO.Mods.ModWriter.LoadPdxModelAsync[T](String path) at IronyModManager.IO.Mods.ModWriter.ApplyModsAsync(ModWriterParameters parameters) at IronyModManager.Services.ModService.ExportModPatchDefinitionAsync(IConflictResult conflictResult, IDefinition definition, String collectionName, Boolean resolve) at IronyModManager.ViewModels.MainConflictSolverControlViewModel.ResolveConflictAsync(Boolean resolve) in D:\Working\IronyModManager\src\IronyModManager\ViewModels\MainConflictSolverViewModel.cs:line 575 --- End of inner exception stack trace --- Newtonsoft.Json.JsonReaderException: Additional text encountered after finished reading JSON content: b. Path '', line 1, position 5926. at Newtonsoft.Json.JsonTextReader.Read() at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value) at IronyModManager.IO.Mods.ModWriter.LoadPdxModelAsync[T](String path) at IronyModManager.IO.Mods.ModWriter.ApplyModsAsync(ModWriterParameters parameters) at IronyModManager.Services.ModService.ExportModPatchDefinitionAsync(IConflictResult conflictResult, IDefinition definition, String collectionName, Boolean resolve) at IronyModManager.ViewModels.MainConflictSolverControlViewModel.ResolveConflictAsync(Boolean resolve) in D:\Working\IronyModManager\src\IronyModManager\ViewModels\MainConflictSolverViewModel.cs:line 575
From Orrie:
Should be as simple as checking of certain folders include files.
If it doesn't modifies the checksum
There are some folders that modifies it, if there are modified files inside
gfx, interface, localisation and music doesn't touch the checksum
don't think flags or fonts do either
and sound
Basically, common and events will break acheivements
Maybe map
- will there be options to ignore certain conflicts globally (e.g. the .git folder) or specifically (e.g. previously addressed conflicts).
Create descriptors for mods that need it, are not installed for example (downloaded from PDX mods or Steam or Local).
Try to repro manually.
Is there any error log file to send?
Got some crash :
- one at first time I created a collection
- one at first time I used the conflict solver
starting at v1.0.60-beta and onward on windows 10 x64 (Previous versions work fine), starting the program up and selecting stellaris will not load up any mods and will instead throw a log to the log file about how the value cannot be null. Closing the launcher and then relaunching will result in a crash loop that can only be fixed by deleting the Database.json.
2020-04-30_Error.log
Will eventually have to set it up. When I find the time, aside from Jenkins\Team City I've very little experience with azure pipelines and or appveyor. If anyone sees this and volunteers to take this one over I'll be eternally grateful for taking over.
Emulate what Stellaris would see once launched (so what will be overwritten is ommited).
Possibly just create a "Merge" button that creates a new mod for the collection containing all mods of the collection and the patch, without any overwrites.
That would be quite handy when trying to look into errors from error.log or just to find the definitions without having to find which mods add it first.
Would be useful to be able to disable having the mod list scroll when I click the send to top/bottom buttons.
For a test case install the following mods:
ACoT https://steamcommunity.com/sharedfiles/filedetails/?id=1419304439
Plentiful Traditions https://steamcommunity.com/sharedfiles/filedetails/?id=1311725711
Patch the armies and Scripted Triggers and flag everything else as ignored. There should be now nothing in the drop-down or list view.
Exit solver.
Enter solver
Everything is back in the drop-down/list view.
It does, however, remember state if you exit Irony and restart the app before re-entering the conflict solver. But if you then enter, exit, re-enter the solver everything is back again.
Importing a collection which has the same name than an existing one erases the existing collection by the imported one.
Step to reproduce:
Suggestion:
Note:
In Paradox Mod Manager I made the choice to add a unique info in the name (the timestamp) which user would be able to remove when renaming the collection.
Todo:
Maybe spy on Paradoxos to see what it does for its option to do that?
For those times I derp...
Had made a test collection to perform a faster re-check of that one names mod for invalid files.
Upon deleting it and going back to my live collection the sort order reverted to A-Z from my sorted order.
To illustrate, install Ethics and Civics Alternative https://steamcommunity.com/sharedfiles/filedetails/?id=1790861374
and Relytor's Empire Governance https://steamcommunity.com/sharedfiles/filedetails/?id=1984230854
Run the solver and then scroll down the list in common\governments - you'll see they alternate between ethics having LIOS and Relytor's having Load Order. Is this correct display or is code getting confused?
I'm proceeding as if code is correct and pulling in the Relytor's data when Ethics is listed is LIOS.
See https://i.imgur.com/DuafFhB.png
Can repro with the following mods:
Event Horizon Offset Facility (https://steamcommunity.com/sharedfiles/filedetails/?id=2008059495)
Gigastructural Engineering & More (https://steamcommunity.com/sharedfiles/filedetails/?id=1121692237)
Currently doesn't.
Not a high priority at the moment, so putting it in vNext and we'll see from there in which future version we can squeeze it in.
https://i.imgur.com/7tzYMRm.png
I copy the value I want, click resolve, it thinks for a bit, then resets the view with the value seemingly unchanged.
This should make it easier for me to decide whether or not to patch something.
Given the log file, I must be moving too quickly for threads to catch up. Jump to timestamp 2020-04-28 13:33:29.2770 - also it's not automatically closing, it's just sitting there.
Need to implement autoupdate for the App.
Timestamp 2020-04-26 05:44:22.4353 was before I deleted the .35 alpha patch mod.
Timestamp 2020-04-26 05:57:14.8583 was after deleting the .35 alpha patch mod and the Event Horizon Offset Facility mod and its UI patch from the collection,
Edit: this is the mod it trips up on: https://steamcommunity.com/sharedfiles/filedetails/?id=682691478 will cause the fatal error on its own.
Stellaris specific logic should be a plugin instead of a part of the main project.
https://i.imgur.com/OVkYkiE.png as an example.
Also, present on @RotationSpeed
Narrowed it down to Amazing Ship Battles (https://steamcommunity.com/sharedfiles/filedetails/?id=1878473679) and Extra Ship Components 3.0 - Overwrites (https://steamcommunity.com/sharedfiles/filedetails/?id=1885791325)
Mod file
name="32 Real Space - Beautiful Universe v2.0 Patch"
picture="realspace_beautifuluniverse.jpg"
tags={
"Real Space"
"Graphics"
"Patch"
}
supported_version="1.8.*
Log
---> System.IO.IOException: The process cannot access the file 'C:\Users\tsimo\Documents\Paradox Interactive\Stellaris\mod\ugc_.mod' because it is being used by another process.
at System.IO.FileStream.ValidateFileHandle(SafeFileHandle fileHandle)
at System.IO.FileStream.CreateFileOpenHandle(FileMode mode, FileShare share, FileOptions options)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at IronyModManager.IO.Mods.ModWriter.WriteDescriptorAsync(ModWriterParameters parameters)
at IronyModManager.Services.ModService.InstallModsAsync()
at IronyModManager.ViewModels.Controls.ModHolderControlViewModel.InstallModsAsync() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModHolderControlViewModel.cs:line 212
--- End of inner exception stack trace --- System.IO.IOException: The process cannot access the file 'C:\Users\tsimo\Documents\Paradox Interactive\Stellaris\mod\ugc_.mod' because it is being used by another process.
at System.IO.FileStream.ValidateFileHandle(SafeFileHandle fileHandle)
at System.IO.FileStream.CreateFileOpenHandle(FileMode mode, FileShare share, FileOptions options)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at IronyModManager.IO.Mods.ModWriter.WriteDescriptorAsync(ModWriterParameters parameters)
at IronyModManager.Services.ModService.InstallModsAsync()
at IronyModManager.ViewModels.Controls.ModHolderControlViewModel.InstallModsAsync() in D:\Working\IronyModManager\src\IronyModManager\ViewModels\Controls\ModHolderControlViewModel.cs:line 212
2020-04-15 15:04:54.6535 System.InvalidOperationException: Call from invalid thread
at Avalonia.Threading.Dispatcher.VerifyAccess()
at Avalonia.AvaloniaObject..ctor()
at Avalonia.StyledElement..ctor()
at Avalonia.Visual..ctor()
at Avalonia.Controls.ContentControl..ctor()
at Avalonia.Controls.TopLevel..ctor(ITopLevelImpl impl, IAvaloniaDependencyResolver dependencyResolver)
at Avalonia.Controls.WindowBase..ctor(IWindowBaseImpl impl, IAvaloniaDependencyResolver dependencyResolver)
at Avalonia.Controls.WindowBase..ctor(IWindowBaseImpl impl)
at Avalonia.Controls.Window..ctor(IWindowImpl impl)
at Avalonia.Controls.Window..ctor()
at MessageBox.Avalonia.Views.MsBoxCustomWindow..ctor(Style style)
at MessageBox.Avalonia.MessageBoxManager.GetMessageBoxCustomWindow(MessageBoxCustomParams params)
at IronyModManager.MessageBoxes.GetFatalErrorWindow(String title, String header, String message) in D:\Working\IronyModManager\src\IronyModManager\Implementation\MessageBox.cs:line 50
at IronyModManager.Program.LogError(Exception e) in D:\Working\IronyModManager\src\IronyModManager\Program.cs:line 144
at IronyModManager.Program.TaskScheduler_UnobservedTaskException(Object sender, UnobservedTaskExceptionEventArgs e) in D:\Working\IronyModManager\src\IronyModManager\Program.cs:line 158
at System.Threading.Tasks.TaskScheduler.PublishUnobservedTaskException(Object sender, UnobservedTaskExceptionEventArgs ueea)
at System.Threading.Tasks.TaskExceptionHolder.Finalize() System.InvalidOperationException: Call from invalid thread
at Avalonia.Threading.Dispatcher.VerifyAccess()
at Avalonia.AvaloniaObject..ctor()
at Avalonia.StyledElement..ctor()
at Avalonia.Visual..ctor()
at Avalonia.Controls.ContentControl..ctor()
at Avalonia.Controls.TopLevel..ctor(ITopLevelImpl impl, IAvaloniaDependencyResolver dependencyResolver)
at Avalonia.Controls.WindowBase..ctor(IWindowBaseImpl impl, IAvaloniaDependencyResolver dependencyResolver)
at Avalonia.Controls.WindowBase..ctor(IWindowBaseImpl impl)
at Avalonia.Controls.Window..ctor(IWindowImpl impl)
at Avalonia.Controls.Window..ctor()
at MessageBox.Avalonia.Views.MsBoxCustomWindow..ctor(Style style)
at MessageBox.Avalonia.MessageBoxManager.GetMessageBoxCustomWindow(MessageBoxCustomParams params)
at IronyModManager.MessageBoxes.GetFatalErrorWindow(String title, String header, String message) in D:\Working\IronyModManager\src\IronyModManager\Implementation\MessageBox.cs:line 50
at IronyModManager.Program.LogError(Exception e) in D:\Working\IronyModManager\src\IronyModManager\Program.cs:line 144
at IronyModManager.Program.TaskScheduler_UnobservedTaskException(Object sender, UnobservedTaskExceptionEventArgs e) in D:\Working\IronyModManager\src\IronyModManager\Program.cs:line 158
at System.Threading.Tasks.TaskScheduler.PublishUnobservedTaskException(Object sender, UnobservedTaskExceptionEventArgs ueea)
at System.Threading.Tasks.TaskExceptionHolder.Finalize()
˙˙˙
As of now, the top most mod defintion is used for the default virtual definition. It could be useful to color it, especially if for some reason it isn't the first one anymore.
I would envisage this then replacing the virtual definition with the selected mod - a faster way of selecting a mod, ctrl+a, copy this.
Add ability to edit and fix invalid files in the patch mod.
Currently Avalonia is borked in that regard, moving to unstable build should fix it but it's a daunting task at the moment.
Plugins need to have their own mechanism which plugs in into the app update to check whether plugin apps are available.
Just a QoL thing to make it easier to locally patch invalid mod files.
From Reddit:
Thanks for the response.
My workflow would be "wanting to predict the intrusiveness of a new mod." I find mods that override a lot of vanilla items are likely to have conflicts or integrate poorly with other mods. It would also help when predicting robustness of the mod against version changes and in updating to new patches. For UI Overhaul it wouldn't be useful, I agree. A good example would be a Civic Pack: these can range from using mostly modifiers to editing most buildings and pop jobs in the vanilla game and it's nice to know this in advance.
It's not an urgent feature of course and even without it there'd be workarounds to do the same thing, but for me it would be nice
A user of my most recent Steam collection that uses Irony reported the .mod file was missing on import.
Having completely cleared out the Stellaris folder and the AppData folder for Irony, followed by re-importing my collection, I can confirm that, if not for everyone, it does not create the necessary .mod file for the bundled patch.
Everything I expect you'll need to reproduce is on https://steamcommunity.com/sharedfiles/filedetails/?id=2062766262
From discord:
would the manager detect if there is an update or do you have to check manually and rerun the solver?
Not immediately upon release. Running the solver requires me to load for 100x mods some 50000 objects in memory (at least on my configuration) and that takes some 20-30 seconds (running a lot of things in parallel). I do however have in mind for a future release to give some kind of a notification that the conflict solver needs to be run again if a mod update occurred. Kind of like mini verification and loading only modified mod files to verify their contents and see if there are changes. Should be much lighter on the system. Just one step at a time. Though I gotta write this down on github issue tracker (so that I don't forget :P)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.