When opening the installer while boot plugins are still loaded, it may have been possible for plugins to be added to the installed plugins list twice, causing various statekeeping issues
- Adds new menu item to /xldev to disable Safe Mode, allowing users to load plugins again.
- Safe mode cannot be re-enabled once disabled.
- Add new ModuleLog.Create<T> for eventual ILogger magic
- Make safe mode writable
- Remove redundant check in CheckPolicy
These are supposed to indicate to the user that they called a function at the wrong point in time. We don't want to actually mutate the state in that case.
* Avoid re-creating title version string every frame
* Marked title version string that it has been changed by Dalamud by
appending a newline payload with a string expression embedded within,
which the game will ignore (effectively `<br(!Dalamud!)>`.)
* Added `PluginManager.LoadedPluginCount` which will count the number of
loaded plugin without making a copy of the plugin list.
* Made TitleScreenMenuWindow.OnVersionStringDraw` update the title
version text addon only if number of loaded plugin changes or the text
is missing the custom suffix from the first point.
* Use OriginalTextPointer to determine if SetText(ROS) has been called
* Add file dialog to add a dev plugin
* Require dev plugins to be paths to the DLL
* Only allow .dlls in the dev plugin setting entry
* Update dev plugin location hint
* update wording
---------
Co-authored-by: KazWolfe <KazWolfe@users.noreply.github.com>
* Refactor and upgrade to new excel design
* Obsolete ExcelResolver<T> and use only RowRef<T>
* Better benchmarking for Lumina
* Add custom game-supported RSV provider
* Refactor and move Lazy<T> and nullable/cached row objects to RowRefs
* Convert IRSVProvider to delegate, resolve strings by default
* Split IExcelRow into IExcelSubrow
* Extra lumina documentation
* Minor RSV CS fixes
* Fix UIGlowPayload warning
* Fix rebase
* Update to Lumina 5
ServiceScope.Dispose was not waiting for scoped services to complete
disposing. This had an effect of letting a new plugin instance register
a DtrBar entry before previous plugin instance's entry got unregistered.
This change also cleans up unloading procedure in LocalPlugin.
* Changed DtrBar to use ReaderWriterLockSlim so that there exists only one storage of entries, preventing possible desync.
* DtrBarEntry will now hold a reference to the LocalPlugin that created the entry, so that DtrBarPluginScoped can defer plugin related handling to the main service.
* Marked DtrBarEntry class itself to be turned internal in API 11.
* Made IDtrBar.Entries return an immutable copy of underlying list of DtrBar entries, that will be freshly created whenever the list changes.