ModSetup.vb 37 KB

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