ModSetup.vb 35 KB

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