ModSetup.vb 35 KB

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