ModSetup.vb 41 KB

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