ModSetup.vb 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782
  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. {"HintHide", New SetupEntry(False, Source:=SetupSource.Registry)},
  17. {"HintHandInstall", New SetupEntry(False, Source:=SetupSource.Registry)},
  18. {"HintBuy", New SetupEntry(False, Source:=SetupSource.Registry)},
  19. {"HintClearRubbish", New SetupEntry(0, Source:=SetupSource.Registry)},
  20. {"HintUpdateMod", New SetupEntry(False, Source:=SetupSource.Registry)},
  21. {"HintCustomCommand", New SetupEntry(False, Source:=SetupSource.Registry)},
  22. {"HintCustomWarn", New SetupEntry(False, Source:=SetupSource.Registry)},
  23. {"HintMoreAdvancedSetup", New SetupEntry(False, Source:=SetupSource.Registry)},
  24. {"HintIndieSetup", New SetupEntry(False, Source:=SetupSource.Registry)},
  25. {"HintExportConfig", New SetupEntry(False, Source:=SetupSource.Registry)},
  26. {"SystemEula", New SetupEntry(False, Source:=SetupSource.Registry)},
  27. {"SystemCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  28. {"SystemLaunchCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  29. {"SystemLastVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  30. {"SystemHighestSavedBetaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  31. {"SystemHighestBetaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  32. {"SystemHighestAlphaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
  33. {"SystemSetupVersionReg", New SetupEntry(VersionSetup, Source:=SetupSource.Registry)},
  34. {"SystemSetupVersionIni", New SetupEntry(VersionSetup)},
  35. {"SystemHelpVersion", New SetupEntry(0, Source:=SetupSource.Registry)},
  36. {"SystemDebugMode", New SetupEntry(False, Source:=SetupSource.Registry)},
  37. {"SystemDebugAnim", New SetupEntry(9, Source:=SetupSource.Registry)},
  38. {"SystemDebugDelay", New SetupEntry(False, Source:=SetupSource.Registry)},
  39. {"SystemDebugSkipCopy", New SetupEntry(False, Source:=SetupSource.Registry)},
  40. {"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)},
  41. {"SystemSystemUpdate", New SetupEntry(0)},
  42. {"SystemSystemActivity", New SetupEntry(0)},
  43. {"SystemSystemTelemetry", New SetupEntry(True, Source:=SetupSource.Registry)},
  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(2, 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. {"VersionAdvanceDisableModUpdate", New SetupEntry(False, Source:=SetupSource.Version)},
  184. {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Version)},
  185. {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Version)},
  186. {"VersionRamOptimize", New SetupEntry(0, Source:=SetupSource.Version)},
  187. {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Version)},
  188. {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Version)},
  189. {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Version)},
  190. {"VersionArgumentIndieV2", New SetupEntry(False, Source:=SetupSource.Version)},
  191. {"VersionArgumentJavaSelect", New SetupEntry("使用全局设置", Source:=SetupSource.Version)},
  192. {"VersionServerEnter", New SetupEntry("", Source:=SetupSource.Version)},
  193. {"VersionServerLogin", New SetupEntry(0, Source:=SetupSource.Version)},
  194. {"VersionServerNide", New SetupEntry("", Source:=SetupSource.Version)},
  195. {"VersionServerAuthRegister", New SetupEntry("", Source:=SetupSource.Version)},
  196. {"VersionServerAuthName", New SetupEntry("", Source:=SetupSource.Version)},
  197. {"VersionServerAuthServer", New SetupEntry("", Source:=SetupSource.Version)}
  198. }
  199. #Region "基础"
  200. Private Enum SetupSource
  201. Normal
  202. Registry
  203. Version
  204. End Enum
  205. Private Class SetupEntry
  206. Public Encoded As Boolean
  207. Public DefaultValue
  208. Public DefaultValueEncoded
  209. Public Value
  210. Public Source As SetupSource
  211. ''' <summary>
  212. ''' 加载状态:0/未读取 1/已读取未处理 2/已处理
  213. ''' 我也不知道当年写这坨的时候为啥没用 Enum……
  214. ''' </summary>
  215. Public State As Byte = 0
  216. Public Type As Type
  217. Public Sub New(Value, Optional Source = SetupSource.Normal, Optional Encoded = False)
  218. Try
  219. Me.DefaultValue = Value
  220. Me.Encoded = Encoded
  221. Me.Value = Value
  222. Me.Source = Source
  223. Me.Type = If(Value, New Object).GetType
  224. Me.DefaultValueEncoded = If(Encoded, SecretEncrypt(Value, "PCL" & Identify), Value)
  225. Catch ex As Exception
  226. Log(ex, "初始化 SetupEntry 失败", LogLevel.Feedback) '#5095 的 fallback
  227. End Try
  228. End Sub
  229. End Class
  230. ''' <summary>
  231. ''' 改变某个设置项的值。
  232. ''' </summary>
  233. Public Sub [Set](Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
  234. [Set](Key, Value, SetupDict(Key), ForceReload, Version)
  235. End Sub
  236. ''' <summary>
  237. ''' 写入某个未经加密的设置项。
  238. ''' 若该设置项经过了加密,则会抛出异常。
  239. ''' </summary>
  240. Public Sub SetSafe(Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
  241. If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止写入加密设置项:" & Key)
  242. [Set](Key, Version, ForceReload, Version)
  243. End Sub
  244. Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Version As McVersion)
  245. Try
  246. Value = CTypeDynamic(Value, E.Type)
  247. If E.State = 2 Then
  248. '如果已应用,且值相同,则无需再次更改
  249. If E.Value = Value AndAlso Not ForceReload Then Return
  250. Else
  251. '如果未应用,则直接更改并应用
  252. If E.Source <> SetupSource.Version Then E.State = 2
  253. End If
  254. '设置新值
  255. E.Value = Value
  256. '写入值
  257. If E.Encoded Then
  258. Try
  259. If Value Is Nothing Then Value = ""
  260. Value = SecretEncrypt(Value, "PCL" & Identify)
  261. Catch ex As Exception
  262. Log(ex, "加密设置失败:" & Key, LogLevel.Developer)
  263. End Try
  264. End If
  265. Select Case E.Source
  266. Case SetupSource.Normal
  267. WriteIni("Setup", Key, Value)
  268. Case SetupSource.Registry
  269. WriteReg(Key, Value)
  270. Case SetupSource.Version
  271. If Version Is Nothing Then Throw New Exception($"更改版本设置 {Key} 时未提供目标版本")
  272. WriteIni(Version.Path & "PCL\Setup.ini", Key, Value)
  273. End Select
  274. '应用
  275. '例如 VersionServerLogin 要求在设置之后再引发事件
  276. Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key)
  277. If Method IsNot Nothing Then Method.Invoke(Me, {Value})
  278. Catch ex As Exception
  279. Log(ex, "设置设置项时出错(" & Key & ", " & Value & ")", LogLevel.Feedback)
  280. End Try
  281. End Sub
  282. ''' <summary>
  283. ''' 应用某个设置项的值。
  284. ''' </summary>
  285. Public Function Load(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
  286. Return Load(Key, SetupDict(Key), ForceReload, Version)
  287. End Function
  288. Private Function Load(Key As String, E As SetupEntry, ForceReload As Boolean, Version As McVersion)
  289. '如果已经应用过,则什么也不干
  290. If E.State = 2 AndAlso Not ForceReload Then Return E.Value
  291. '读取,应用并设置状态
  292. Read(Key, E, Version)
  293. If E.Source <> SetupSource.Version Then E.State = 2
  294. Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key)
  295. If Method IsNot Nothing Then Method.Invoke(Me, {E.Value})
  296. Return E.Value
  297. End Function
  298. ''' <summary>
  299. ''' 获取某个设置项的值。
  300. ''' </summary>
  301. Public Function [Get](Key As String, Optional Version As McVersion = Nothing)
  302. If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key)
  303. Return [Get](Key, SetupDict(Key), Version)
  304. End Function
  305. ''' <summary>
  306. ''' 获取某个未经加密的设置项的值。
  307. ''' 若该设置项经过了加密,则会抛出异常。
  308. ''' </summary>
  309. Public Function GetSafe(Key As String, Optional Version As McVersion = Nothing)
  310. If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止读取加密设置项:" & Key)
  311. Return [Get](Key, Version)
  312. End Function
  313. Private Function [Get](Key As String, E As SetupEntry, Version As McVersion)
  314. '获取强制值
  315. Dim Force As String = ForceValue(Key)
  316. If Force IsNot Nothing Then
  317. E.Value = CTypeDynamic(Force, E.Type)
  318. E.State = 1
  319. End If
  320. '如果尚未读取过,则读取
  321. If E.State = 0 Then
  322. Read(Key, E, Version)
  323. If E.Source <> SetupSource.Version Then E.State = 1
  324. End If
  325. '返回现在的值
  326. Return E.Value
  327. End Function
  328. ''' <summary>
  329. ''' 初始化某个设置项的值。
  330. ''' </summary>
  331. Public Sub Reset(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
  332. Dim E As SetupEntry = SetupDict(Key)
  333. [Set](Key, E.DefaultValue, E, ForceReload, Version)
  334. Select Case SetupDict(Key).Source
  335. Case SetupSource.Normal
  336. DeleteIniKey("Setup", Key)
  337. Case SetupSource.Registry
  338. DeleteReg(Key)
  339. Case Else 'SetupSource.Version
  340. If Version Is Nothing Then Throw New Exception($"重置版本设置 {Key} 时未提供目标版本")
  341. DeleteIniKey(Version.Path & "PCL\Setup.ini", Key)
  342. End Select
  343. End Sub
  344. ''' <summary>
  345. ''' 获取某个设置项的默认值。
  346. ''' </summary>
  347. Public Function GetDefault(Key As String) As String
  348. Return SetupDict(Key).DefaultValue
  349. End Function
  350. ''' <summary>
  351. ''' 某个设置项是否从未被设置过。
  352. ''' </summary>
  353. Public Function IsUnset(Key As String, Optional Version As McVersion = Nothing) As Boolean
  354. Select Case SetupDict(Key).Source
  355. Case SetupSource.Normal
  356. Return Not HasIniKey("Setup", Key)
  357. Case SetupSource.Registry
  358. Return Not HasReg(Key)
  359. Case Else 'SetupSource.Version
  360. If Version Is Nothing Then Throw New Exception($"判断版本设置 {Key} 是否存在时未提供目标版本")
  361. Return Not HasIniKey(Version.Path & "PCL\Setup.ini", Key)
  362. End Select
  363. End Function
  364. ''' <summary>
  365. ''' 读取设置。
  366. ''' </summary>
  367. Private Sub Read(Key As String, ByRef E As SetupEntry, Version As McVersion)
  368. Try
  369. If Not E.State = 0 Then Return
  370. Dim SourceValue As String = Nothing '先用 String 储存,避免类型转换
  371. Select Case E.Source
  372. Case SetupSource.Normal
  373. SourceValue = ReadIni("Setup", Key, E.DefaultValueEncoded)
  374. Case SetupSource.Registry
  375. SourceValue = ReadReg(Key, E.DefaultValueEncoded)
  376. Case SetupSource.Version
  377. If Version Is Nothing Then
  378. Throw New Exception("读取版本设置 " & Key & " 时未提供目标版本")
  379. Else
  380. SourceValue = ReadIni(Version.Path & "PCL\Setup.ini", Key, E.DefaultValueEncoded)
  381. End If
  382. End Select
  383. If E.Encoded Then
  384. If SourceValue.Equals(E.DefaultValueEncoded) Then
  385. SourceValue = E.DefaultValue
  386. Else
  387. Try
  388. SourceValue = SecretDecrypt(SourceValue, "PCL" & Identify)
  389. Catch ex As Exception
  390. Log(ex, "解密设置失败:" & Key, LogLevel.Developer)
  391. SourceValue = E.DefaultValue
  392. Setup.Set(Key, E.DefaultValue, True)
  393. End Try
  394. End If
  395. End If
  396. E.Value = CTypeDynamic(SourceValue, E.Type)
  397. Catch ex As Exception
  398. Log(ex, "读取设置失败:" & Key, LogLevel.Hint)
  399. E.Value = CTypeDynamic(E.DefaultValue, E.Type)
  400. End Try
  401. End Sub
  402. '对部分设置强制赋值
  403. Private Function ForceValue(Key As String) As String
  404. #If BETA Then
  405. If Key = "UiLauncherTheme" Then Return "0"
  406. #End If
  407. If Key = "UiHiddenPageLink" Then Return True
  408. If Key = "UiHiddenSetupLink" Then Return True
  409. Return Nothing
  410. End Function
  411. #End Region
  412. #Region "Launch"
  413. '切换选择
  414. Public Sub LaunchVersionSelect(Value As String)
  415. Log("[Setup] 当前选择的 Minecraft 版本:" & Value)
  416. WriteIni(PathMcFolder & "PCL.ini", "Version", If(IsNothing(McVersionCurrent), "", McVersionCurrent.Name))
  417. End Sub
  418. Public Sub LaunchFolderSelect(Value As String)
  419. Log("[Setup] 当前选择的 Minecraft 文件夹:" & Value.ToString.Replace("$", Path))
  420. PathMcFolder = Value.ToString.Replace("$", Path)
  421. End Sub
  422. '游戏内存
  423. Public Sub LaunchRamType(Type As Integer)
  424. If FrmSetupLaunch Is Nothing Then Return
  425. FrmSetupLaunch.RamType(Type)
  426. End Sub
  427. '离线皮肤
  428. Public Sub LaunchSkinType(Value As Integer)
  429. RunInUi(Sub()
  430. If Not IsNothing(FrmSetupLaunch) Then
  431. Select Case Value
  432. Case 0, 1, 2 '默认
  433. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
  434. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
  435. Case 3 '正版
  436. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Visible
  437. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
  438. Case 4 '自定义
  439. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
  440. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Visible
  441. End Select
  442. FrmSetupLaunch.CardSkin.TriggerForceResize()
  443. End If
  444. PageLaunchLeft.SkinLegacy.Start()
  445. End Sub)
  446. End Sub
  447. Public Sub LaunchSkinID(Value As String)
  448. PageLaunchLeft.SkinLegacy.Start()
  449. End Sub
  450. #End Region
  451. #Region "Tool"
  452. Public Sub ToolDownloadThread(Value As Integer)
  453. NetTaskThreadLimit = Value + 1
  454. End Sub
  455. Public Sub ToolDownloadCert(Value As Boolean)
  456. ServicePointManager.ServerCertificateValidationCallback =
  457. Function(Sender, Certificate, Chain, Failure)
  458. Dim Request As HttpWebRequest = TryCast(Sender, HttpWebRequest)
  459. If Failure = Net.Security.SslPolicyErrors.None Then Return True '已通过验证
  460. '基于 #3018 和 #5879,只在访问正版登录 API 时跳过证书验证
  461. Log($"[System] 未通过 SSL 证书验证({Failure}),提供的证书为 {Certificate?.Subject},URL:{Request?.Address}", LogLevel.Debug)
  462. If Request Is Nothing Then
  463. Return Not Value
  464. ElseIf Request.Address.Host.Contains("xboxlive") OrElse Request.Address.Host.Contains("minecraftservices") Then
  465. Return Not Value '根据设置决定是否忽略错误
  466. Else
  467. Return False
  468. End If
  469. End Function
  470. End Sub
  471. Public Sub ToolDownloadSpeed(Value As Integer)
  472. If Value <= 14 Then
  473. NetTaskSpeedLimitHigh = (Value + 1) * 0.1 * 1024 * 1024L
  474. ElseIf Value <= 31 Then
  475. NetTaskSpeedLimitHigh = (Value - 11) * 0.5 * 1024 * 1024L
  476. ElseIf Value <= 41 Then
  477. NetTaskSpeedLimitHigh = (Value - 21) * 1024 * 1024L
  478. Else
  479. NetTaskSpeedLimitHigh = -1
  480. End If
  481. End Sub
  482. #End Region
  483. #Region "UI"
  484. '启动器
  485. Public Sub UiLauncherTransparent(Value As Integer)
  486. FrmMain.Opacity = Value / 1000 + 0.4
  487. End Sub
  488. Public Sub UiLauncherTheme(Value As Integer)
  489. ThemeRefresh(Value)
  490. End Sub
  491. Public Sub UiBackgroundColorful(Value As Boolean)
  492. ThemeRefresh()
  493. End Sub
  494. '背景图片
  495. Public Sub UiBackgroundOpacity(Value As Integer)
  496. FrmMain.ImgBack.Opacity = Value / 1000
  497. End Sub
  498. Public Sub UiBackgroundBlur(Value As Integer)
  499. If Value = 0 Then
  500. FrmMain.ImgBack.Effect = Nothing
  501. Else
  502. FrmMain.ImgBack.Effect = New Effects.BlurEffect With {.Radius = Value + 1}
  503. End If
  504. FrmMain.ImgBack.Margin = New Thickness(-(Value + 1) / 1.8)
  505. End Sub
  506. Public Sub UiBackgroundSuit(Value As Integer)
  507. If IsNothing(FrmMain.ImgBack.Background) Then Return
  508. Dim Width As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  509. Dim Height As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  510. If Value = 0 Then
  511. '智能:当图片较小时平铺,较大时适应
  512. If Width < FrmMain.PanMain.ActualWidth / 2 AndAlso Height < FrmMain.PanMain.ActualHeight / 2 Then
  513. Value = 4 '平铺
  514. Else
  515. Value = 2 '适应
  516. End If
  517. End If
  518. CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.None
  519. CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, 1, 1)
  520. CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.RelativeToBoundingBox
  521. Select Case Value
  522. Case 1 '居中
  523. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Center
  524. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Center
  525. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  526. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  527. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  528. Case 2 '适应
  529. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
  530. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
  531. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.UniformToFill
  532. FrmMain.ImgBack.Width = Double.NaN
  533. FrmMain.ImgBack.Height = Double.NaN
  534. Case 3 '拉伸
  535. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
  536. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
  537. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.Fill
  538. FrmMain.ImgBack.Width = Double.NaN
  539. FrmMain.ImgBack.Height = Double.NaN
  540. Case 4 '平铺
  541. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
  542. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
  543. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  544. CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.Tile
  545. CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height)
  546. CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.Absolute
  547. FrmMain.ImgBack.Width = Double.NaN
  548. FrmMain.ImgBack.Height = Double.NaN
  549. Case 5 '左上
  550. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left
  551. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top
  552. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  553. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  554. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  555. Case 6 '右上
  556. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right
  557. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top
  558. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  559. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  560. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  561. Case 7 '左下
  562. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left
  563. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom
  564. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  565. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  566. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  567. Case 8 '右下
  568. FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right
  569. FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom
  570. CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
  571. FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
  572. FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
  573. End Select
  574. End Sub
  575. '主页
  576. Public Sub UiCustomType(Value As Integer)
  577. If FrmSetupUI Is Nothing Then Return
  578. Select Case Value
  579. Case 0 '无
  580. FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
  581. FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
  582. FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
  583. FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed
  584. FrmSetupUI.HintCustomWarn.Visibility = Visibility.Collapsed
  585. Case 1 '本地
  586. FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
  587. FrmSetupUI.PanCustomLocal.Visibility = Visibility.Visible
  588. FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
  589. FrmSetupUI.HintCustom.Visibility = Visibility.Visible
  590. FrmSetupUI.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible)
  591. FrmSetupUI.HintCustom.Text = $"从 PCL 文件夹下的 Custom.xaml 读取主页内容。{vbCrLf}你可以手动编辑该文件,向主页添加文本、图片、常用网站、快捷启动等功能。"
  592. CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.None)
  593. Case 2 '联网
  594. FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
  595. FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
  596. FrmSetupUI.PanCustomNet.Visibility = Visibility.Visible
  597. FrmSetupUI.HintCustom.Visibility = Visibility.Visible
  598. FrmSetupUI.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible)
  599. FrmSetupUI.HintCustom.Text = $"从指定网址联网获取主页内容。服主也可以用于动态更新服务器公告。{vbCrLf}如果你制作了稳定运行的联网主页,可以点击这条提示投稿,若合格即可加入预设!"
  600. CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.打开网页)
  601. CustomEventService.SetEventData(FrmSetupUI.HintCustom, "https://github.com/Meloong-Git/PCL/discussions/2528")
  602. Case 3 '预设
  603. FrmSetupUI.PanCustomPreset.Visibility = Visibility.Visible
  604. FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
  605. FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
  606. FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed
  607. FrmSetupUI.HintCustomWarn.Visibility = Visibility.Collapsed
  608. End Select
  609. FrmSetupUI.CardCustom.TriggerForceResize()
  610. End Sub
  611. '顶部栏
  612. Public Sub UiLogoType(Value As Integer)
  613. Select Case Value
  614. Case 0 '无
  615. FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
  616. FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
  617. FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
  618. If Not IsNothing(FrmSetupUI) Then
  619. FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Visible
  620. FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
  621. FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
  622. End If
  623. Case 1 '默认
  624. FrmMain.ShapeTitleLogo.Visibility = Visibility.Visible
  625. FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
  626. FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
  627. If Not IsNothing(FrmSetupUI) Then
  628. FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
  629. FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
  630. FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
  631. End If
  632. Case 2 '文本
  633. FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
  634. FrmMain.LabTitleLogo.Visibility = Visibility.Visible
  635. FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
  636. If Not IsNothing(FrmSetupUI) Then
  637. FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
  638. FrmSetupUI.PanLogoText.Visibility = Visibility.Visible
  639. FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
  640. End If
  641. Setup.Load("UiLogoText", True)
  642. Case 3 '图片
  643. FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
  644. FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
  645. FrmMain.ImageTitleLogo.Visibility = Visibility.Visible
  646. If Not IsNothing(FrmSetupUI) Then
  647. FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
  648. FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
  649. FrmSetupUI.PanLogoChange.Visibility = Visibility.Visible
  650. End If
  651. Try
  652. FrmMain.ImageTitleLogo.Source = Path & "PCL\Logo.png"
  653. Catch ex As Exception
  654. FrmMain.ImageTitleLogo.Source = Nothing
  655. Log(ex, "显示标题栏图片失败", LogLevel.Msgbox)
  656. End Try
  657. End Select
  658. Setup.Load("UiLogoLeft", True)
  659. If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CardLogo.TriggerForceResize()
  660. End Sub
  661. Public Sub UiLogoText(Value As String)
  662. FrmMain.LabTitleLogo.Text = Value
  663. End Sub
  664. Public Sub UiLogoLeft(Value As Boolean)
  665. FrmMain.PanTitleMain.ColumnDefinitions(0).Width = New GridLength(If(Value AndAlso (Setup.Get("UiLogoType") = 0), 0, 1), GridUnitType.Star)
  666. End Sub
  667. '功能隐藏
  668. Public Sub UiHiddenPageLink(Value As Boolean)
  669. PageSetupUI.HiddenRefresh()
  670. End Sub
  671. Public Sub UiHiddenPageDownload(Value As Boolean)
  672. PageSetupUI.HiddenRefresh()
  673. End Sub
  674. Public Sub UiHiddenPageSetup(Value As Boolean)
  675. PageSetupUI.HiddenRefresh()
  676. End Sub
  677. Public Sub UiHiddenPageOther(Value As Boolean)
  678. PageSetupUI.HiddenRefresh()
  679. End Sub
  680. Public Sub UiHiddenFunctionSelect(Value As Boolean)
  681. PageSetupUI.HiddenRefresh()
  682. End Sub
  683. Public Sub UiHiddenFunctionModUpdate(Value As Boolean)
  684. PageSetupUI.HiddenRefresh()
  685. End Sub
  686. Public Sub UiHiddenFunctionHidden(Value As Boolean)
  687. PageSetupUI.HiddenRefresh()
  688. End Sub
  689. Public Sub UiHiddenSetupLaunch(Value As Boolean)
  690. PageSetupUI.HiddenRefresh()
  691. End Sub
  692. Public Sub UiHiddenSetupUi(Value As Boolean)
  693. PageSetupUI.HiddenRefresh()
  694. End Sub
  695. Public Sub UiHiddenSetupLink(Value As Boolean)
  696. PageSetupUI.HiddenRefresh()
  697. End Sub
  698. Public Sub UiHiddenSetupSystem(Value As Boolean)
  699. PageSetupUI.HiddenRefresh()
  700. End Sub
  701. Public Sub UiHiddenOtherHelp(Value As Boolean)
  702. PageSetupUI.HiddenRefresh()
  703. End Sub
  704. Public Sub UiHiddenOtherFeedback(Value As Boolean)
  705. PageSetupUI.HiddenRefresh()
  706. End Sub
  707. Public Sub UiHiddenOtherVote(Value As Boolean)
  708. PageSetupUI.HiddenRefresh()
  709. End Sub
  710. Public Sub UiHiddenOtherAbout(Value As Boolean)
  711. PageSetupUI.HiddenRefresh()
  712. End Sub
  713. Public Sub UiHiddenOtherTest(Value As Boolean)
  714. PageSetupUI.HiddenRefresh()
  715. End Sub
  716. #End Region
  717. #Region "System"
  718. '调试选项
  719. Public Sub SystemDebugMode(Value As Boolean)
  720. ModeDebug = Value
  721. End Sub
  722. Public Sub SystemDebugAnim(Value As Integer)
  723. AniSpeed = If(Value >= 30, 200, MathClamp(Value * 0.1 + 0.1, 0.1, 3))
  724. End Sub
  725. #End Region
  726. #Region "Version"
  727. '游戏内存
  728. Public Sub VersionRamType(Type As Integer)
  729. If FrmVersionSetup Is Nothing Then Return
  730. FrmVersionSetup.RamType(Type)
  731. End Sub
  732. '服务器
  733. Public Sub VersionServerLogin(Type As Integer)
  734. If FrmVersionSetup Is Nothing Then Return
  735. '为第三方登录清空缓存以更新描述
  736. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "")
  737. If PageVersionLeft.Version Is Nothing Then Return
  738. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  739. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  740. End Sub
  741. #End Region
  742. End Class