Skip to content

Commit a530d8d

Browse files
authored
Merge pull request PCL-Community#100 from PCL-Community/auto-install
支持对已有核心进行自动安装修改操作
2 parents 4a8e59c + df5082e commit a530d8d

12 files changed

+1950
-13
lines changed

Plain Craft Launcher 2/FormMain.xaml.vb

+3
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,8 @@ Public Class FormMain
740740
Private Sub TriggerPageBack()
741741
If PageCurrent = PageType.Download AndAlso PageCurrentSub = PageSubType.DownloadInstall AndAlso FrmDownloadInstall.IsInSelectPage Then
742742
FrmDownloadInstall.ExitSelectPage()
743+
ElseIf PageCurrent = PageType.VersionSetup AndAlso PageCurrentSub = PageSubType.VersionInstall AndAlso FrmVersionInstall.IsInSelectPage Then
744+
FrmVersionInstall.ExitSelectPage()
743745
Else
744746
PageBack()
745747
End If
@@ -1120,6 +1122,7 @@ Public Class FormMain
11201122
VersionModDisabled = 6
11211123
VersionResourcePack = 7
11221124
VersionShader = 8
1125+
VersionInstall = 9
11231126
End Enum
11241127
''' <summary>
11251128
''' 获取次级页面的名称。若并非次级页面则返回空字符串,故可以以此判断是否为次级页面。

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

+7-3
Original file line numberDiff line numberDiff line change
@@ -205,14 +205,16 @@ Public Class ValidateFolderName
205205
Public Property UseMinecraftCharCheck As Boolean = True
206206
Public Property IgnoreCase As Boolean = True
207207
Private ReadOnly PathIgnore As IEnumerable(Of DirectoryInfo)
208+
Private IsIgnoreSameName As Boolean = False
208209
Public Sub New()
209210
End Sub
210-
Public Sub New(Path As String, Optional UseMinecraftCharCheck As Boolean = True, Optional IgnoreCase As Boolean = True)
211+
Public Sub New(Path As String, Optional UseMinecraftCharCheck As Boolean = True, Optional IgnoreCase As Boolean = True, Optional IgnoreSameName As Boolean = False)
211212
Me.Path = Path
212213
Me.IgnoreCase = IgnoreCase
213214
Me.UseMinecraftCharCheck = UseMinecraftCharCheck
214215
On Error Resume Next
215216
PathIgnore = New DirectoryInfo(Path).EnumerateDirectories
217+
IsIgnoreSameName = IgnoreSameName
216218
End Sub
217219
Public Overrides Function Validate(Str As String) As String
218220
Try
@@ -242,8 +244,10 @@ Public Class ValidateFolderName
242244
Arr.Add(Folder.Name)
243245
Next
244246
End If
245-
Dim SameNameCheck = New ValidateExceptSame(Arr, "不可与现有文件夹重名!", IgnoreCase).Validate(Str)
246-
If Not SameNameCheck = "" Then Return SameNameCheck
247+
If Not IsIgnoreSameName Then
248+
Dim SameNameCheck = New ValidateExceptSame(Arr, "不可与现有文件夹重名!", IgnoreCase).Validate(Str)
249+
If Not SameNameCheck = "" Then Return SameNameCheck
250+
End If
247251
Return ""
248252
Catch ex As Exception
249253
Log(ex, "检查文件夹名出错")

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ Recheck:
735735
ElseIf RealJson.Contains("org.quiltmc:quilt-loader") Then
736736
State = McVersionState.Quilt
737737
Version.HasQuilt = True
738-
Version.QuiltVersion = If(RegexSeek(RealJson, "(?<=(org.quiltmc:quilt-loader:))[0-9\.]+(\+build.[0-9]+)?"), "未知版本").Replace("+build", "")
738+
Version.QuiltVersion = If(RegexSeek(RealJson, "(?<=(org.quiltmc:quilt-loader:))[0-9\.]+(\+build.[0-9]+)?((-beta.)[0-9]([0-9]?))"), "未知版本").Replace("+build", "")
739739
ElseIf RealJson.Contains("minecraftforge") AndAlso Not RealJson.Contains("net.neoforge") Then
740740
State = McVersionState.Forge
741741
Version.HasForge = True

