# VPet.Solution

## 修复
- `Settings.lps`不存在时启动失败的问题
- 读取模组信息时失败的问题
This commit is contained in:
Hakoyu 2024-02-04 17:37:45 +08:00
parent a46194b353
commit 61e9b9e5af
12 changed files with 57 additions and 28 deletions

View File

@ -47,6 +47,6 @@ public class AllIsBoolConverter : MultiValueToBoolConverter<AllIsBoolConverter>
{ {
var boolValue = TargetBoolValue; var boolValue = TargetBoolValue;
var nullValue = BoolOnNull; var nullValue = BoolOnNull;
return values.All(o => Utils.GetBool(o, boolValue, nullValue)); return values.All(o => HKWUtils.HKWUtils.GetBool(o, boolValue, nullValue));
} }
} }

View File

@ -90,7 +90,7 @@ public class AllIsBoolToVisibilityConverter
{ {
var boolValue = TargetBoolValue; var boolValue = TargetBoolValue;
var nullValue = BoolOnNull; var nullValue = BoolOnNull;
return values.All(o => Utils.GetBool(o, boolValue, nullValue)) return values.All(o => HKWUtils.HKWUtils.GetBool(o, boolValue, nullValue))
? VisibilityOnTrue ? VisibilityOnTrue
: VisibilityOnFalse; : VisibilityOnFalse;
} }

View File

@ -56,7 +56,7 @@ public class BoolToVisibilityConverter : BoolToValueConverterBase<BoolToVisibili
CultureInfo culture CultureInfo culture
) )
{ {
return Utils.GetBool(value, BoolValue, NullValue) return HKWUtils.HKWUtils.GetBool(value, BoolValue, NullValue)
? TrueVisibilityValue ? TrueVisibilityValue
: FalseVisibilityValue; : FalseVisibilityValue;
} }

View File

@ -57,6 +57,6 @@ public class IsBoolConverter : ValueConverterBase
CultureInfo culture CultureInfo culture
) )
{ {
return Utils.GetBool(value, BoolValue, NullValue); return HKWUtils.HKWUtils.GetBool(value, BoolValue, NullValue);
} }
} }

View File

@ -91,7 +91,7 @@ public class ModLoader
IsSuccesses = false; IsSuccesses = false;
return; return;
} }
var modlps = new LpsDocument(File.ReadAllText(infoFile)); var modlps = new LPS(File.ReadAllText(infoFile));
Name = modlps.FindLine("vupmod").Info; Name = modlps.FindLine("vupmod").Info;
Intro = modlps.FindLine("intro").Info; Intro = modlps.FindLine("intro").Info;
GameVer = modlps.FindSub("gamever").InfoToInt; GameVer = modlps.FindSub("gamever").InfoToInt;
@ -119,7 +119,7 @@ public class ModLoader
{ {
try try
{ {
Image = Utils.LoadImageToStream(imagePath); Image = HKWUtils.LoadImageToStream(imagePath);
} }
catch { } catch { }
} }

View File

