diff --git a/Penumbra/Penumbra.cs b/Penumbra/Penumbra.cs index e4beecf0..215261b0 100644 --- a/Penumbra/Penumbra.cs +++ b/Penumbra/Penumbra.cs @@ -29,10 +29,14 @@ public class MainClass : IDalamudPlugin { private Penumbra? _penumbra; private readonly CharacterUtility _characterUtility; + public static bool DevPenumbraExists; + public static bool IsNotInstalledPenumbra; public MainClass( DalamudPluginInterface pluginInterface ) { Dalamud.Initialize( pluginInterface ); + DevPenumbraExists = CheckDevPluginPenumbra(); + IsNotInstalledPenumbra = CheckIsNotInstalled(); GameData.GameData.GetIdentifier( Dalamud.GameData, Dalamud.ClientState.ClientLanguage ); _characterUtility = new CharacterUtility(); _characterUtility.LoadingFinished += () @@ -47,6 +51,38 @@ public class MainClass : IDalamudPlugin public string Name => Penumbra.Name; + + // Because remnants of penumbra in devPlugins cause issues, we check for them to warn users to remove them. + private static bool CheckDevPluginPenumbra() + { +#if !DEBUG + var path = Path.Combine( Dalamud.PluginInterface.DalamudAssetDirectory.Parent?.FullName ?? "INVALIDPATH", "devPlugins", "Penumbra" ); + var dir = new DirectoryInfo( path ); + + try + { + return dir.Exists && dir.EnumerateFiles( "*.dll", SearchOption.AllDirectories ).Any(); + } + catch( Exception e ) + { + PluginLog.Error( $"Could not check for dev plugin Penumbra:\n{e}" ); + return true; + } +#else + return false; +#endif + } + + // Check if the loaded version of penumbra itself is in devPlugins. + private static bool CheckIsNotInstalled() + { +#if !DEBUG + return !Dalamud.PluginInterface.AssemblyLocation.Directory?.Parent?.Name.Equals( "installedPlugins", + StringComparison.InvariantCultureIgnoreCase ) ?? true; +#else + return false; +#endif + } } public class Penumbra : IDisposable @@ -71,7 +107,6 @@ public class Penumbra : IDisposable public static FrameworkManager Framework { get; private set; } = null!; public static int ImcExceptions = 0; - public readonly ResourceLogger ResourceLogger; public readonly PathResolver PathResolver; public readonly MusicManager MusicManager; diff --git a/Penumbra/UI/ConfigWindow.Misc.cs b/Penumbra/UI/ConfigWindow.Misc.cs index 6f70126a..92689787 100644 --- a/Penumbra/UI/ConfigWindow.Misc.cs +++ b/Penumbra/UI/ConfigWindow.Misc.cs @@ -104,7 +104,7 @@ public partial class ConfigWindow _ => throw new ArgumentOutOfRangeException( nameof( type ), type, null ), }; - using var combo = ImRaii.Combo( label, current.Name ); + using var combo = ImRaii.Combo( label, current.Name ); if( combo ) { foreach( var collection in Penumbra.CollectionManager.GetEnumeratorWithEmpty().Skip( withEmpty ? 0 : 1 ).OrderBy( c => c.Name ) ) @@ -128,20 +128,23 @@ public partial class ConfigWindow if( Functions.GetDownloadsFolder( out var downloadsFolder ) ) { - fileManager.CustomSideBarItems.Add( ("Downloads", downloadsFolder, FontAwesomeIcon.Download, -1) ); + fileManager.CustomSideBarItems.Add( ( "Downloads", downloadsFolder, FontAwesomeIcon.Download, -1 ) ); } if( Functions.GetQuickAccessFolders( out var folders ) ) { foreach( var ((name, path), idx) in folders.WithIndex() ) { - fileManager.CustomSideBarItems.Add( ($"{name}##{idx}", path, FontAwesomeIcon.Folder, -1) ); + fileManager.CustomSideBarItems.Add( ( $"{name}##{idx}", path, FontAwesomeIcon.Folder, -1 ) ); } } + // Add Penumbra Root. This is not updated if the root changes right now. + fileManager.CustomSideBarItems.Add( ("Root Directory", Penumbra.Config.ModDirectory, FontAwesomeIcon.Gamepad, 0) ); + // Remove Videos and Music. - fileManager.CustomSideBarItems.Add( ("Videos", string.Empty, 0, -1) ); - fileManager.CustomSideBarItems.Add( ("Music", string.Empty, 0, -1) ); + fileManager.CustomSideBarItems.Add( ( "Videos", string.Empty, 0, -1 ) ); + fileManager.CustomSideBarItems.Add( ( "Music", string.Empty, 0, -1 ) ); return fileManager; } diff --git a/Penumbra/UI/ConfigWindow.cs b/Penumbra/UI/ConfigWindow.cs index ccfac393..edaaddcf 100644 --- a/Penumbra/UI/ConfigWindow.cs +++ b/Penumbra/UI/ConfigWindow.cs @@ -55,32 +55,39 @@ public sealed partial class ConfigWindow : Window, IDisposable { if( Penumbra.ImcExceptions > 0 ) { - using var color = ImRaii.PushColor( ImGuiCol.Text, Colors.RegexWarningBorder ); - ImGui.NewLine(); - ImGui.NewLine(); - ImGui.TextWrapped( $"There were {Penumbra.ImcExceptions} errors while trying to load IMC files from the game data.\n" + DrawProblemWindow( $"There were {Penumbra.ImcExceptions} errors while trying to load IMC files from the game data.\n" + "This usually means that your game installation was corrupted by updating the game while having TexTools mods still active.\n" + "It is recommended to not use TexTools and Penumbra (or other Lumina-based tools) at the same time.\n\n" + "Please use the Launcher's Repair Game Files function to repair your client installation." ); - color.Pop(); - - ImGui.NewLine(); - ImGui.NewLine(); - SettingsTab.DrawDiscordButton( 0 ); - ImGui.SameLine(); - SettingsTab.DrawSupportButton(); - return; } - - using var bar = ImRaii.TabBar( string.Empty, ImGuiTabBarFlags.NoTooltip ); - SetupSizes(); - _settingsTab.Draw(); - DrawModsTab(); - _collectionsTab.Draw(); - DrawChangedItemTab(); - _effectiveTab.Draw(); - _debugTab.Draw(); - _resourceTab.Draw(); + else if( MainClass.IsNotInstalledPenumbra ) + { + DrawProblemWindow( + $"You are loading a release version of Penumbra from \"{Dalamud.PluginInterface.AssemblyLocation.Directory?.FullName ?? "Unknown"}\" instead of the installedPlugins directory.\n\n" + + "You should not install Penumbra manually, but rather add the plugin repository under settings and then install it via the plugin installer.\n\n" + + "If you do not know how to do this, please take a look at the readme in Penumbras github repository or join us in discord.\n" + + "If you are developing for Penumbra and see this, you should compile your version in debug mode to avoid it." ); + } + else if( MainClass.DevPenumbraExists ) + { + DrawProblemWindow( + $"You are loading a installed version of Penumbra from \"{Dalamud.PluginInterface.AssemblyLocation.Directory?.FullName ?? "Unknown"}\", " + + "but also still have some remnants of a custom install of Penumbra in your devPlugins folder.\n\n" + + "This can cause some issues, so please go to your \"%%appdata%%\\XIVLauncher\\devPlugins\" folder and delete the Penumbra folder from there.\n\n" + + "If you are developing for Penumbra, try to avoid mixing versions. This warning will not appear if compiled in Debug mode." ); + } + else + { + using var bar = ImRaii.TabBar( string.Empty, ImGuiTabBarFlags.NoTooltip ); + SetupSizes(); + _settingsTab.Draw(); + DrawModsTab(); + _collectionsTab.Draw(); + DrawChangedItemTab(); + _effectiveTab.Draw(); + _debugTab.Draw(); + _resourceTab.Draw(); + } } catch( Exception e ) { @@ -88,6 +95,21 @@ public sealed partial class ConfigWindow : Window, IDisposable } } + private static void DrawProblemWindow( string text ) + { + using var color = ImRaii.PushColor( ImGuiCol.Text, Colors.RegexWarningBorder ); + ImGui.NewLine(); + ImGui.NewLine(); + ImGui.TextWrapped( text ); + color.Pop(); + + ImGui.NewLine(); + ImGui.NewLine(); + SettingsTab.DrawDiscordButton( 0 ); + ImGui.SameLine(); + SettingsTab.DrawSupportButton(); + } + public void Dispose() { _selector.Dispose();