ModSetup.vb 36 KB

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