diff --git a/Dalamud/Data/DataManager.cs b/Dalamud/Data/DataManager.cs
index d017bf85a..ed0aa6c4d 100644
--- a/Dalamud/Data/DataManager.cs
+++ b/Dalamud/Data/DataManager.cs
@@ -41,7 +41,7 @@ internal sealed class DataManager : IInternalDisposableService, IDataManager
try
{
Log.Verbose("Starting data load...");
-
+
using (Timings.Start("Lumina Init"))
{
var luminaOptions = new LuminaOptions
@@ -53,12 +53,25 @@ internal sealed class DataManager : IInternalDisposableService, IDataManager
DefaultExcelLanguage = this.Language.ToLumina(),
};
- this.GameData = new(
- Path.Combine(Path.GetDirectoryName(Environment.ProcessPath)!, "sqpack"),
- luminaOptions)
+ try
{
- StreamPool = new(),
- };
+ this.GameData = new(
+ Path.Combine(Path.GetDirectoryName(Environment.ProcessPath)!, "sqpack"),
+ luminaOptions)
+ {
+ StreamPool = new(),
+ };
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex, "Lumina GameData init failed");
+ Util.Fatal(
+ "Dalamud could not read required game data files. This likely means your game installation is corrupted or incomplete.\n\n" +
+ "Please repair your installation by right-clicking the login button in XIVLauncher and choosing \"Repair game files\".",
+ "Dalamud");
+
+ return;
+ }
Log.Information("Lumina is ready: {0}", this.GameData.DataPath);
@@ -71,7 +84,7 @@ internal sealed class DataManager : IInternalDisposableService, IDataManager
dalamud.StartInfo.TroubleshootingPackData);
this.HasModifiedGameDataFiles =
tsInfo?.IndexIntegrity is LauncherTroubleshootingInfo.IndexIntegrityResult.Failed or LauncherTroubleshootingInfo.IndexIntegrityResult.Exception;
-
+
if (this.HasModifiedGameDataFiles)
Log.Verbose("Game data integrity check failed!\n{TsData}", dalamud.StartInfo.TroubleshootingPackData);
}
@@ -130,7 +143,7 @@ internal sealed class DataManager : IInternalDisposableService, IDataManager
#region Lumina Wrappers
///
- public ExcelSheet GetExcelSheet(ClientLanguage? language = null, string? name = null) where T : struct, IExcelRow
+ public ExcelSheet GetExcelSheet(ClientLanguage? language = null, string? name = null) where T : struct, IExcelRow
=> this.Excel.GetSheet(language?.ToLumina(), name);
///
@@ -138,7 +151,7 @@ internal sealed class DataManager : IInternalDisposableService, IDataManager
=> this.Excel.GetSubrowSheet(language?.ToLumina(), name);
///
- public FileResource? GetFile(string path)
+ public FileResource? GetFile(string path)
=> this.GetFile(path);
///
@@ -161,7 +174,7 @@ internal sealed class DataManager : IInternalDisposableService, IDataManager
: Task.FromException(new FileNotFoundException("The file could not be found."));
///
- public bool FileExists(string path)
+ public bool FileExists(string path)
=> this.GameData.FileExists(path);
#endregion