ModSetup.vb 37 KB

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