2
0

ModSetup.vb 35 KB

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