Plain Craft Launcher 2/Modules/ModMain.vb

+1
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ EndHint:
448448
Public FrmVersionShader As PageVersionShader
449449
Public FrmVersionResourcePack As PageVersionResourcePack
450450
Public FrmVersionSetup As PageVersionSetup
451+
Public FrmVersionInstall As PageVersionInstall
451452

452453
'资源信息分页声明
453454
Public FrmDownloadCompDetail As PageDownloadCompDetail

Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb

+13-7
Original file line numberDiff line numberDiff line change
@@ -2180,6 +2180,7 @@ Retry:
21802180
Select Case Loader.State
21812181
Case LoadState.Finished
21822182
WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '清空缓存(合并安装会先生成文件夹,这会在刷新时误判为可以使用缓存)
2183+
DeleteDirectory(Loader.Input & "PCLInstallBackups\")
21832184
Hint(Loader.Name & "成功!", HintType.Finish)
21842185
Case LoadState.Failed
21852186
Hint(Loader.Name & "失败:" & GetExceptionSummary(Loader.Error), HintType.Critical)
@@ -2188,7 +2189,12 @@ Retry:
21882189
Case LoadState.Loading
21892190
Exit Sub '不重新加载版本列表
21902191
End Select
2191-
McInstallFailedClearFolder(Loader)
2192+
If Not Loader.State = LoadState.Finished AndAlso Directory.Exists(Loader.Input & "PCLInstallBackups\") Then '版本修改失败回滚
2193+
CopyDirectory(Loader.Input & "PCLInstallBackups\", Loader.Input)
2194+
File.Delete(Loader.Input & ".pclignore")
2195+
Else
2196+
McInstallFailedClearFolder(Loader)
2197+
End If
21922198
LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
21932199
End Sub
21942200
''' <summary>
@@ -2211,7 +2217,7 @@ Retry:
22112217
Thread.Sleep(1000) '防止存在尚未完全释放的文件,导致清理失败(例如整合包安装)
22122218
If Loader.State = LoadState.Failed OrElse Loader.State = LoadState.Aborted Then
22132219
'删除版本文件夹
2214-
If Directory.Exists(Loader.Input & "saves\") OrElse Directory.Exists(Loader.Input & "versions\") Then
2220+
If Directory.Exists(Loader.Input & "saves\") OrElse Directory.Exists(Loader.Input & "versions\") OrElse Directory.Exists(Loader.Input & "mods\") OrElse File.Exists(Loader.Input & "server.dat") Then
22152221
Log("[Download] 由于版本已被独立启动,不清理版本文件夹:" & Loader.Input, LogLevel.Developer)
22162222
Else
22172223
Log("[Download] 由于下载失败或取消,清理版本文件夹:" & Loader.Input, LogLevel.Developer)
@@ -2226,11 +2232,11 @@ Retry:
22262232
''' <summary>
22272233
''' 进行合并安装。返回是否已经开始安装(例如如果没有安装 Java 则会进行提示并返回 False)
22282234
''' </summary>
2229-
Public Function McInstall(Request As McInstallRequest) As Boolean
2235+
Public Function McInstall(Request As McInstallRequest, Optional IsEdit As Boolean = False) As Boolean
22302236
Try
2231-
Dim SubLoaders = McInstallLoader(Request)
2237+
Dim SubLoaders = McInstallLoader(Request, IgnoreDump:=IsEdit)
22322238
If SubLoaders Is Nothing Then Return False
2233-
Dim Loader As New LoaderCombo(Of String)(Request.TargetVersionName & " 安装", SubLoaders) With {.OnStateChanged = AddressOf McInstallState}
2239+
Dim Loader As New LoaderCombo(Of String)(Request.TargetVersionName & If(IsEdit, " 修改", " 安装"), SubLoaders) With {.OnStateChanged = AddressOf McInstallState}
22342240

22352241
'启动
22362242
Loader.Start(Request.TargetVersionFolder)
@@ -2250,7 +2256,7 @@ Retry:
22502256
''' 获取合并安装加载器列表,并进行前期的缓存清理与 Java 检查工作。
22512257
''' </summary>
22522258
''' <exception cref="CancelledException" />
2253-
Public Function McInstallLoader(Request As McInstallRequest, Optional DontFixLibraries As Boolean = False) As List(Of LoaderBase)
2259+
Public Function McInstallLoader(Request As McInstallRequest, Optional DontFixLibraries As Boolean = False, Optional IgnoreDump As Boolean = False) As List(Of LoaderBase)
22542260
'获取缓存目录
22552261
Dim PathInstallTemp As String
22562262
If PathTemp.Contains(" ") AndAlso (Request.OptiFineEntry IsNot Nothing OrElse Request.ForgeEntry IsNot Nothing OrElse Request.NeoForgeEntry IsNot Nothing) Then
@@ -2321,7 +2327,7 @@ Retry:
23212327
Log("[Download] 对应的原版版本:" & Request.MinecraftName)
23222328

23232329
'重复版本检查
2324-
If File.Exists(OutputFolder & Request.TargetVersionName & ".json") Then
2330+
If File.Exists(OutputFolder & Request.TargetVersionName & ".json") AndAlso Not IgnoreDump Then
23252331
Hint("版本 " & Request.TargetVersionName & " 已经存在!", HintType.Critical)
23262332
Throw New CancelledException
23272333
End If

Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1596,7 +1596,7 @@ Public Class PageDownloadInstall
15961596
End Sub
15971597
Private Sub BtnSelectStart_Click() Handles BtnSelectStart.Click
15981598
'确认版本隔离
1599-
If (SelectedForge IsNot Nothing OrElse SelectedNeoForge IsNot Nothing OrElse SelectedFabric IsNot Nothing) AndAlso
1599+
If (SelectedForge IsNot Nothing OrElse SelectedNeoForge IsNot Nothing OrElse SelectedFabric IsNot Nothing OrElse SelectedQuilt IsNot Nothing) AndAlso
16001600
(Setup.Get("LaunchArgumentIndie") = 0 OrElse Setup.Get("LaunchArgumentIndie") = 2) Then
16011601
If MyMsgBox("你尚未开启版本隔离,这会导致多个 MC 共用同一个 Mod 文件夹。" & vbCrLf &
16021602
"因此在切换 MC 版本时,MC 会因为读取到与当前版本不符的 Mod 而崩溃。" & vbCrLf &

Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb

+8
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,10 @@ Finish:
611611
End If
612612
'实际的启动
613613
If BtnLaunch.Text = "启动游戏" Then
614+
If File.Exists(McVersionCurrent.Path + ".pclignore") Then
615+
Hint("当前版本正在安装,无法启动!", HintType.Critical)
616+
Exit Sub
617+
End If
614618
McLaunchStart()
615619
ElseIf BtnLaunch.Text = "下载游戏" Then
616620
FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall)
@@ -698,6 +702,10 @@ ExitRefresh:
698702
If McLaunchLoader.State = LoadState.Loading Then Exit Sub
699703
McVersionCurrent.Load()
700704
PageVersionLeft.Version = McVersionCurrent
705+
If File.Exists(McVersionCurrent.Path + ".pclignore") Then
706+
Hint("当前版本正在安装,暂无法进行版本设置!", HintType.Critical)
707+
Exit Sub
708+
End If
701709
FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
702710
End Sub
703711
''' <summary>

0 commit comments

Comments
 (0)