1
0

ModSetup.vb 41 KB

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