ModSetup.vb 37 KB

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