ModSetup.vb 36 KB

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