ModSetup.vb 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. Public Class ModSetup
  2. ''' <summary>
  3. ''' 设置的更新号。
  4. ''' </summary>
  5. Public Const VersionSetup As Integer = 1
  6. ''' <summary>
  7. ''' 设置列表。
  8. ''' </summary>
  9. Private ReadOnly SetupDict As New Dictionary(Of String, SetupEntry) From {
  10. {"Identify", New SetupEntry("", Source:=SetupSource.Registry)},
  11. {"WindowHeight", New SetupEntry(550)},
  12. {"WindowWidth", New SetupEntry(900)},
  13. {"HintDownloadThread", New SetupEntry(False, Source:=SetupSource.Registry)},
  14. {"HintNotice", New SetupEntry(0, Source:=SetupSource.Registry)},
  15. {"HintDownload", New SetupEntry(0, Source:=SetupSource.Registry)},
  16. {"HintInstallBack", New SetupEntry(False, Source:=SetupSource.Registry)},
  17. {"HintHide", New SetupEntry(False, Source:=SetupSource.Registry)},
  18. {"HintHandInstall", New SetupEntry(False, Source:=SetupSource.Registry)},
  19. {"HintBuy", New SetupEntry(False, Source:=SetupSource.Registry)},
  20. {"HintClearRubbish", New SetupEntry(0, Source:=SetupSource.Registry)},
  21. {"HintUpdateMod", New SetupEntry(False, Source:=SetupSource.Registry)},
  22. {"HintCustomCommand", New SetupEntry(False, Source:=SetupSource.Registry)},
  23. {"HintCustomWarn", New SetupEntry(False, Source:=SetupSource.Registry)},
  24. {"HintMoreAdvancedSetup", New SetupEntry(False, Source:=SetupSource.Registry)},
  25. {"HintIndieSetup", New SetupEntry(False, Source:=SetupSource.Registry)},
  26. {"HintExportConfig", New SetupEntry(False, Source:=SetupSource.Registry)},
  27. {"SystemEula", New SetupEntry(False, Source:=SetupSource.Registry)},
  28. {"SystemCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  29. {"SystemLaunchCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  30. {"SystemLastVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  31. {"SystemHighestSavedBetaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  32. {"SystemHighestBetaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  33. {"SystemHighestAlphaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  34. {"SystemSetupVersionReg", New SetupEntry(VersionSetup, Source:=SetupSource.Registry)},
  35. {"SystemSetupVersionIni", New SetupEntry(VersionSetup)},
  36. {"SystemHelpVersion", New SetupEntry(0, Source:=SetupSource.Registry)},
  37. {"SystemDebugMode", New SetupEntry(False, Source:=SetupSource.Registry)},
  38. {"SystemDebugAnim", New SetupEntry(9, Source:=SetupSource.Registry)},
  39. {"SystemDebugDelay", New SetupEntry(False, Source:=SetupSource.Registry)},
  40. {"SystemDebugSkipCopy", New SetupEntry(False, Source:=SetupSource.Registry)},
  41. {"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)},
  42. {"SystemSystemUpdate", New SetupEntry(0)},
  43. {"SystemSystemActivity", New SetupEntry(0)},
  44. {"CacheExportConfig", New SetupEntry("", Source:=SetupSource.Registry)},
  45. {"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)},
  46. {"CacheSavedPageVersion", New SetupEntry("", Source:=SetupSource.Registry)},
  47. {"CacheMsOAuthRefresh", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  48. {"CacheMsAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  49. {"CacheMsProfileJson", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  50. {"CacheMsUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  51. {"CacheMsName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  52. {"CacheMsV2Migrated", New SetupEntry(False, Source:=SetupSource.Registry)},
  53. {"CacheMsV2OAuthRefresh", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  54. {"CacheMsV2Access", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  55. {"CacheMsV2ProfileJson", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  56. {"CacheMsV2Uuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  57. {"CacheMsV2Name", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  58. {"CacheNideAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  59. {"CacheNideClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  60. {"CacheNideUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  61. {"CacheNideName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  62. {"CacheNideUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  63. {"CacheNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  64. {"CacheNideServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  65. {"CacheAuthAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  66. {"CacheAuthClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  67. {"CacheAuthUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  68. {"CacheAuthName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  69. {"CacheAuthUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  70. {"CacheAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  71. {"CacheAuthServerServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  72. {"CacheAuthServerName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  73. {"CacheAuthServerRegister", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  74. {"CacheDownloadFolder", New SetupEntry("", Source:=SetupSource.Registry)},
  75. {"CacheJavaListVersion", New SetupEntry(0, Source:=SetupSource.Registry)},
  76. {"LoginRemember", New SetupEntry(True, Source:=SetupSource.Registry, Encoded:=True)},
  77. {"LoginLegacyName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  78. {"LoginMsJson", New SetupEntry("{}", Source:=SetupSource.Registry, Encoded:=True)}, '{UserName: OAuthToken, ...}
  79. {"LoginNideEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  80. {"LoginNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  81. {"LoginAuthEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  82. {"LoginAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  83. {"LoginType", New SetupEntry(McLoginType.Legacy, Source:=SetupSource.Registry)},
  84. {"LoginPageType", New SetupEntry(0)},
  85. {"LaunchSkinID", New SetupEntry("", Source:=SetupSource.Registry)},
  86. {"LaunchSkinType", New SetupEntry(0, Source:=SetupSource.Registry)},
  87. {"LaunchSkinSlim", New SetupEntry(False, Source:=SetupSource.Registry)},
  88. {"LaunchVersionSelect", New SetupEntry("")},
  89. {"LaunchFolderSelect", New SetupEntry("")},
  90. {"LaunchFolders", New SetupEntry("", Source:=SetupSource.Registry)},
  91. {"LaunchArgumentTitle", New SetupEntry("")},
  92. {"LaunchArgumentInfo", New SetupEntry("PCL")},
  93. {"LaunchArgumentJavaSelect", New SetupEntry("", Source:=SetupSource.Registry)},
  94. {"LaunchArgumentJavaAll", New SetupEntry("[]", Source:=SetupSource.Registry)},
  95. {"LaunchArgumentIndie", New SetupEntry(0)},
  96. {"LaunchArgumentIndieV2", New SetupEntry(4)},
  97. {"LaunchArgumentVisible", New SetupEntry(5, Source:=SetupSource.Registry)},
  98. {"LaunchArgumentPriority", New SetupEntry(1, Source:=SetupSource.Registry)},
  99. {"LaunchArgumentWindowWidth", New SetupEntry(854)},
  100. {"LaunchArgumentWindowHeight", New SetupEntry(480)},
  101. {"LaunchArgumentWindowType", New SetupEntry(1)},
  102. {"LaunchArgumentRam", New SetupEntry(False, Source:=SetupSource.Registry)},
  103. {"LaunchAdvanceJvm", New SetupEntry("-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Djdk.lang.Process.allowAmbiguousCommands=true -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")},
  104. {"LaunchAdvanceGame", New SetupEntry("")},
  105. {"LaunchAdvanceRun", New SetupEntry("")},
  106. {"LaunchAdvanceRunWait", New SetupEntry(True)},
  107. {"LaunchAdvanceDisableJLW", New SetupEntry(False)},
  108. {"LaunchAdvanceGraphicCard", New SetupEntry(True, Source:=SetupSource.Registry)},
  109. {"LaunchRamType", New SetupEntry(0)},
  110. {"LaunchRamCustom", New SetupEntry(15)},
  111. {"LinkEula", New SetupEntry(False, Source:=SetupSource.Registry)},
  112. {"LinkName", New SetupEntry("", Source:=SetupSource.Registry)},
  113. {"LinkHiperCertLast", New SetupEntry("", Source:=SetupSource.Registry)},
  114. {"LinkHiperCertTime", New SetupEntry("", Source:=SetupSource.Registry)},
  115. {"LinkHiperCertWarn", New SetupEntry(True, Source:=SetupSource.Registry)},
  116. {"LinkIoiVersion", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  117. {"ToolHelpChinese", New SetupEntry(True, Source:=SetupSource.Registry)},
  118. {"ToolDownloadThread", New SetupEntry(63, Source:=SetupSource.Registry)},
  119. {"ToolDownloadSpeed", New SetupEntry(42, Source:=SetupSource.Registry)},
  120. {"ToolDownloadSource", New SetupEntry(1, Source:=SetupSource.Registry)},
  121. {"ToolDownloadVersion", New SetupEntry(1, Source:=SetupSource.Registry)},
  122. {"ToolDownloadTranslate", New SetupEntry(0, Source:=SetupSource.Registry)},
  123. {"ToolDownloadTranslateV2", New SetupEntry(1, Source:=SetupSource.Registry)},
  124. {"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)},
  125. {"ToolDownloadCert", New SetupEntry(False, Source:=SetupSource.Registry)},
  126. {"ToolDownloadMod", New SetupEntry(1, Source:=SetupSource.Registry)},
  127. {"ToolModLocalNameStyle", New SetupEntry(0, Source:=SetupSource.Registry)},
  128. {"ToolUpdateAlpha", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  129. {"ToolUpdateRelease", New SetupEntry(False, Source:=SetupSource.Registry)},
  130. {"ToolUpdateSnapshot", New SetupEntry(False, Source:=SetupSource.Registry)},
  131. {"ToolUpdateReleaseLast", New SetupEntry("", Source:=SetupSource.Registry)},
  132. {"ToolUpdateSnapshotLast", New SetupEntry("", Source:=SetupSource.Registry)},
  133. {"UiLauncherTransparent", New SetupEntry(600)}, '避免与 PCL1 设置冲突(UiLauncherOpacity)
  134. {"UiLauncherHue", New SetupEntry(180)},
  135. {"UiLauncherSat", New SetupEntry(80)},
  136. {"UiLauncherDelta", New SetupEntry(90)},
  137. {"UiLauncherLight", New SetupEntry(20)},
  138. {"UiLauncherTheme", New SetupEntry(0)},
  139. {"UiLauncherThemeGold", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
  140. {"UiLauncherThemeHide", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)},
  141. {"UiLauncherThemeHide2", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)},
  142. {"UiLauncherLogo", New SetupEntry(True)},
  143. {"UiLauncherEmail", New SetupEntry(False)},
  144. {"UiBackgroundColorful", New SetupEntry(True)},
  145. {"UiBackgroundOpacity", New SetupEntry(1000)},
  146. {"UiBackgroundBlur", New SetupEntry(0)},
  147. {"UiBackgroundSuit", New SetupEntry(0)},
  148. {"UiCustomType", New SetupEntry(0)},
  149. {"UiCustomPreset", New SetupEntry(0)},
  150. {"UiCustomNet", New SetupEntry("")},
  151. {"UiLogoType", New SetupEntry(1)},
  152. {"UiLogoText", New SetupEntry("")},
  153. {"UiLogoLeft", New SetupEntry(False)},
  154. {"UiMusicVolume", New SetupEntry(500)},
  155. {"UiMusicStop", New SetupEntry(False)},
  156. {"UiMusicStart", New SetupEntry(False)},
  157. {"UiMusicRandom", New SetupEntry(True)},
  158. {"UiMusicAuto", New SetupEntry(True)},
  159. {"UiHiddenPageDownload", New SetupEntry(False)},
  160. {"UiHiddenPageLink", New SetupEntry(False)},
  161. {"UiHiddenPageSetup", New SetupEntry(False)},
  162. {"UiHiddenPageOther", New SetupEntry(False)},
  163. {"UiHiddenFunctionSelect", New SetupEntry(False)},
  164. {"UiHiddenFunctionModUpdate", New SetupEntry(False)},
  165. {"UiHiddenFunctionHidden", New SetupEntry(False)},
  166. {"UiHiddenSetupLaunch", New SetupEntry(False)},
  167. {"UiHiddenSetupUi", New SetupEntry(False)},
  168. {"UiHiddenSetupLink", New SetupEntry(False)},
  169. {"UiHiddenSetupSystem", New SetupEntry(False)},
  170. {"UiHiddenOtherHelp", New SetupEntry(False)},
  171. {"UiHiddenOtherFeedback", New SetupEntry(False)},
  172. {"UiHiddenOtherVote", New SetupEntry(False)},
  173. {"UiHiddenOtherAbout", New SetupEntry(False)},
  174. {"UiHiddenOtherTest", New SetupEntry(False)},
  175. {"VersionAdvanceJvm", New SetupEntry("", Source:=SetupSource.Version)},
  176. {"VersionAdvanceGame", New SetupEntry("", Source:=SetupSource.Version)},
  177. {"VersionAdvanceAssets", New SetupEntry(0, Source:=SetupSource.Version)},
  178. {"VersionAdvanceAssetsV2", New SetupEntry(False, Source:=SetupSource.Version)},
  179. {"VersionAdvanceJava", New SetupEntry(False, Source:=SetupSource.Version)},
  180. {"VersionAdvanceRun", New SetupEntry("", Source:=SetupSource.Version)},
  181. {"VersionAdvanceRunWait", New SetupEntry(True, Source:=SetupSource.Version)},
  182. {"VersionAdvanceDisableJLW", New SetupEntry(False, Source:=SetupSource.Version)},
  183. {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Version)},
  184. {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Version)},
  185. {"VersionRamOptimize", New SetupEntry(0, Source:=SetupSource.Version)},
  186. {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Version)},
  187. {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Version)},
  188. {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Version)},
  189. {"VersionArgumentIndieV2", New SetupEntry(False, Source:=SetupSource.Version)},
  190. {"VersionArgumentJavaSelect", New SetupEntry("使用全局设置", Source:=SetupSource.Version)},
  191. {"VersionServerEnter", New SetupEntry("", Source:=SetupSource.Version)},
  192. {"VersionServerLogin", New SetupEntry(0, Source:=SetupSource.Version)},
  193. {"VersionServerNide", New SetupEntry("", Source:=SetupSource.Version)},
  194. {"VersionServerAuthRegister", New SetupEntry("", Source:=SetupSource.Version)},
  195. {"VersionServerAuthName", New SetupEntry("", Source:=SetupSource.Version)},
  196. {"VersionServerAuthServer", New SetupEntry("", Source:=SetupSource.Version)}
  197. }
  198. #Region "基础"
  199. Private Enum SetupSource
  200. Normal
  201. Registry
  202. Version
  203. End Enum
  204. Private Class SetupEntry
  205. Public Encoded As Boolean
  206. Public DefaultValue
  207. Public DefaultValueEncoded
  208. Public Value
  209. Public Source As SetupSource
  210. ''' <summary>
  211. ''' 加载状态:0/未读取 1/已读取未处理 2/已处理
  212. ''' 我也不知道当年写这坨的时候为啥没用 Enum……
  213. ''' </summary>
  214. Public State As Byte = 0
  215. Public Type As Type
  216. Public Sub New(Value, Optional Source = SetupSource.Normal, Optional Encoded = False)
  217. Try
  218. Me.DefaultValue = Value
  219. Me.Encoded = Encoded
  220. Me.Value = Value
  221. Me.Source = Source
  222. Me.Type = If(Value, New Object).GetType
  223. Me.DefaultValueEncoded = If(Encoded, SecretEncrypt(Value, "PCL" & UniqueAddress), Value)
  224. Catch ex As Exception
  225. Log(ex, "初始化 SetupEntry 失败", LogLevel.Feedback) '#5095 的 fallback
  226. End Try
  227. End Sub
  228. End Class
  229. ''' <summary>
  230. ''' 改变某个设置项的值。
  231. ''' </summary>
  232. Public Sub [Set](Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
  233. [Set](Key, Value, SetupDict(Key), ForceReload, Version)
  234. End Sub
  235. Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Version As McVersion)
  236. Try
  237. Value = CTypeDynamic(Value, E.Type)
  238. If E.State = 2 Then
  239. '如果已应用,且值相同,则无需再次更改
  240. If E.Value = Value AndAlso Not ForceReload Then Return
  241. Else
  242. '如果未应用,则直接更改并应用
  243. If E.Source <> SetupSource.Version Then E.State = 2
  244. End If
  245. '设置新值
  246. E.Value = Value
  247. '写入值
  248. If E.Encoded Then
  249. Try
  250. If Value Is Nothing Then Value = ""
  251. Value = SecretEncrypt(Value, "PCL" & UniqueAddress)
  252. Catch ex As Exception
  253. Log(ex, "加密设置失败:" & Key, LogLevel.Developer)
  254. End Try
  255. End If
  256. Select Case E.Source
  257. Case SetupSource.Normal
  258. WriteIni("Setup", Key, Value)
  259. Case SetupSource.Registry
  260. WriteReg(Key, Value)
  261. Case SetupSource.Version
  262. If Version Is Nothing Then Throw New Exception($"更改版本设置 {Key} 时未提供目标版本")
  263. WriteIni(Version.Path & "PCL\Setup.ini", Key, Value)
  264. End Select
  265. '应用
  266. '例如 VersionServerLogin 要求在设置之后再引发事件
  267. Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key)
  268. If Method IsNot Nothing Then Method.Invoke(Me, {Value})
  269. Catch ex As Exception
  270. Log(ex, "设置设置项时出错(" & Key & ", " & Value & ")", LogLevel.Feedback)
  271. End Try
  272. End Sub
  273. ''' <summary>
  274. ''' 应用某个设置项的值。
  275. ''' </summary>
  276. Public Function Load(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
  277. Return Load(Key, SetupDict(Key), ForceReload, Version)
  278. End Function
  279. Private Function Load(Key As String, E As SetupEntry, ForceReload As Boolean, Version As McVersion)
  280. '如果已经应用过,则什么也不干
  281. If E.State = 2 AndAlso Not ForceReload Then Return E.Value
  282. '读取,应用并设置状态
  283. Read(Key, E, Version)
  284. If E.Source <> SetupSource.Version Then E.State = 2
  285. Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key)
  286. If Method IsNot Nothing Then Method.Invoke(Me, {E.Value})
  287. Return E.Value
  288. End Function
  289. ''' <summary>
  290. ''' 获取某个设置项的值。
  291. ''' </summary>
  292. Public Function [Get](Key As String, Optional Version As McVersion = Nothing)
  293. If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key) With {.Source = Key}
  294. Return [Get](Key, SetupDict(Key), Version)
  295. End Function
  296. Private Function [Get](Key As String, E As SetupEntry, Version As McVersion)
  297. '获取强制值
  298. Dim Force As String = ForceValue(Key)
  299. If Force IsNot Nothing Then
  300. E.Value = CTypeDynamic(Force, E.Type)
  301. E.State = 1
  302. End If
  303. '如果尚未读取过,则读取
  304. If E.State = 0 Then
  305. Read(Key, E, Version)
  306. If E.Source <> SetupSource.Version Then E.State = 1
  307. End If
  308. '返回现在的值
  309. Return E.Value
  310. End Function
  311. ''' <summary>
  312. ''' 初始化某个设置项的值。
  313. ''' </summary>
  314. Public Sub Reset(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
  315. Dim E As SetupEntry = SetupDict(Key)
  316. [Set](Key, E.DefaultValue, E, ForceReload, Version)
  317. Select Case SetupDict(Key).Source
  318. Case SetupSource.Normal
  319. DeleteIniKey("Setup", Key)
  320. Case SetupSource.Registry
  321. DeleteReg(Key)
  322. Case Else 'SetupSource.Version
  323. If Version Is Nothing Then Throw New Exception($"重置版本设置 {Key} 时未提供目标版本")
  324. DeleteIniKey(Version.Path & "PCL\Setup.ini", Key)
  325. End Select
  326. End Sub
  327. ''' <summary>
  328. ''' 获取某个设置项的默认值。
  329. ''' </summary>
  330. Public Function GetDefault(Key As String) As String
  331. Return SetupDict(Key).DefaultValue
  332. End Function
  333. ''' <summary>
  334. ''' 某个设置项是否从未被设置过。
  335. ''' </summary>
  336. Public Function IsUnset(Key As String, Optional Version As McVersion = Nothing) As Boolean
  337. Select Case SetupDict(Key).Source
  338. Case SetupSource.Normal
  339. Return Not HasIniKey("Setup", Key)
  340. Case SetupSource.Registry
  341. Return Not HasReg(Key)
  342. Case Else 'SetupSource.Version
  343. If Version Is Nothing Then Throw New Exception($"判断版本设置 {Key} 是否存在时未提供目标版本")
  344. Return Not HasIniKey(Version.Path & "PCL\Setup.ini", Key)
  345. End Select
  346. End Function
  347. ''' <summary>
  348. ''' 某个设置项是否加密。
  349. ''' </summary>
  350. Public Function IsEncoded(Key As String) As Boolean
  351. If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key) With {.Source = Key}
  352. Return SetupDict(Key).Encoded
  353. End Function
  354. ''' <summary>
  355. ''' 读取设置。
  356. ''' </summary>
  357. Private Sub Read(Key As String, ByRef E As SetupEntry, Version As McVersion)
  358. Try
  359. If Not E.State = 0 Then Return
  360. Dim SourceValue As String = Nothing '先用 String 储存,避免类型转换
  361. Select Case E.Source
  362. Case SetupSource.Normal
  363. SourceValue = ReadIni("Setup", Key, E.DefaultValueEncoded)
  364. Case SetupSource.Registry
  365. SourceValue = ReadReg(Key, E.DefaultValueEncoded)
  366. Case SetupSource.Version
  367. If Version Is Nothing Then
  368. Throw New Exception("读取版本设置 " & Key & " 时未提供目标版本")
  369. Else
  370. SourceValue = ReadIni(Version.Path & "PCL\Setup.ini", Key, E.DefaultValueEncoded)
  371. End If
  372. End Select
  373. If E.Encoded Then
  374. If SourceValue.Equals(E.DefaultValueEncoded) Then
  375. SourceValue = E.DefaultValue
  376. Else
  377. Try
  378. SourceValue = SecretDecrypt(SourceValue, "PCL" & UniqueAddress)
  379. Catch ex As Exception
  380. Log(ex, "解密设置失败:" & Key, LogLevel.Developer)
  381. SourceValue = E.DefaultValue
  382. Setup.Set(Key, E.DefaultValue, True)
  383. End Try
  384. End If
  385. End If
  386. E.Value = CTypeDynamic(SourceValue, E.Type)
  387. Catch ex As Exception
  388. Log(ex, "读取设置失败:" & Key, LogLevel.Hint)
  389. E.Value = CTypeDynamic(E.DefaultValue, E.Type)
  390. End Try
  391. End Sub
  392. '对部分设置强制赋值
  393. Private Function ForceValue(Key As String) As String
  394. #If BETA Then
  395. If Key = "UiLauncherTheme" Then Return "0"
  396. #End If
  397. If Key = "UiHiddenPageLink" Then Return True
  398. If Key = "UiHiddenSetupLink" Then Return True
  399. Return Nothing
  400. End Function
  401. #End Region
  402. #Region "Launch"
  403. '切换选择
  404. Public Sub LaunchVersionSelect(Value As String)
  405. Log("[Setup] 当前选择的 Minecraft 版本:" & Value)
  406. WriteIni(PathMcFolder & "PCL.ini", "Version", If(IsNothing(McVersionCurrent), "", McVersionCurrent.Name))
  407. End Sub
  408. Public Sub LaunchFolderSelect(Value As String)
  409. Log("[Setup] 当前选择的 Minecraft 文件夹:" & Value.ToString.Replace("$", Path))
  410. PathMcFolder = Value.ToString.Replace("$", Path)
  411. End Sub
  412. '游戏内存
  413. Public Sub LaunchRamType(Type As Integer)
  414. If FrmSetupLaunch Is Nothing Then Return
  415. FrmSetupLaunch.RamType(Type)
  416. End Sub
  417. '离线皮肤
  418. Public Sub LaunchSkinType(Value As Integer)
  419. RunInUi(Sub()
  420. If Not IsNothing(FrmSetupLaunch) Then
  421. Select Case Value
  422. Case 0, 1, 2 '默认
  423. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
  424. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
  425. Case 3 '正版
  426. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Visible
  427. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
  428. Case 4 '自定义
  429. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
  430. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Visible
  431. End Select
  432. FrmSetupLaunch.CardSkin.TriggerForceResize()
  433. End If
  434. PageLaunchLeft.SkinLegacy.Start()
  435. End Sub)
  436. End Sub
  437. Public Sub LaunchSkinID(Value As String)
  438. PageLaunchLeft.SkinLegacy.Start()
  439. End Sub
  440. #End Region
  441. #Region "Tool"
  442. Public Sub ToolDownloadThread(Value As Integer)
  443. NetTaskThreadLimit = Value + 1
  444. End Sub
  445. Public Sub ToolDownloadCert(Value As Boolean)
  446. ServicePointManager.ServerCertificateValidationCallback =
  447. Function(Sender, Certificate, Chain, Failure)
  448. Dim Request As HttpWebRequest = TryCast(Sender, HttpWebRequest)
  449. If Failure = Net.Security.SslPolicyErrors.None Then Return True '已通过验证
  450. '基于 #3018 和 #5879,只在访问正版登录 API 时跳过证书验证
  451. Log($"[System] 未通过 SSL 证书验证({Failure}),提供的证书为 {Certificate?.Subject},URL:{Request?.Address}", LogLevel.Debug)
  452. If Request Is Nothing Then
  453. Return Not Value
  454. ElseIf Request.Address.Host.Contains("xboxlive") OrElse Request.Address.Host.Contains("minecraftservices") Then
  455. Return Not Value '根据设置决定是否忽略错误
  456. Else
  457. Return False
  458. End If
  459. End Function
  460. End Sub
  461. Public Sub ToolDownloadSpeed(Value As Integer)
  462. If Value <= 14 Then
  463. NetTaskSpeedLimitHigh = (Value + 1) * 0.1 * 1024 * 1024L
  464. ElseIf Value <= 31 Then
  465. NetTaskSpeedLimitHigh = (Value - 11) * 0.5 * 1024 * 1024L
  466. ElseIf Value <= 41 Then
  467. NetTaskSpeedLimitHigh = (Value - 21) * 1024 * 1024L
  468. Else
  469. NetTaskSpeedLimitHigh = -1
  470. End If
  471. End Sub
  472. #End Region
  473. #Region "UI"
  474. '启动器
  475. Public Sub UiLauncherTransparent(Value As Integer)
  476. FrmMain.Opacity = Value / 1000 + 0.4
  477. End Sub
  478. Public Sub UiLauncherTheme(Value As Integer)
  479. ThemeRefresh(Value)
  480. End Sub
  481. Public Sub UiBackgroundColorful(Value As Boolean)
  482. ThemeRefresh()
  483. End Sub
  484. '背景图片
  485. Public Sub UiBackgroundOpacity(Value As Integer)
  486. FrmMain.ImgBack.Opacity = Value / 1000
  487. End Sub
  488. Public Sub UiBackgroundBlur(Value As Integer)
  489. If Value = 0 Then
  490. FrmMain.ImgBack.Effect = Nothing
  491. Else
  492. FrmMain.ImgBack.Effect = New Effects.BlurEffect With {.Radius = Value + 1}
  493. End If
  494. FrmMain.ImgBack.Margin = New Thickness(-(Value + 1) / 1.8)
  495. End Sub
  496. Public Sub UiBackgroundSuit(Value As Integer)
  497. If IsNothing(FrmMain.ImgBack.Background) Then Return
  498. Dim Width As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  499. Dim Height As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  500. If Value = 0 Then
  501. '智能:当图片较小时平铺,较大时适应
  502. If Width < FrmMain.PanMain.ActualWidth / 2 AndAlso Height < FrmMain.PanMain.ActualHeight / 2 Then
  503. Value = 4 '平铺
  504. Else
  505. Value = 2 '适应
  506. End If
  507. End If
  508. CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.None
  509. CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, 1, 1)
  510. CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.RelativeToBoundingBox
  511. Select Case Value
  512. Case 1 '居中
  513. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Center
  514. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Center
  515. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  516. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  517. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  518. Case 2 '适应
  519. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
  520. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
  521. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.UniformToFill
  522. FrmMain.ImgBack.Width = Double.NaN
  523. FrmMain.ImgBack.Height = Double.NaN
  524. Case 3 '拉伸
  525. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
  526. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
  527. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.Fill
  528. FrmMain.ImgBack.Width = Double.NaN
  529. FrmMain.ImgBack.Height = Double.NaN
  530. Case 4 '平铺
  531. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
  532. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
  533. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  534. CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.Tile
  535. CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height)
  536. CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.Absolute
  537. FrmMain.ImgBack.Width = Double.NaN
  538. FrmMain.ImgBack.Height = Double.NaN
  539. Case 5 '左上
  540. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left
  541. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top
  542. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  543. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  544. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  545. Case 6 '右上
  546. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right
  547. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top
  548. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  549. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  550. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  551. Case 7 '左下
  552. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left
  553. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom
  554. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  555. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  556. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  557. Case 8 '右下
  558. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right
  559. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom
  560. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  561. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  562. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  563. End Select
  564. End Sub
  565. '主页
  566. Public Sub UiCustomType(Value As Integer)
  567. If FrmSetupUI Is Nothing Then Return
  568. Select Case Value
  569. Case 0 '无
  570. FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
  571. FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
  572. FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
  573. FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed
  574. FrmSetupUI.HintCustomWarn.Visibility = Visibility.Collapsed
  575. Case 1 '本地
  576. FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
  577. FrmSetupUI.PanCustomLocal.Visibility = Visibility.Visible
  578. FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
  579. FrmSetupUI.HintCustom.Visibility = Visibility.Visible
  580. FrmSetupUI.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible)
  581. FrmSetupUI.HintCustom.Text = $"从 PCL 文件夹下的 Custom.xaml 读取主页内容。{vbCrLf}你可以手动编辑该文件,向主页添加文本、图片、常用网站、快捷启动等功能。"
  582. FrmSetupUI.HintCustom.EventType = ""
  583. FrmSetupUI.HintCustom.EventData = ""
  584. Case 2 '联网
  585. FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
  586. FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
  587. FrmSetupUI.PanCustomNet.Visibility = Visibility.Visible
  588. FrmSetupUI.HintCustom.Visibility = Visibility.Visible
  589. FrmSetupUI.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible)
  590. FrmSetupUI.HintCustom.Text = $"从指定网址联网获取主页内容。服主也可以用于动态更新服务器公告。{vbCrLf}如果你制作了稳定运行的联网主页,可以点击这条提示投稿,若合格即可加入预设!"
  591. FrmSetupUI.HintCustom.EventType = "打开网页"
  592. FrmSetupUI.HintCustom.EventData = "https://github.com/Meloong-Git/PCL/discussions/2528"
  593. Case 3 '预设
  594. FrmSetupUI.PanCustomPreset.Visibility = Visibility.Visible
  595. FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
  596. FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
  597. FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed
  598. FrmSetupUI.HintCustomWarn.Visibility = Visibility.Collapsed
  599. End Select
  600. FrmSetupUI.CardCustom.TriggerForceResize()
  601. End Sub
  602. '顶部栏
  603. Public Sub UiLogoType(Value As Integer)
  604. Select Case Value
  605. Case 0 '无
  606. FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
  607. FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
  608. FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
  609. If Not IsNothing(FrmSetupUI) Then
  610. FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Visible
  611. FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
  612. FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
  613. End If
  614. Case 1 '默认
  615. FrmMain.ShapeTitleLogo.Visibility = Visibility.Visible
  616. FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
  617. FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
  618. If Not IsNothing(FrmSetupUI) Then
  619. FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
  620. FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
  621. FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
  622. End If
  623. Case 2 '文本
  624. FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
  625. FrmMain.LabTitleLogo.Visibility = Visibility.Visible
  626. FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
  627. If Not IsNothing(FrmSetupUI) Then
  628. FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
  629. FrmSetupUI.PanLogoText.Visibility = Visibility.Visible
  630. FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
  631. End If
  632. Setup.Load("UiLogoText", True)
  633. Case 3 '图片
  634. FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
  635. FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
  636. FrmMain.ImageTitleLogo.Visibility = Visibility.Visible
  637. If Not IsNothing(FrmSetupUI) Then
  638. FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
  639. FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
  640. FrmSetupUI.PanLogoChange.Visibility = Visibility.Visible
  641. End If
  642. Try
  643. FrmMain.ImageTitleLogo.Source = Path & "PCL\Logo.png"
  644. Catch ex As Exception
  645. FrmMain.ImageTitleLogo.Source = Nothing
  646. Log(ex, "显示标题栏图片失败", LogLevel.Msgbox)
  647. End Try
  648. End Select
  649. Setup.Load("UiLogoLeft", True)
  650. If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CardLogo.TriggerForceResize()
  651. End Sub
  652. Public Sub UiLogoText(Value As String)
  653. FrmMain.LabTitleLogo.Text = Value
  654. End Sub
  655. Public Sub UiLogoLeft(Value As Boolean)
  656. FrmMain.PanTitleMain.ColumnDefinitions(0).Width = New GridLength(If(Value AndAlso (Setup.Get("UiLogoType") = 0), 0, 1), GridUnitType.Star)
  657. End Sub
  658. '功能隐藏
  659. Public Sub UiHiddenPageLink(Value As Boolean)
  660. PageSetupUI.HiddenRefresh()
  661. End Sub
  662. Public Sub UiHiddenPageDownload(Value As Boolean)
  663. PageSetupUI.HiddenRefresh()
  664. End Sub
  665. Public Sub UiHiddenPageSetup(Value As Boolean)
  666. PageSetupUI.HiddenRefresh()
  667. End Sub
  668. Public Sub UiHiddenPageOther(Value As Boolean)
  669. PageSetupUI.HiddenRefresh()
  670. End Sub
  671. Public Sub UiHiddenFunctionSelect(Value As Boolean)
  672. PageSetupUI.HiddenRefresh()
  673. End Sub
  674. Public Sub UiHiddenFunctionModUpdate(Value As Boolean)
  675. PageSetupUI.HiddenRefresh()
  676. End Sub
  677. Public Sub UiHiddenFunctionHidden(Value As Boolean)
  678. PageSetupUI.HiddenRefresh()
  679. End Sub
  680. Public Sub UiHiddenSetupLaunch(Value As Boolean)
  681. PageSetupUI.HiddenRefresh()
  682. End Sub
  683. Public Sub UiHiddenSetupUi(Value As Boolean)
  684. PageSetupUI.HiddenRefresh()
  685. End Sub
  686. Public Sub UiHiddenSetupLink(Value As Boolean)
  687. PageSetupUI.HiddenRefresh()
  688. End Sub
  689. Public Sub UiHiddenSetupSystem(Value As Boolean)
  690. PageSetupUI.HiddenRefresh()
  691. End Sub
  692. Public Sub UiHiddenOtherHelp(Value As Boolean)
  693. PageSetupUI.HiddenRefresh()
  694. End Sub
  695. Public Sub UiHiddenOtherFeedback(Value As Boolean)
  696. PageSetupUI.HiddenRefresh()
  697. End Sub
  698. Public Sub UiHiddenOtherVote(Value As Boolean)
  699. PageSetupUI.HiddenRefresh()
  700. End Sub
  701. Public Sub UiHiddenOtherAbout(Value As Boolean)
  702. PageSetupUI.HiddenRefresh()
  703. End Sub
  704. Public Sub UiHiddenOtherTest(Value As Boolean)
  705. PageSetupUI.HiddenRefresh()
  706. End Sub
  707. #End Region
  708. #Region "System"
  709. '调试选项
  710. Public Sub SystemDebugMode(Value As Boolean)
  711. ModeDebug = Value
  712. End Sub
  713. Public Sub SystemDebugAnim(Value As Integer)
  714. AniSpeed = If(Value >= 30, 200, MathClamp(Value * 0.1 + 0.1, 0.1, 3))
  715. End Sub
  716. #End Region
  717. #Region "Version"
  718. '游戏内存
  719. Public Sub VersionRamType(Type As Integer)
  720. If FrmVersionSetup Is Nothing Then Return
  721. FrmVersionSetup.RamType(Type)
  722. End Sub
  723. '服务器
  724. Public Sub VersionServerLogin(Type As Integer)
  725. If FrmVersionSetup Is Nothing Then Return
  726. '为第三方登录清空缓存以更新描述
  727. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "")
  728. If PageVersionLeft.Version Is Nothing Then Return
  729. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  730. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  731. End Sub
  732. #End Region
  733. End Class