@ -8,8 +8,10 @@ using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using VPet.Solution.Views.SettingEditor;
using VPet_Simulator.Windows.Interface; using VPet_Simulator.Windows.Interface;
namespace VPet.Solution.Models.SettingEditor; namespace VPet.Solution.Models.SettingEditor;
@ -21,16 +23,8 @@ public class ModSettingModel : ObservableClass<ModSettingModel>
public const string MsgModLineName = "msgmod"; public const string MsgModLineName = "msgmod";
public const string WorkShopLineName = "workshop"; public const string WorkShopLineName = "workshop";
public static string ModDirectory = Path.Combine(Environment.CurrentDirectory, "mod"); public static string ModDirectory = Path.Combine(Environment.CurrentDirectory, "mod");
public static Dictionary<string, ModLoader> LocalMods = Directory.Exists(ModDirectory) is false public static Dictionary<string, ModLoader> LocalMods { get; private set; } = null;
? new(StringComparer.OrdinalIgnoreCase)
: new(
Directory
.EnumerateDirectories(ModDirectory)
.Select(d => new ModLoader(d))
.Distinct(CompareUtils<ModLoader>.Create(m => m.Name))
.ToDictionary(m => m.Name, m => m),
StringComparer.OrdinalIgnoreCase
);
#region Mods #region Mods
private ObservableCollection<ModModel> _mods = new(); private ObservableCollection<ModModel> _mods = new();
public ObservableCollection<ModModel> Mods public ObservableCollection<ModModel> Mods
@ -41,6 +35,7 @@ public class ModSettingModel : ObservableClass<ModSettingModel>
public ModSettingModel(Setting setting) public ModSettingModel(Setting setting)
{ {
LocalMods ??= GetLocalMods();
foreach (var item in setting[ModLineName]) foreach (var item in setting[ModLineName])
{ {
var modName = item.Name; var modName = item.Name;
@ -77,6 +72,24 @@ public class ModSettingModel : ObservableClass<ModSettingModel>
} }
} }
private static Dictionary<string, ModLoader> GetLocalMods()
{
var dic = new Dictionary<string, ModLoader>(StringComparer.OrdinalIgnoreCase);
foreach (var dir in Directory.EnumerateDirectories(ModDirectory))
{
try
{
var loader = new ModLoader(dir);
dic.TryAdd(loader.Name, loader);
}
catch (Exception ex)
{
MessageBox.Show("模组载入错误\n路径:{0}\n异常:{1}".Translate(dir, ex));
}
}
return dic;
}
public void Close() public void Close()
{ {
foreach (var modLoader in LocalMods) foreach (var modLoader in LocalMods)

View File

@ -1,11 +1,12 @@
using System.Windows.Media.Imaging; using System.Text;
using System.Windows.Media.Imaging;
namespace HKW.HKWUtils; namespace HKW.HKWUtils;
/// <summary> /// <summary>
/// 工具 /// 工具
/// </summary> /// </summary>
public static class Utils public static class HKWUtils
{ {
/// <summary> /// <summary>
/// 解码像素宽度 /// 解码像素宽度
@ -123,4 +124,17 @@ public static class Utils
.Start("Explorer", $"/select,{Path.GetFullPath(filePath)}") .Start("Explorer", $"/select,{Path.GetFullPath(filePath)}")
?.Close(); ?.Close();
} }
/// <summary>
/// 从文件获取只读流 (用于目标文件被其它进程访问的情况)
/// </summary>
/// <param name="path">文件</param>
/// <param name="encoding">编码</param>
/// <returns>流读取器</returns>
public static StreamReader StreamReaderOnReadOnly(string path, Encoding? encoding = null)
{
encoding ??= Encoding.UTF8;
var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
return new StreamReader(fs, encoding);
}
} }

View File

@ -227,7 +227,7 @@
<Compile Include="Utils\ObservableRange.cs" /> <Compile Include="Utils\ObservableRange.cs" />
<Compile Include="Utils\ObservablePoint.cs" /> <Compile Include="Utils\ObservablePoint.cs" />
<Compile Include="Utils\ObservableRect.cs" /> <Compile Include="Utils\ObservableRect.cs" />
<Compile Include="Utils\Utils.cs" /> <Compile Include="Utils\HKWUtils.cs" />
<Compile Include="Resources\NativeResources.cs" /> <Compile Include="Resources\NativeResources.cs" />
<Compile Include="Usings.cs" /> <Compile Include="Usings.cs" />
<Page Include="NativeStyles.xaml"> <Page Include="NativeStyles.xaml">

View File

