ModSetup.vb 36 KB

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