Skip to content
Open
27 changes: 27 additions & 0 deletions PCL.Core/App/Localization/Languages/en-US.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -1076,6 +1076,33 @@
<sys:String x:Key="Instance.Resource.Mod.Disabled.Message">You need to install a mod loader such as Forge, Fabric, etc. to use mods. Please go to the download page to install one.&#xA;If you have already installed a mod loader, you may have selected the wrong instance. Please switch to the correct instance.</sys:String>
<sys:String x:Key="Instance.Resource.Mod.Disabled.SelectInstance">Select an instance</sys:String>
<sys:String x:Key="Instance.Resource.Mod.Disabled.Title">This instance cannot install mods</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Entry">Mod Relations</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Entry.ToolTip">View mod dependencies, missing prerequisites and bundled (Jar-in-Jar) structure</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Message">An overview of dependencies and bundled structure between mods. Disabling or deleting a mod will warn about affected dependencies.</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Empty.Title">No mod relations to analyze</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Empty.Message">None of this instance's mods declare dependencies or bundle other mods, or the mod list has not finished loading.</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Section.Warnings">Warnings</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Section.Relations">Mod relations</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Section.Bundled">Bundled mods</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Section.Dependencies">Dependencies</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Warning.Missing">{0} is missing prerequisite(s): {1}</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Warning.VersionMismatch">{0} has version-incompatible prerequisite(s): {1}</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Installed">Installed</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Disabled">Disabled</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Bundled">Bundled</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.VersionMismatch">Version mismatch</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Missing">Missing</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Optional">[optional]</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Bundled.Current">✓ used by this instance</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Bundled.Incompatible">⚠ incompatible with this version</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Bundled.Versions">{0} versions</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Bundled.From">[bundled · from {0}]</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Search.Hint">Search mods: name / ModId / dependency</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.OnlySelf">Only this mod</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.WithDisable">Also disable mods that depend on it</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.WithDelete">Also delete mods that depend on it</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.DisableTitle">Disabling this mod affects {0} mod(s) that depend on it. Choose how to proceed:</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.DeleteTitle">Deleting this mod affects {0} mod(s) that depend on it. Choose how to proceed:</sys:String>
<sys:String x:Key="Instance.Resource.Schematic.DownloadMod">Download Litematica</sys:String>
<sys:String x:Key="Instance.Resource.Schematic.Unavailable.Message">You may need to install the Litematica mod first. If you have already installed one, please launch the game once.&#xA;Alternatively, you may have selected the wrong instance. Please use the instance selection button to switch instances.</sys:String>
<sys:String x:Key="Instance.Resource.Schematic.Unavailable.Title">Schematics unavailable for this instance</sys:String>
Expand Down
27 changes: 27 additions & 0 deletions PCL.Core/App/Localization/Languages/zh-CN.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -1076,6 +1076,33 @@
<sys:String x:Key="Instance.Resource.Mod.Disabled.Message">你需要先安装 Forge、Fabric 等模组加载器才能使用模组,请在下载页面安装这些实例。&#xA;如果你已经安装过了模组加载器,那么你很可能选择了错误的实例,请点击实例选择按钮切换实例。</sys:String>
<sys:String x:Key="Instance.Resource.Mod.Disabled.SelectInstance">实例选择</sys:String>
<sys:String x:Key="Instance.Resource.Mod.Disabled.Title">该实例不可使用模组</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Entry">模组关系</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Entry.ToolTip">查看模组的依赖关系、缺失前置与内嵌(Jar-in-Jar)结构</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Message">这里概览模组间的依赖关系与内嵌结构。禁用或删除模组时会提示受影响的依赖项。</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Empty.Title">没有可分析的模组关系</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Empty.Message">当前实例的模组均无依赖声明或内嵌模组,或模组列表尚未加载完成。</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Section.Warnings">警告</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Section.Relations">模组关系</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Section.Bundled">内嵌模组</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Section.Dependencies">依赖</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Warning.Missing">{0} 缺少前置:{1}</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Warning.VersionMismatch">{0} 前置版本不符:{1}</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Installed">已安装</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Disabled">已禁用</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Bundled">内嵌提供</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.VersionMismatch">版本不符</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Missing">缺失</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Dep.Optional">[可选]</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Bundled.Current">✓ 当前实例使用</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Bundled.Incompatible">⚠ 不适配当前版本</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Bundled.Versions">{0} 个版本</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Bundled.From">[内置 · 来自 {0}]</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Search.Hint">搜索模组:名称 / ModId / 依赖</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.OnlySelf">仅操作此模组</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.WithDisable">连带禁用依赖它的模组</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.WithDelete">连带删除依赖它的模组</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.DisableTitle">禁用此模组会影响 {0} 个依赖它的模组,请选择处理方式</sys:String>
<sys:String x:Key="Instance.Resource.Mod.JarInJar.Cascade.DeleteTitle">删除此模组会影响 {0} 个依赖它的模组,请选择处理方式</sys:String>
<sys:String x:Key="Instance.Resource.Schematic.DownloadMod">下载投影模组</sys:String>
<sys:String x:Key="Instance.Resource.Schematic.Unavailable.Message">你可能需要先安装投影模组,如果已经安装过了投影模组请先启动一次游戏。&#xA;也可能是你选择错了实例,请点击实例选择按钮切换实例。</sys:String>
<sys:String x:Key="Instance.Resource.Schematic.Unavailable.Title">该实例不可用投影原理图</sys:String>
Expand Down
1 change: 1 addition & 0 deletions Plain Craft Launcher 2/FormMain.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1465,6 +1465,7 @@ public enum PageSubType
VersionSchematic = 9,
VersionInstall = 10,
VersionServer = 11,
VersionModJarInJar = 12,
VersionSavesInfo = 0,
VersionSavesDatapack = 1
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ private static void _WriteModInfo(string reportFolder, McInstance? instance)