@ -23,7 +23,7 @@ public class MainWindowVM : ObservableClass<MainWindowVM>
_mainSetting = SettingWindowVM.Current.ShowSettings.FirstOrDefault( _mainSetting = SettingWindowVM.Current.ShowSettings.FirstOrDefault(
m => m.Name == nameof(Setting) m => m.Name == nameof(Setting)
); );
if (string.IsNullOrWhiteSpace(_mainSetting.GraphicsSetting.Language)) if (string.IsNullOrWhiteSpace(_mainSetting?.GraphicsSetting?.Language))
CurrentCulture = LocalizeCore.CurrentCulture; CurrentCulture = LocalizeCore.CurrentCulture;
else else
CurrentCulture = _mainSetting.GraphicsSetting.Language; CurrentCulture = _mainSetting.GraphicsSetting.Language;
@ -43,9 +43,11 @@ public class MainWindowVM : ObservableClass<MainWindowVM>
private void FirstStartFailedCommand_ExecuteCommand() private void FirstStartFailedCommand_ExecuteCommand()
{ {
if (LocalizeCore.CurrentCulture == "zh-Hans") if (LocalizeCore.CurrentCulture == "zh-Hans")
Utils.OpenLink("https://www.bilibili.com/read/cv26510496/"); HKWUtils.OpenLink("https://www.bilibili.com/read/cv26510496/");
else else
Utils.OpenLink("https://steamcommunity.com/games/1920960/announcements/detail/3681184905256253203"); HKWUtils.OpenLink(
"https://steamcommunity.com/games/1920960/announcements/detail/3681184905256253203"
);
} }
#region Property #region Property

View File

@ -72,12 +72,12 @@ public class SaveWindowVM : ObservableClass<SaveWindowVM>
private void OpenFileInExplorerCommand_ExecuteCommand(SaveModel parameter) private void OpenFileInExplorerCommand_ExecuteCommand(SaveModel parameter)
{ {
Utils.OpenFileInExplorer(parameter.FilePath); HKWUtils.OpenFileInExplorer(parameter.FilePath);
} }
private void OpenFileCommand_ExecuteCommand(SaveModel parameter) private void OpenFileCommand_ExecuteCommand(SaveModel parameter)
{ {
Utils.OpenLink(parameter.FilePath); HKWUtils.OpenLink(parameter.FilePath);
} }
public void RefreshShowSaves(string name) public void RefreshShowSaves(string name)

View File

@ -130,7 +130,7 @@ public class ModSettingPageVM : ObservableClass<ModSettingPageVM>
private void OpenSteamCommunityCommand_ExecuteCommand(ModModel parameter) private void OpenSteamCommunityCommand_ExecuteCommand(ModModel parameter)
{ {
Utils.OpenLink( HKWUtils.OpenLink(
"https://steamcommunity.com/sharedfiles/filedetails/?id=" + parameter.ItemId "https://steamcommunity.com/sharedfiles/filedetails/?id=" + parameter.ItemId
); );
} }
@ -139,7 +139,7 @@ public class ModSettingPageVM : ObservableClass<ModSettingPageVM>
{ {
try try
{ {
Utils.OpenLink(parameter.ModPath); HKWUtils.OpenLink(parameter.ModPath);
} }
catch catch
{ {

View File

@ -111,12 +111,12 @@ public class SettingWindowVM : ObservableClass<SettingWindowVM>
private void OpenFileInExplorerCommand_ExecuteCommand(SettingModel parameter) private void OpenFileInExplorerCommand_ExecuteCommand(SettingModel parameter)
{ {
Utils.OpenFileInExplorer(parameter.FilePath); HKWUtils.OpenFileInExplorer(parameter.FilePath);
} }
private void OpenFileCommand_ExecuteCommand(SettingModel parameter) private void OpenFileCommand_ExecuteCommand(SettingModel parameter)
{ {
Utils.OpenLink(parameter.FilePath); HKWUtils.OpenLink(parameter.FilePath);
} }
private void SaveAllSettingCommand_ExecuteCommand() private void SaveAllSettingCommand_ExecuteCommand()