Skip to content

Commit 1d81c8b

Browse files
committed
Merge branch 'Language' of github.com:tangge233/PCL2
2 parents f3c8fce + 6653bcd commit 1d81c8b

38 files changed

+1889
-786
lines changed

Plain Craft Launcher 2/FormMain.xaml.vb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ Public Class FormMain
1010
Dim FeatureList As New List(Of KeyValuePair(Of Integer, String))
1111
'统计更新日志条目
1212
#If BETA Then
13+
If LastVersion < 354 Then 'Release 2.9.3
14+
FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:Minecraft 会优先使用独立显卡运行"))
15+
FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:简化下载新版本第二步的 UI"))
16+
FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:使用新的版本隔离策略"))
17+
FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:添加了在全局启动设置与版本独立设置之间互相跳转的按钮"))
18+
FeatureCount += 20
19+
BugCount += 28
20+
End If
1321
If LastVersion < 352 Then 'Release 2.9.1
1422
FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "新增:导出整合包功能"))
1523
FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:支持在超长路径下安装、启动游戏"))
@@ -58,6 +66,14 @@ Public Class FormMain
5866
'3:BUG+ IMP* FEAT-
5967
'2:BUG* IMP-
6068
'1:BUG-
69+
If LastVersion < 353 Then 'Snapshot 2.9.3
70+
If LastVersion = 352 Then
71+
FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:低版本 MC 没有声音"))
72+
FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:若不安装 Mod 加载器,则无法安装 OptiFine 1.14+"))
73+
End If
74+
FeatureCount += 8
75+
BugCount += 8
76+
End If
6177
If LastVersion < 352 Then 'Snapshot 2.9.2
6278
FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:Minecraft 会优先使用独立显卡运行"))
6379
FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:简化下载新版本第二步的 UI"))

Plain Craft Launcher 2/Modules/Base/ModBase.vb

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
Imports System.Globalization
22
Imports System.IO.Compression
3+
Imports System.Reflection
34
Imports System.Runtime.CompilerServices
45
Imports System.Security.Cryptography
56
Imports System.Security.Principal
67
Imports System.Text.RegularExpressions
7-
Imports System.Windows.Markup
8+
Imports System.Xaml
89
Imports Newtonsoft.Json
910

1011
Public Module ModBase
1112

1213
#Region "声明"
1314

1415
'下列版本信息由更新器自动修改
15-
Public Const VersionBaseName As String = "2.9.2" '不含分支前缀的显示用版本名
16-
Public Const VersionStandardCode As String = "2.9.2." & VersionBranchCode '标准格式的四段式版本号
16+
Public Const VersionBaseName As String = "2.9.3" '不含分支前缀的显示用版本名
17+
Public Const VersionStandardCode As String = "2.9.3." & VersionBranchCode '标准格式的四段式版本号
1718
Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换
1819
#If BETA Then
19-
Public Const VersionCode As Integer = 352 'Release
20+
Public Const VersionCode As Integer = 355 'Release
2021
#Else
21-
Public Const VersionCode As Integer = 353 'Snapshot
22+
Public Const VersionCode As Integer = 354 'Snapshot
2223
#End If
2324
'自动生成的版本信息
2425
Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -1698,6 +1699,7 @@ RetryDir:
16981699
End Function
16991700
''' <summary>
17001701
''' 获取处于两个子字符串之间的部分,裁切尽可能多的内容。
1702+
''' 等效于 AfterLast 后接 BeforeFirst。
17011703
''' 如果未找到子字符串则不裁切。
17021704
''' </summary>
17031705
<Extension> Public Function Between(Str As String, After As String, Before As String, Optional IgnoreCase As Boolean = False) As String
@@ -2750,13 +2752,27 @@ Retry:
27502752
''' <summary>
27512753
''' 将 XML 转换为对应 UI 对象。
27522754
''' </summary>
2753-
Public Function GetObjectFromXML(Str As String)
2754-
Using Stream As New MemoryStream
2755+
Public Function GetObjectFromXML(Str As String) As Object
2756+
Using Stream As New MemoryStream(Encoding.UTF8.GetBytes(Str))
2757+
'类型检查
2758+
Using Reader As New XamlXmlReader(Stream)
2759+
While Reader.Read()
2760+
For Each BlackListType In {GetType(WebBrowser), GetType(Frame), GetType(MediaElement), GetType(ObjectDataProvider), GetType(XamlReader), GetType(Window), GetType(XmlDataProvider)}
2761+
If Reader.Type IsNot Nothing AndAlso BlackListType.IsAssignableFrom(Reader.Type.UnderlyingType) Then Throw New UnauthorizedAccessException($"不允许使用 {BlackListType.Name} 类型。")
2762+
If Reader.Value IsNot Nothing AndAlso Reader.Value = BlackListType.Name Then Throw New UnauthorizedAccessException($"不允许使用 {BlackListType.Name} 值。")
2763+
Next
2764+
For Each BlackListMember In {"Code", "FactoryMethod", "Static"}
2765+
If Reader.Member IsNot Nothing AndAlso Reader.Member.Name = BlackListMember Then Throw New UnauthorizedAccessException($"不允许使用 {BlackListMember} 成员。")
2766+
Next
2767+
End While
2768+
End Using
2769+
'实际的加载
2770+
Stream.Position = 0
27552771
Using Writer As New StreamWriter(Stream)
27562772
Writer.Write(Str)
27572773
Writer.Flush()
27582774
Stream.Position = 0
2759-
Return XamlReader.Load(Stream)
2775+
Return Markup.XamlReader.Load(Stream)
27602776
End Using
27612777
End Using
27622778
End Function

