ModSetup.vb 37 KB

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