ModSetup.vb 37 KB

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