ModSetup.vb 41 KB

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