ModSetup.vb 37 KB

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