diff --git a/ModForge.Shared/Services/IconService.cs b/ModForge.Shared/Services/IconService.cs index f9dee98..998063d 100644 --- a/ModForge.Shared/Services/IconService.cs +++ b/ModForge.Shared/Services/IconService.cs @@ -45,7 +45,20 @@ public IconService(UserConfigurationService configService, ILogger public string? GetBase64Icon(string iconId, string matchingFolder = null!) { + if (string.IsNullOrEmpty(configService.Current.GameDirectory)) + { + logger.LogWarning("Game directory is not configured. Cannot load icon: {IconId}", iconId); + return null; + } + string pakPath = Path.Combine(configService.Current.GameDirectory, "Data", "IPL_GameData.pak"); + + if (!File.Exists(pakPath)) + { + logger.LogWarning("Game data file not found at: {PakPath}", pakPath); + return null; + } + string targetFilename = $"{iconId}"; using FileStream zipStream = new(pakPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); diff --git a/ModForge.Shared/Services/ModService.cs b/ModForge.Shared/Services/ModService.cs index 6c40550..35986ba 100644 --- a/ModForge.Shared/Services/ModService.cs +++ b/ModForge.Shared/Services/ModService.cs @@ -72,6 +72,13 @@ public void InitiateModCollections() } var modFolder = Path.Combine(userConfigurationService.Current.GameDirectory, "Mods"); + + if (!Directory.Exists(modFolder)) + { + Directory.CreateDirectory(modFolder); + logger.LogInformation("Created Mods folder at: {ModFolder}", modFolder); + } + var modDirectories = Directory.EnumerateDirectories(modFolder); ModCollection.Clear(); @@ -229,6 +236,12 @@ public void DeleteMod(ModDescription mod) } var modFolder = Path.Combine(userConfigurationService.Current.GameDirectory, "Mods"); + + if (!Directory.Exists(modFolder)) + { + return; // Nothing to delete if Mods folder doesn't exist + } + var modDirectories = Directory.EnumerateDirectories(modFolder); foreach (var modPath in modDirectories) diff --git a/ModForge.Shared/Services/XmlService.cs b/ModForge.Shared/Services/XmlService.cs index 2d12939..8a4c948 100644 --- a/ModForge.Shared/Services/XmlService.cs +++ b/ModForge.Shared/Services/XmlService.cs @@ -45,8 +45,8 @@ ILogger logger } #region Properties - public IList Perks { get; private set; } - public IList Buffs { get; private set; } + public IList Perks { get; private set; } = new List(); + public IList Buffs { get; private set; } = new List(); public IList Weapons { get; private set; } = new List(); public IList Armors { get; private set; } = new List(); public IList Consumeables { get; private set; } = new List(); diff --git a/ModForge.UI/Components/MenuComponents/NewMod.razor.cs b/ModForge.UI/Components/MenuComponents/NewMod.razor.cs index abd7009..5e7923b 100644 --- a/ModForge.UI/Components/MenuComponents/NewMod.razor.cs +++ b/ModForge.UI/Components/MenuComponents/NewMod.razor.cs @@ -107,6 +107,13 @@ public void StartModding() return; } + if (string.IsNullOrEmpty(UserConfigurationService?.Current?.GameDirectory)) + { + Logger?.LogWarning("Game directory is not configured. Cannot start modding."); + Snackbar?.Add("Please configure your game directory in Settings before starting a mod.", Severity.Error); + return; + } + var mod = ModService.CreateNewMod(name, description, author, version, createdOn, modId, modifiesLevel, supportedGameVersions); if (mod is null) diff --git a/ModForge.UI/Components/ModItemComponents/Armors.razor.cs b/ModForge.UI/Components/ModItemComponents/Armors.razor.cs index 0f33dc7..da7129f 100644 --- a/ModForge.UI/Components/ModItemComponents/Armors.razor.cs +++ b/ModForge.UI/Components/ModItemComponents/Armors.razor.cs @@ -206,7 +206,7 @@ protected override async Task OnInitializedAsync() { SetLanguage(); ModService.TryGetModFromCollection(ModId); - armors = await Task.Run(() => XmlService.Armors.ToList()); + armors = await Task.Run(() => XmlService.Armors?.ToList() ?? new List()); isLoaded = true; } diff --git a/ModForge.UI/Components/ModItemComponents/Buffs.razor.cs b/ModForge.UI/Components/ModItemComponents/Buffs.razor.cs index 10ed70c..83133ba 100644 --- a/ModForge.UI/Components/ModItemComponents/Buffs.razor.cs +++ b/ModForge.UI/Components/ModItemComponents/Buffs.razor.cs @@ -214,7 +214,7 @@ protected override async Task OnInitializedAsync() { SetLanguage(); ModService.TryGetModFromCollection(ModId); - buffs = await Task.Run(() => XmlService.Buffs.ToList()); + buffs = await Task.Run(() => XmlService.Buffs?.ToList() ?? new List()); isLoaded = true; } } diff --git a/ModForge.UI/Components/ModItemComponents/Consumables.razor.cs b/ModForge.UI/Components/ModItemComponents/Consumables.razor.cs index 27be7d2..e7b2a3b 100644 --- a/ModForge.UI/Components/ModItemComponents/Consumables.razor.cs +++ b/ModForge.UI/Components/ModItemComponents/Consumables.razor.cs @@ -223,7 +223,7 @@ protected override async Task OnInitializedAsync() { SetLanguage(); ModService.TryGetModFromCollection(ModId); - consumables = await Task.Run(() => XmlService.Consumeables.ToList()); + consumables = await Task.Run(() => XmlService.Consumeables?.ToList() ?? new List()); isLoaded = true; } } diff --git a/ModForge.UI/Components/ModItemComponents/CraftingMaterials.razor.cs b/ModForge.UI/Components/ModItemComponents/CraftingMaterials.razor.cs index bc6b8e2..cee858d 100644 --- a/ModForge.UI/Components/ModItemComponents/CraftingMaterials.razor.cs +++ b/ModForge.UI/Components/ModItemComponents/CraftingMaterials.razor.cs @@ -223,7 +223,7 @@ protected override async Task OnInitializedAsync() { SetLanguage(); ModService.TryGetModFromCollection(ModId); - craftingMaterials = await Task.Run(() => XmlService.CraftingMaterials.ToList()); + craftingMaterials = await Task.Run(() => XmlService.CraftingMaterials?.ToList() ?? new List()); isLoaded = true; } } diff --git a/ModForge.UI/Components/ModItemComponents/MiscItems.razor.cs b/ModForge.UI/Components/ModItemComponents/MiscItems.razor.cs index d3c03d1..5f64e61 100644 --- a/ModForge.UI/Components/ModItemComponents/MiscItems.razor.cs +++ b/ModForge.UI/Components/ModItemComponents/MiscItems.razor.cs @@ -223,7 +223,7 @@ protected override async Task OnInitializedAsync() { SetLanguage(); ModService.TryGetModFromCollection(ModId); - miscItems = await Task.Run(() => XmlService.MiscItems.ToList()); + miscItems = await Task.Run(() => XmlService.MiscItems?.ToList() ?? new List()); isLoaded = true; } } diff --git a/ModForge.UI/Components/ModItemComponents/Perks.razor.cs b/ModForge.UI/Components/ModItemComponents/Perks.razor.cs index f166a92..340898c 100644 --- a/ModForge.UI/Components/ModItemComponents/Perks.razor.cs +++ b/ModForge.UI/Components/ModItemComponents/Perks.razor.cs @@ -224,7 +224,7 @@ protected override async Task OnInitializedAsync() { SetLanguage(); ModService.TryGetModFromCollection(ModId); - perks = await Task.Run(() => XmlService.Perks.ToList()); + perks = await Task.Run(() => XmlService.Perks?.ToList() ?? new List()); isLoaded = true; } } diff --git a/ModForge.UI/Components/ModItemComponents/Weapons.razor.cs b/ModForge.UI/Components/ModItemComponents/Weapons.razor.cs index c500a3d..1ed80f2 100644 --- a/ModForge.UI/Components/ModItemComponents/Weapons.razor.cs +++ b/ModForge.UI/Components/ModItemComponents/Weapons.razor.cs @@ -223,7 +223,7 @@ protected override async Task OnInitializedAsync() { SetLanguage(); ModService.TryGetModFromCollection(ModId); - weapons = await Task.Run(() => XmlService.Weapons.ToList()); + weapons = await Task.Run(() => XmlService.Weapons?.ToList() ?? new List()); isLoaded = true; } }