try
{
ModJarInJarCache.UseInstance(instance.PathInstance);
Comment thread
Lokins577 marked this conversation as resolved.
var modsFolderName = ModLocalComp.GetPathNameByCompType(ModComp.CompType.Mod);
var modsFolder = instance.Info.HasLabyMod
? Path.Combine(instance.PathIndie, "labymod-neo", "fabric", instance.Info.VanillaName, modsFolderName)
Expand Down Expand Up @@ -345,8 +346,9 @@ private static void _WriteModInfo(string reportFolder, McInstance? instance)
foreach (var mod in activeMods)
{
var line = "| |-> " + (mod.Name ?? mod.FileName);
if (!string.IsNullOrWhiteSpace(mod.Version))
line += $" ({mod.Version})";
var version = _CleanVersion(mod.Version);
if (!string.IsNullOrWhiteSpace(version))
line += $" ({version})";
if (mod.Name != mod.FileName)
line += $" [{mod.FileName}]";
sb.AppendLine(line);
Expand All @@ -370,12 +372,19 @@ private static void _WriteModInfo(string reportFolder, McInstance? instance)
sb.AppendLine(Lang.Text("Crash.Report.JarInJarMod.JarInJarNone"));

CrashFileIo.WriteText(Path.Combine(reportFolder, ModInfoFileName), sb.ToString(), Encoding.UTF8);
ModJarInJarCache.Flush();
LogWrapper.Info("Crash", "已导出模组列表及 Jar-in-Jar 信息");
}
catch (Exception ex)
{
LogWrapper.Warn(ex, "Crash", "导出模组信息失败");
}
finally
{
// 复位本线程的"当前实例":含 mods 目录不存在的 early return 与异常路径,
// 否则本线程后续懒加载别实例的 Mod 会被路由进本实例缓存
ModJarInJarCache.UseInstance(null);
}
}

private static IEnumerable<ModLocalComp.LocalCompFile> _FlattenEmbedded(List<ModLocalComp.LocalCompFile> mods)
Expand All @@ -395,11 +404,16 @@ private static void _AppendEmbeddedMods(StringBuilder builder, List<ModLocalComp
foreach (var mod in mods)
{
var line = indent + "|-> " + (mod.Name ?? mod.ModId ?? "?");
if (!string.IsNullOrWhiteSpace(mod.Version))
line += $" ({mod.Version})";
var version = _CleanVersion(mod.Version);
if (!string.IsNullOrWhiteSpace(version))
line += $" ({version})";
builder.AppendLine(line);
if (mod.EmbeddedMods.Any())
_AppendEmbeddedMods(builder, mod.EmbeddedMods, depth + 1);
}
}

// 未解析的版本占位符(如 Fabric ${version}、Forge ${file.jarVersion})显示为空,避免裸 token
private static string _CleanVersion(string version)
=> string.IsNullOrEmpty(version) || version.Contains("${") ? null : version;
}
Loading
Loading