Plain Craft Launcher 2/Modules/Base/ModValidate.vb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,13 @@ Public Class ValidateExcept
153153
Public Sub New()
154154
ErrorMessage = GetLang("LangModValidateNoContain")
155155
End Sub '用于 XAML 初始化
156-
Public Sub New(Excepts As ObjectModel.Collection(Of String), Optional ErrorMessage As String = "输入内容不能包含 %")
157-
If ErrorMessage.Equals("输入内容不能包含 %") Then ErrorMessage = GetLang("LangModValidateNoContain")
156+
Public Sub New(Excepts As ObjectModel.Collection(Of String), Optional ErrorMessage As String = "输入内容不能包含 %")
157+
If ErrorMessage.Equals("输入内容不能包含 %") Then ErrorMessage = GetLang("LangModValidateNoContain")
158158
Me.Excepts = Excepts
159159
Me.ErrorMessage = ErrorMessage
160160
End Sub
161-
Public Sub New(Excepts As IEnumerable, Optional ErrorMessage As String = "输入内容不能包含 %")
162-
If ErrorMessage.Equals("输入内容不能包含 %") Then ErrorMessage = GetLang("LangModValidateNoContain")
161+
Public Sub New(Excepts As IEnumerable, Optional ErrorMessage As String = "输入内容不能包含 %")
162+
If ErrorMessage.Equals("输入内容不能包含 %") Then ErrorMessage = GetLang("LangModValidateNoContain")
163163
Me.Excepts = New ObjectModel.Collection(Of String)
164164
Me.ErrorMessage = ErrorMessage
165165
For Each Data As String In Excepts
@@ -188,14 +188,14 @@ Public Class ValidateExceptSame
188188
Public Property IgnoreCase As Boolean = False
189189
Public Sub New()
190190
End Sub
191-
Public Sub New(Excepts As ObjectModel.Collection(Of String), Optional ErrorMessage As String = "输入内容不能为 %", Optional IgnoreCase As Boolean = False)
192-
If ErrorMessage.Equals("输入内容不能为 %") Then ErrorMessage = GetLang("LangModValidateNoContent")
191+
Public Sub New(Excepts As ObjectModel.Collection(Of String), Optional ErrorMessage As String = "输入内容不能为 %", Optional IgnoreCase As Boolean = False)
192+
If ErrorMessage.Equals("输入内容不能为 %") Then ErrorMessage = GetLang("LangModValidateNoContent")
193193
Me.Excepts = Excepts
194194
Me.ErrorMessage = ErrorMessage
195195
Me.IgnoreCase = IgnoreCase
196196
End Sub
197-
Public Sub New(Excepts As IEnumerable, Optional ErrorMessage As String = "输入内容不能为 %", Optional IgnoreCase As Boolean = False)
198-
If ErrorMessage.Equals("输入内容不能为 %") Then ErrorMessage = GetLang("LangModValidateNoContent")
197+
Public Sub New(Excepts As IEnumerable, Optional ErrorMessage As String = "输入内容不能为 %", Optional IgnoreCase As Boolean = False)
198+
If ErrorMessage.Equals("输入内容不能为 %") Then ErrorMessage = GetLang("LangModValidateNoContent")
199199
Me.Excepts = New ObjectModel.Collection(Of String)
200200
For Each Data As String In Excepts
201201
Me.Excepts.Add(Data)

Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,9 @@ Done:
563563
If LogCrash.Contains("has mods that were not found") AndAlso RegexCheck(LogCrash, "The Mod File [^\n]+optifine\\OptiFine[^\n]+ has mods that were not found") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
564564
'Mod 导致的崩溃
565565
If LogCrash.Contains("-- MOD ") Then
566-
If LogCrash.Between("-- MOD ", "Failure message:").ContainsF(".jar", True) Then
567-
AppendReason(CrashReason.确定Mod导致游戏崩溃, If(RegexSeek(LogCrash, "(?<=Mod File: ).+"), "").TrimEnd((vbCrLf & " ").ToCharArray))
566+
Dim LogCrashMod As String = LogCrash.Between("-- MOD ", "Failure message:")
567+
If LogCrashMod.ContainsF(".jar", True) Then
568+
AppendReason(CrashReason.确定Mod导致游戏崩溃, If(RegexSeek(LogCrashMod, "(?<=Mod File: ).+"), "").TrimEnd((vbCrLf & " ").ToCharArray))
568569
Else
569570
AppendReason(CrashReason.Mod加载器报错, If(RegexSeek(LogCrash, "(?<=Failure message: )[\w\W]+?(?=\tMod)"), "").Replace(vbTab, " ").TrimEnd((vbCrLf & " ").ToCharArray))
570571
End If

Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,13 +670,14 @@ Wait:
670670
'若该目录有 Java,则加入结果
671671
If File.Exists(Path & "javaw.exe") Then Results(Path) = Source
672672
'查找其下的所有文件夹
673+
'不应使用网易的 Java:https://github.com/Hex-Dragon/PCL2/issues/1279#issuecomment-2761489121
673674
Dim Keywords = {"java", "jdk", "env", "环境", "run", "软件", "jre", "mc", "dragon",
674675
"soft", "cache", "temp", "corretto", "roaming", "users", "craft", "program", "世界", "net",
675676
"游戏", "oracle", "game", "file", "data", "jvm", "服务", "server", "客户", "client", "整合",
676677
"应用", "运行", "前置", "mojang", "官启", "新建文件夹", "eclipse", "microsoft", "hotspot",
677678
"runtime", "x86", "x64", "forge", "原版", "optifine", "官方", "启动", "hmcl", "mod", "高清",
678679
"download", "launch", "程序", "path", "version", "baka", "pcl", "zulu", "local", "packages",
679-
"4297127d64ec6", "国服", "网易", "ext", "netease", "1.", "启动"}
680+
"4297127d64ec6", "1.", "启动"}
680681
For Each FolderInfo As DirectoryInfo In OriginalPath.EnumerateDirectories
681682
If FolderInfo.Attributes.HasFlag(FileAttributes.ReparsePoint) Then Continue For '跳过符号链接
682683
Dim SearchEntry = GetFolderNameFromPath(FolderInfo.Name).ToLower '用于搜索的字符串

Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -220,18 +220,21 @@ NextInner:
220220
If CheckResult <> "" Then Throw New ArgumentException(CheckResult)
221221
#If BETA Then
222222
'求赞助
223-
RunInNewThread(
224-
Sub()
225-
Select Case Setup.Get("SystemLaunchCount")
226-
Case 10, 20, 40, 60, 80, 100, 120, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, 1000, 1200, 1400, 1600, 1800, 2000
227-
If MyMsgBox(GetLang("LangModLaunchDialogContentSponsorship", Setup.Get("SystemLaunchCount")),GetLang("LangModLaunchDialogTitleSponsorship", Setup.Get("SystemLaunchCount")), GetLang("LangModLaunchDialogBtn1Sponsorship"), GetLang("LangModLaunchDialogBtn2Sponsorship")) = 1 Then
228-
OpenWebsite("https://afdian.com/a/LTCat")
229-
End If
230-
End Select
231-
End Sub, "Donate")
223+
If CurrentLaunchOptions?.SaveBatch Is Nothing Then '保存脚本时不提示
224+
RunInNewThread(
225+
Sub()
226+
Select Case Setup.Get("SystemLaunchCount")
227+
Case 10, 20, 40, 60, 80, 100, 120, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, 1000, 1200, 1400, 1600, 1800, 2000
228+
If MyMsgBox(GetLang("LangModLaunchDialogContentSponsorship", Setup.Get("SystemLaunchCount")),GetLang("LangModLaunchDialogTitleSponsorship", Setup.Get("SystemLaunchCount")), GetLang("LangModLaunchDialogBtn1Sponsorship"), GetLang("LangModLaunchDialogBtn2Sponsorship")) = 1 Then
229+
OpenWebsite("https://afdian.com/a/LTCat")
230+
End If
231+
End Select
232+
End Sub, "Donate")
233+
End If
232234
#End If
233235
'正版购买提示
234-
If Not Setup.Get("HintBuy") AndAlso Setup.Get("LoginType") <> McLoginType.Ms Then
236+
If CurrentLaunchOptions?.SaveBatch Is Nothing AndAlso '保存脚本时不提示
237+
Not Setup.Get("HintBuy") AndAlso Setup.Get("LoginType") <> McLoginType.Ms Then
235238
If IsSystemLanguageChinese() Then
236239
RunInNewThread(
237240
Sub()
@@ -1339,6 +1342,12 @@ Retry:
13391342
Arguments += " " & McLaunchArgumentsGameNew(McVersionCurrent)
13401343
McLaunchLog("新版 Game 参数获取成功")
13411344
End If
1345+
'编码参数(#5818、#5892)
1346+
If McLaunchJavaSelected.VersionCode > 8 Then
1347+
If Not Arguments.Contains("-Dfile.encoding=") Then Arguments += " -Dfile.encoding=UTF-8"
1348+
If Not Arguments.Contains("-Dstdout.encoding=") Then Arguments += " -Dstdout.encoding=UTF-8"
1349+
If Not Arguments.Contains("-Dstderr.encoding=") Then Arguments += " -Dstderr.encoding=UTF-8"
1350+
End If
13421351
'替换参数
13431352
Dim ReplaceArguments = McLaunchArgumentsReplace(McVersionCurrent, Loader)
13441353
If String.IsNullOrWhiteSpace(ReplaceArguments("${version_type}")) Then

Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb

Lines changed: 37 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -207,53 +207,46 @@ Public Module ModMinecraft
207207
''' </summary>
208208
Public ReadOnly Property PathIndie As String
209209
Get
210-
Return GetPathIndie(Modable)
210+
InitPathIndie(Modable)
211+
Return If(Setup.Get("VersionArgumentIndieV2", Version:=Me), Path, PathMcFolder)
211212
End Get
212213
End Property
213214
''' <summary>
214-
''' 在不加载版本的情况下获取版本隔离目录
215+
''' 决定该版本是否应该被隔离
215216
''' </summary>
216-
Public Function GetPathIndie(Modable As Boolean) As String
217-
'决定版本隔离类型
218-
If Setup.IsUnset("VersionArgumentIndieV2", Version:=Me) Then
219-
Dim ShouldBeIndie =
220-
Function() As Boolean
221-
'从老的版本独立设置中迁移:-1 未决定,0 使用全局设置,1 手动开启,2 手动关闭
222-
If Not Setup.IsUnset("VersionArgumentIndie", Version:=Me) AndAlso Setup.Get("VersionArgumentIndie", Version:=Me) > 0 Then
223-
Log($"[Minecraft] 版本隔离初始化({Name}):从老的版本独立设置中迁移")
224-
Return Setup.Get("VersionArgumentIndie", Version:=Me) = 1
225-
End If
226-
'若版本文件夹下包含 mods 或 saves 文件夹,则自动开启版本隔离
227-
Dim ModFolder As New DirectoryInfo(Path & "mods\")
228-
Dim SaveFolder As New DirectoryInfo(Path & "saves\")
229-
If (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Any) OrElse (SaveFolder.Exists AndAlso SaveFolder.EnumerateFiles.Any) Then
230-
Log($"[Minecraft] 版本隔离初始化({Name}):版本文件夹下存在 mods 或 saves 文件夹,自动开启")
217+
Public Sub InitPathIndie(Modable As Boolean)
218+
If Not Setup.IsUnset("VersionArgumentIndieV2", Version:=Me) Then Return
219+
Dim ShouldBeIndie =
220+
Function() As Boolean
221+
'从老的版本独立设置中迁移:-1 未决定,0 使用全局设置,1 手动开启,2 手动关闭
222+
If Not Setup.IsUnset("VersionArgumentIndie", Version:=Me) AndAlso Setup.Get("VersionArgumentIndie", Version:=Me) > 0 Then
223+
Log($"[Minecraft] 版本隔离初始化({Name}):从老的版本独立设置中迁移")
224+
Return Setup.Get("VersionArgumentIndie", Version:=Me) = 1
225+
End If
226+
'若版本文件夹下包含 mods 或 saves 文件夹,则自动开启版本隔离
227+
Dim ModFolder As New DirectoryInfo(Path & "mods\")
228+
Dim SaveFolder As New DirectoryInfo(Path & "saves\")
229+
If (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Any) OrElse (SaveFolder.Exists AndAlso SaveFolder.EnumerateFiles.Any) Then
230+
Log($"[Minecraft] 版本隔离初始化({Name}):版本文件夹下存在 mods 或 saves 文件夹,自动开启")
231+
Return True
232+
End If
233+
'根据全局的默认设置决定是否隔离
234+
Log($"[Minecraft] 版本隔离初始化({Name}):从全局默认设置中({Setup.Get("LaunchArgumentIndieV2")})判断")
235+
Select Case Setup.Get("LaunchArgumentIndieV2")
236+
Case 0 '关闭
237+
Return False
238+
Case 1 '仅隔离可安装 Mod 的版本
239+
Return Modable
240+
Case 2 '仅隔离非正式版
241+
Return State = McVersionState.Fool OrElse State = McVersionState.Old OrElse State = McVersionState.Snapshot
242+
Case 3 '隔离非正式版与可安装 Mod 的版本
243+
Return Modable OrElse State = McVersionState.Fool OrElse State = McVersionState.Old OrElse State = McVersionState.Snapshot
244+
Case Else '隔离所有版本
231245
Return True
232-
End If
233-
'根据全局的默认设置决定是否隔离
234-
Log($"[Minecraft] 版本隔离初始化({Name}):从全局默认设置中({Setup.Get("LaunchArgumentIndieV2")})判断")
235-
Select Case Setup.Get("LaunchArgumentIndieV2")
236-
Case 0 '关闭
237-
Return False
238-
Case 1 '仅隔离可安装 Mod 的版本
239-
Return Modable
240-
Case 2 '仅隔离非正式版
241-
Return State = McVersionState.Fool OrElse State = McVersionState.Old OrElse State = McVersionState.Snapshot
242-
Case 3 '隔离非正式版与可安装 Mod 的版本
243-
Return Modable OrElse State = McVersionState.Fool OrElse State = McVersionState.Old OrElse State = McVersionState.Snapshot
244-
Case Else '隔离所有版本
245-
Return True
246-
End Select
247-
End Function
248-
Setup.Set("VersionArgumentIndieV2", ShouldBeIndie(), Version:=Me)
249-
End If
250-
'根据隔离类型决定路径
251-
If Setup.Get("VersionArgumentIndieV2", Version:=Me) Then
252-
Return Path
253-
Else
254-
Return PathMcFolder
255-
End If
256-
End Function
246+
End Select
247+
End Function
248+
Setup.Set("VersionArgumentIndieV2", ShouldBeIndie(), Version:=Me)
249+
End Sub
257250

258251
''' <summary>
259252
''' 该版本的版本文件夹名称。
@@ -1080,6 +1073,8 @@ ExitDataLoad:
10801073
Return "2023 | " & GetLang("LangModMinecraftFoolName23w13ab")
10811074
ElseIf Name = "24w14potato" Then
10821075
Return "2024 | " & GetLang("LangModMinecraftFoolName24w14potato")
1076+
ElseIf Name = "25w14craftmine" Then
1077+
Return "2025 | " & GetLang("LangModMinecraftFoolName25w14craftmine")
10831078
Else
10841079
Return ""
10851080
End If

0 commit comments

Comments
 (0)