diff --git a/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs b/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs index c6297ffa1..17358646e 100644 --- a/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs +++ b/Dalamud/Interface/Internal/Windows/PluginInstaller/PluginInstallerWindow.cs @@ -2222,7 +2222,7 @@ internal class PluginInstallerWindow : Window, IDisposable StyleModelV1.DalamudStandard.Push(); - if (plugin.State == PluginState.UnloadError) + if (plugin.State == PluginState.UnloadError && !plugin.IsDev) { ImGuiComponents.DisabledButton(FontAwesomeIcon.Frown); diff --git a/Dalamud/Plugin/Internal/Types/LocalDevPlugin.cs b/Dalamud/Plugin/Internal/Types/LocalDevPlugin.cs index cb051fa59..498bea874 100644 --- a/Dalamud/Plugin/Internal/Types/LocalDevPlugin.cs +++ b/Dalamud/Plugin/Internal/Types/LocalDevPlugin.cs @@ -138,9 +138,9 @@ internal class LocalDevPlugin : LocalPlugin, IDisposable return; } - if (this.State != PluginState.Loaded && this.State != PluginState.LoadError) + if (this.State != PluginState.Loaded && this.State != PluginState.LoadError && this.State != PluginState.UnloadError) { - Log.Debug($"Skipping reload of {this.Name}, state ({this.State}) is not {PluginState.Loaded} nor {PluginState.LoadError}."); + Log.Debug($"Skipping reload of {this.Name}, state ({this.State}) is not {PluginState.Loaded}, {PluginState.LoadError} or {PluginState.UnloadError}."); return; } @@ -148,6 +148,12 @@ internal class LocalDevPlugin : LocalPlugin, IDisposable try { + if (this.State == PluginState.UnloadError) + { + Log.Warning($"{this.Manifest.Author}: TAKE CARE!!! You need to fix your unload error, and restart the game - your plugin might be in an inconsistent state."); + Log.Warning("Reloading anyway, as this is a dev plugin, but you might encounter unexpected results."); + } + await this.ReloadAsync(); notificationManager.AddNotification($"The DevPlugin '{this.Name} was reloaded successfully.", "Plugin reloaded!", NotificationType.Success); } diff --git a/Dalamud/Plugin/Internal/Types/LocalPlugin.cs b/Dalamud/Plugin/Internal/Types/LocalPlugin.cs index 807dd0bef..2961aae9c 100644 --- a/Dalamud/Plugin/Internal/Types/LocalPlugin.cs +++ b/Dalamud/Plugin/Internal/Types/LocalPlugin.cs @@ -15,7 +15,6 @@ using Dalamud.Logging.Internal; using Dalamud.Plugin.Internal.Exceptions; using Dalamud.Plugin.Internal.Loader; using Dalamud.Utility; -using Dalamud.Utility.Signatures; namespace Dalamud.Plugin.Internal.Types; @@ -305,8 +304,13 @@ internal class LocalPlugin : IDisposable throw new InvalidPluginOperationException( $"Unable to load {this.Name}, load previously faulted, unload first"); case PluginState.UnloadError: - throw new InvalidPluginOperationException( + if (!this.IsDev) + { + throw new InvalidPluginOperationException( $"Unable to load {this.Name}, unload previously faulted, restart Dalamud"); + } + + break; case PluginState.Unloaded: break; case PluginState.Loading: @@ -471,8 +475,13 @@ internal class LocalPlugin : IDisposable case PluginState.Unloaded: throw new InvalidPluginOperationException($"Unable to unload {this.Name}, already unloaded"); case PluginState.UnloadError: - throw new InvalidPluginOperationException( - $"Unable to unload {this.Name}, unload previously faulted, restart Dalamud"); + if (!this.IsDev) + { + throw new InvalidPluginOperationException( + $"Unable to unload {this.Name}, unload previously faulted, restart Dalamud"); + } + + break; case PluginState.Loaded: case PluginState.LoadError: break; @@ -531,7 +540,10 @@ internal class LocalPlugin : IDisposable /// A task. public async Task ReloadAsync() { - await this.UnloadAsync(true); + // Don't unload if we're a dev plugin and have an unload error, this is a bad idea but whatever + if (this.IsDev && this.State != PluginState.UnloadError) + await this.UnloadAsync(true); + await this.LoadAsync(PluginLoadReason.Reload, true); }