| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780 |
- Public Class ModSetup
- Private Const VersionSetup As Integer = 1
- ''' <summary>
- ''' 设置列表。
- ''' </summary>
- Private ReadOnly SetupDict As New Dictionary(Of String, SetupEntry) From {
- {"Identify", New SetupEntry("", Source:=SetupSource.Registry)},
- {"WindowHeight", New SetupEntry(550)},
- {"WindowWidth", New SetupEntry(900)},
- {"HintDownloadThread", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"HintNotice", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"HintDownload", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"HintHide", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"HintHandInstall", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"HintBuy", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"HintClearRubbish", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"HintUpdateMod", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"HintCustomCommand", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"HintCustomWarn", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"HintMoreAdvancedSetup", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"HintIndieSetup", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"HintExportConfig", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"SystemEula", New SetupEntry(False, Source:=SetupSource.Registry)}, '仅老版本兼容,现已换用 SystemEulaVersion
- {"SystemEulaVersion", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"SystemCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
- {"SystemLaunchCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
- {"SystemLastVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
- {"SystemHighestSavedBetaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
- {"SystemHighestBetaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
- {"SystemHighestAlphaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
- {"SystemSetupVersionReg", New SetupEntry(VersionSetup, Source:=SetupSource.Registry)},
- {"SystemSetupVersionIni", New SetupEntry(VersionSetup)},
- {"SystemHelpVersion", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"SystemDebugMode", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"SystemDebugAnim", New SetupEntry(9, Source:=SetupSource.Registry)},
- {"SystemDebugDelay", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"SystemDebugSkipCopy", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)},
- {"SystemSystemUpdate", New SetupEntry(0)},
- {"SystemSystemActivity", New SetupEntry(0)},
- {"SystemSystemTelemetry", New SetupEntry(True, Source:=SetupSource.Registry)},
- {"CacheDrops", New SetupEntry("", Source:=SetupSource.Registry)},
- {"CacheConfig", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"CacheExportConfig", New SetupEntry("", Source:=SetupSource.Registry)},
- {"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)},
- {"CacheSavedPageVersion", New SetupEntry("", Source:=SetupSource.Registry)},
- {"CacheMsOAuthRefresh", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheMsAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheMsProfileJson", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheMsUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheMsName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheMsV2Migrated", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"CacheMsV2OAuthRefresh", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheMsV2Access", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheMsV2ProfileJson", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheMsV2Uuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheMsV2Name", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheNideAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheNideClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheNideUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheNideName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheNideUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheNideServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheAuthAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheAuthClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheAuthUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheAuthName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheAuthUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheAuthServerServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheAuthServerName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheAuthServerRegister", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"CacheDownloadFolder", New SetupEntry("", Source:=SetupSource.Registry)},
- {"CacheJavaListVersion", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"LoginRemember", New SetupEntry(True, Source:=SetupSource.Registry, Encoded:=True)},
- {"LoginLegacyName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"LoginMsJson", New SetupEntry("{}", Source:=SetupSource.Registry, Encoded:=True)}, '{UserName: OAuthToken, ...}
- {"LoginNideEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"LoginNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"LoginAuthEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"LoginAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"LoginType", New SetupEntry(McLoginType.Legacy, Source:=SetupSource.Registry)},
- {"LoginPageType", New SetupEntry(0)},
- {"LaunchSkinID", New SetupEntry("", Source:=SetupSource.Registry)},
- {"LaunchSkinType", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"LaunchSkinSlim", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"LaunchVersionSelect", New SetupEntry("")},
- {"LaunchFolderSelect", New SetupEntry("")},
- {"LaunchFolders", New SetupEntry("", Source:=SetupSource.Registry)},
- {"LaunchArgumentTitle", New SetupEntry("")},
- {"LaunchArgumentInfo", New SetupEntry("PCL")},
- {"LaunchArgumentJavaSelect", New SetupEntry("", Source:=SetupSource.Registry)},
- {"LaunchArgumentJavaAll", New SetupEntry("[]", Source:=SetupSource.Registry)},
- {"LaunchArgumentIndie", New SetupEntry(0)},
- {"LaunchArgumentIndieV2", New SetupEntry(4)},
- {"LaunchArgumentVisible", New SetupEntry(5, Source:=SetupSource.Registry)},
- {"LaunchArgumentPriority", New SetupEntry(1, Source:=SetupSource.Registry)},
- {"LaunchArgumentWindowWidth", New SetupEntry(854)},
- {"LaunchArgumentWindowHeight", New SetupEntry(480)},
- {"LaunchArgumentWindowType", New SetupEntry(1)},
- {"LaunchArgumentRam", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"LaunchAdvanceJvm", New SetupEntry("-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Djdk.lang.Process.allowAmbiguousCommands=true -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")},
- {"LaunchAdvanceGame", New SetupEntry("")},
- {"LaunchAdvanceRun", New SetupEntry("")},
- {"LaunchAdvanceRunWait", New SetupEntry(True)},
- {"LaunchAdvanceDisableJLW", New SetupEntry(False)},
- {"LaunchAdvanceGraphicCard", New SetupEntry(True, Source:=SetupSource.Registry)},
- {"LaunchRamType", New SetupEntry(0)},
- {"LaunchRamCustom", New SetupEntry(15)},
- {"LinkLastAutoJoinInviteCode", New SetupEntry("", Source:=SetupSource.Registry)},
- {"LinkLatencyMode", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"LinkCustomPeer", New SetupEntry("")},
- {"LinkEasyTierVersion", New SetupEntry(-1, Source:=SetupSource.Registry)},
- {"ToolHelpChinese", New SetupEntry(True, Source:=SetupSource.Registry)},
- {"ToolDownloadThread", New SetupEntry(63, Source:=SetupSource.Registry)},
- {"ToolDownloadSpeed", New SetupEntry(42, Source:=SetupSource.Registry)},
- {"ToolDownloadSource", New SetupEntry(1, Source:=SetupSource.Registry)},
- {"ToolDownloadVersion", New SetupEntry(1, Source:=SetupSource.Registry)},
- {"ToolDownloadTranslate", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"ToolDownloadTranslateV2", New SetupEntry(1, Source:=SetupSource.Registry)},
- {"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)},
- {"ToolDownloadCert", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"ToolDownloadMod", New SetupEntry(2, Source:=SetupSource.Registry)},
- {"ToolModLocalNameStyle", New SetupEntry(0, Source:=SetupSource.Registry)},
- {"ToolUpdateAlpha", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
- {"ToolUpdateRelease", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"ToolUpdateSnapshot", New SetupEntry(False, Source:=SetupSource.Registry)},
- {"ToolUpdateReleaseLast", New SetupEntry("", Source:=SetupSource.Registry)},
- {"ToolUpdateSnapshotLast", New SetupEntry("", Source:=SetupSource.Registry)},
- {"UiLauncherTransparent", New SetupEntry(600)}, '避免与 PCL1 设置冲突(UiLauncherOpacity)
- {"UiLauncherHue", New SetupEntry(180)},
- {"UiLauncherSat", New SetupEntry(80)},
- {"UiLauncherDelta", New SetupEntry(90)},
- {"UiLauncherLight", New SetupEntry(20)},
- {"UiLauncherTheme", New SetupEntry(0)},
- {"UiLauncherThemeGold", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)},
- {"UiLauncherThemeHide", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)},
- {"UiLauncherThemeHide2", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)},
- {"UiLauncherLogo", New SetupEntry(True)},
- {"UiLauncherEmail", New SetupEntry(False)},
- {"UiBackgroundColorful", New SetupEntry(True)},
- {"UiBackgroundOpacity", New SetupEntry(1000)},
- {"UiBackgroundBlur", New SetupEntry(0)},
- {"UiBackgroundSuit", New SetupEntry(0)},
- {"UiCustomType", New SetupEntry(0)},
- {"UiCustomPreset", New SetupEntry(0)},
- {"UiCustomNet", New SetupEntry("")},
- {"UiLogoType", New SetupEntry(1)},
- {"UiLogoText", New SetupEntry("")},
- {"UiLogoLeft", New SetupEntry(False)},
- {"UiMusicVolume", New SetupEntry(500)},
- {"UiMusicStop", New SetupEntry(False)},
- {"UiMusicStart", New SetupEntry(False)},
- {"UiMusicRandom", New SetupEntry(True)},
- {"UiMusicAuto", New SetupEntry(True)},
- {"UiHiddenPageDownload", New SetupEntry(False)},
- {"UiHiddenPageLink", New SetupEntry(False)},
- {"UiHiddenPageSetup", New SetupEntry(False)},
- {"UiHiddenPageOther", New SetupEntry(False)},
- {"UiHiddenFunctionSelect", New SetupEntry(False)},
- {"UiHiddenFunctionModUpdate", New SetupEntry(False)},
- {"UiHiddenFunctionHidden", New SetupEntry(False)},
- {"UiHiddenSetupLaunch", New SetupEntry(False)},
- {"UiHiddenSetupUi", New SetupEntry(False)},
- {"UiHiddenSetupLink", New SetupEntry(False)},
- {"UiHiddenSetupSystem", New SetupEntry(False)},
- {"UiHiddenOtherHelp", New SetupEntry(False)},
- {"UiHiddenOtherFeedback", New SetupEntry(False)},
- {"UiHiddenOtherVote", New SetupEntry(False)},
- {"UiHiddenOtherAbout", New SetupEntry(False)},
- {"UiHiddenOtherTest", New SetupEntry(False)},
- {"VersionAdvanceJvm", New SetupEntry("", Source:=SetupSource.Instance)},
- {"VersionAdvanceGame", New SetupEntry("", Source:=SetupSource.Instance)},
- {"VersionAdvanceAssets", New SetupEntry(0, Source:=SetupSource.Instance)},
- {"VersionAdvanceAssetsV2", New SetupEntry(False, Source:=SetupSource.Instance)},
- {"VersionAdvanceJava", New SetupEntry(False, Source:=SetupSource.Instance)},
- {"VersionAdvanceRun", New SetupEntry("", Source:=SetupSource.Instance)},
- {"VersionAdvanceRunWait", New SetupEntry(True, Source:=SetupSource.Instance)},
- {"VersionAdvanceDisableJLW", New SetupEntry(False, Source:=SetupSource.Instance)},
- {"VersionAdvanceDisableModUpdate", New SetupEntry(False, Source:=SetupSource.Instance)},
- {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Instance)},
- {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Instance)},
- {"VersionRamOptimize", New SetupEntry(0, Source:=SetupSource.Instance)},
- {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Instance)},
- {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Instance)},
- {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Instance)},
- {"VersionArgumentIndieV2", New SetupEntry(False, Source:=SetupSource.Instance)},
- {"VersionArgumentJavaSelect", New SetupEntry("使用全局设置", Source:=SetupSource.Instance)},
- {"VersionServerEnter", New SetupEntry("", Source:=SetupSource.Instance)},
- {"VersionServerLogin", New SetupEntry(0, Source:=SetupSource.Instance)},
- {"VersionServerNide", New SetupEntry("", Source:=SetupSource.Instance)},
- {"VersionServerAuthRegister", New SetupEntry("", Source:=SetupSource.Instance)},
- {"VersionServerAuthName", New SetupEntry("", Source:=SetupSource.Instance)},
- {"VersionServerAuthServer", New SetupEntry("", Source:=SetupSource.Instance)}
- }
- #Region "基础"
- Private Enum SetupSource
- Normal
- Registry
- Instance
- End Enum
- Private Class SetupEntry
- Public Encoded As Boolean
- Public DefaultValue
- Public DefaultValueEncoded
- Public Value
- Public Source As SetupSource
- ''' <summary>
- ''' 加载状态:0/未读取 1/已读取未处理 2/已处理
- ''' 我也不知道当年写这坨的时候为啥没用 Enum……
- ''' </summary>
- Public State As Byte = 0
- Public Type As Type
- Public Sub New(Value, Optional Source = SetupSource.Normal, Optional Encoded = False)
- Try
- Me.DefaultValue = Value
- Me.Encoded = Encoded
- Me.Value = Value
- Me.Source = Source
- Me.Type = If(Value, New Object).GetType
- Me.DefaultValueEncoded = If(Encoded, SecretEncrypt(Value, "PCL" & Identify), Value)
- Catch ex As Exception
- Log(ex, "初始化 SetupEntry 失败", LogLevel.Feedback) '#5095 的 fallback
- End Try
- End Sub
- End Class
- ''' <summary>
- ''' 改变某个设置项的值。
- ''' </summary>
- Public Sub [Set](Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing)
- [Set](Key, Value, SetupDict(Key), ForceReload, Instance)
- End Sub
- ''' <summary>
- ''' 写入某个未经加密的设置项。
- ''' 若该设置项经过了加密,则会抛出异常。
- ''' </summary>
- Public Sub SetSafe(Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing)
- If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止写入加密设置项:" & Key)
- [Set](Key, Instance, ForceReload, Instance)
- End Sub
- Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Instance As McInstance)
- Try
- Value = CTypeDynamic(Value, E.Type)
- If E.State = 2 Then
- '如果已应用,且值相同,则无需再次更改
- If E.Value = Value AndAlso Not ForceReload Then Return
- Else
- '如果未应用,则直接更改并应用
- If E.Source <> SetupSource.Instance Then E.State = 2
- End If
- '设置新值
- E.Value = Value
- '写入值
- If E.Encoded Then
- Try
- If Value Is Nothing Then Value = ""
- Value = SecretEncrypt(Value, "PCL" & Identify)
- Catch ex As Exception
- Log(ex, "加密设置失败:" & Key, LogLevel.Developer)
- End Try
- End If
- Select Case E.Source
- Case SetupSource.Normal
- WriteIni("Setup", Key, Value)
- Case SetupSource.Registry
- WriteReg(Key, Value)
- Case SetupSource.Instance
- If Instance Is Nothing Then Throw New Exception($"更改版本设置 {Key} 时未提供目标版本")
- WriteIni(Instance.PathVersion & "PCL\Setup.ini", Key, Value)
- End Select
- '应用
- '例如 VersionServerLogin 要求在设置之后再引发事件
- Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key)
- If Method IsNot Nothing Then Method.Invoke(Me, {Value})
- Catch ex As Exception
- Log(ex, "设置设置项时出错(" & Key & ", " & Value & ")", LogLevel.Feedback)
- End Try
- End Sub
- ''' <summary>
- ''' 应用某个设置项的值。
- ''' </summary>
- Public Function Load(Key As String, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing)
- Return Load(Key, SetupDict(Key), ForceReload, Instance)
- End Function
- Private Function Load(Key As String, E As SetupEntry, ForceReload As Boolean, Instance As McInstance)
- '如果已经应用过,则什么也不干
- If E.State = 2 AndAlso Not ForceReload Then Return E.Value
- '读取,应用并设置状态
- Read(Key, E, Instance)
- If E.Source <> SetupSource.Instance Then E.State = 2
- Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key)
- If Method IsNot Nothing Then Method.Invoke(Me, {E.Value})
- Return E.Value
- End Function
- ''' <summary>
- ''' 获取某个设置项的值。
- ''' </summary>
- Public Function [Get](Key As String, Optional Instance As McInstance = Nothing)
- If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key)
- Return [Get](Key, SetupDict(Key), Instance)
- End Function
- ''' <summary>
- ''' 获取某个未经加密的设置项的值。
- ''' 若该设置项经过了加密,则会抛出异常。
- ''' </summary>
- Public Function GetSafe(Key As String, Optional Instance As McInstance = Nothing)
- If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止读取加密设置项:" & Key)
- Return [Get](Key, Instance)
- End Function
- Private Function [Get](Key As String, E As SetupEntry, Instance As McInstance)
- '获取强制值
- Dim Force As String = ForceValue(Key)
- If Force IsNot Nothing Then
- E.Value = CTypeDynamic(Force, E.Type)
- E.State = 1
- End If
- '如果尚未读取过,则读取
- If E.State = 0 Then
- Read(Key, E, Instance)
- If E.Source <> SetupSource.Instance Then E.State = 1
- End If
- '返回现在的值
- Return E.Value
- End Function
- ''' <summary>
- ''' 初始化某个设置项的值。
- ''' </summary>
- Public Sub Reset(Key As String, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing)
- Dim E As SetupEntry = SetupDict(Key)
- [Set](Key, E.DefaultValue, E, ForceReload, Instance)
- Select Case SetupDict(Key).Source
- Case SetupSource.Normal
- DeleteIniKey("Setup", Key)
- Case SetupSource.Registry
- DeleteReg(Key)
- Case Else 'SetupSource.Instance
- If Instance Is Nothing Then Throw New Exception($"重置版本设置 {Key} 时未提供目标版本")
- DeleteIniKey(Instance.PathVersion & "PCL\Setup.ini", Key)
- End Select
- End Sub
- ''' <summary>
- ''' 获取某个设置项的默认值。
- ''' </summary>
- Public Function GetDefault(Key As String) As String
- Return SetupDict(Key).DefaultValue
- End Function
- ''' <summary>
- ''' 某个设置项是否从未被设置过。
- ''' </summary>
- Public Function IsUnset(Key As String, Optional Instance As McInstance = Nothing) As Boolean
- Select Case SetupDict(Key).Source
- Case SetupSource.Normal
- Return Not HasIniKey("Setup", Key)
- Case SetupSource.Registry
- Return Not HasReg(Key)
- Case Else 'SetupSource.Instance
- If Instance Is Nothing Then Throw New Exception($"判断版本设置 {Key} 是否存在时未提供目标版本")
- Return Not HasIniKey(Instance.PathVersion & "PCL\Setup.ini", Key)
- End Select
- End Function
- ''' <summary>
- ''' 读取设置。
- ''' </summary>
- Private Sub Read(Key As String, ByRef E As SetupEntry, Instance As McInstance)
- Try
- If Not E.State = 0 Then Return
- Dim SourceValue As String = Nothing '先用 String 储存,避免类型转换
- Select Case E.Source
- Case SetupSource.Normal
- SourceValue = ReadIni("Setup", Key, E.DefaultValueEncoded)
- Case SetupSource.Registry
- SourceValue = ReadReg(Key, E.DefaultValueEncoded)
- Case SetupSource.Instance
- If Instance Is Nothing Then
- Throw New Exception("读取版本设置 " & Key & " 时未提供目标版本")
- Else
- SourceValue = ReadIni(Instance.PathVersion & "PCL\Setup.ini", Key, E.DefaultValueEncoded)
- End If
- End Select
- If E.Encoded Then
- If SourceValue.Equals(E.DefaultValueEncoded) Then
- SourceValue = E.DefaultValue
- Else
- Try
- SourceValue = SecretDecrypt(SourceValue, "PCL" & Identify)
- Catch ex As Exception
- Log(ex, "解密设置失败:" & Key, LogLevel.Developer)
- SourceValue = E.DefaultValue
- Setup.Set(Key, E.DefaultValue, True)
- End Try
- End If
- End If
- E.Value = CTypeDynamic(SourceValue, E.Type)
- Catch ex As Exception
- Log(ex, "读取设置失败:" & Key, LogLevel.Hint)
- E.Value = CTypeDynamic(E.DefaultValue, E.Type)
- End Try
- End Sub
- '对部分设置强制赋值
- Private Function ForceValue(Key As String) As String
- #If BETA Then
- If Key = "UiLauncherTheme" Then Return "0"
- #End If
- If Key = "UiHiddenPageLink" Then Return True
- If Key = "UiHiddenSetupLink" Then Return True
- Return Nothing
- End Function
- #End Region
- #Region "Launch"
- '切换选择
- Public Sub LaunchVersionSelect(Value As String)
- Log("[Setup] 当前选择的 Minecraft 版本:" & Value)
- WriteIni(McFolderSelected & "PCL.ini", "Version", If(IsNothing(McInstanceSelected), "", McInstanceSelected.Name))
- End Sub
- Public Sub LaunchFolderSelect(Value As String)
- Log("[Setup] 当前选择的 Minecraft 文件夹:" & Value.ToString.Replace("$", Path))
- McFolderSelected = Value.ToString.Replace("$", Path)
- End Sub
- '游戏内存
- Public Sub LaunchRamType(Type As Integer)
- If FrmSetupLaunch Is Nothing Then Return
- FrmSetupLaunch.RamType(Type)
- End Sub
- '离线皮肤
- Public Sub LaunchSkinType(Value As Integer)
- RunInUi(Sub()
- If Not IsNothing(FrmSetupLaunch) Then
- Select Case Value
- Case 0, 1, 2 '默认
- FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
- FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
- Case 3 '正版
- FrmSetupLaunch.PanSkinID.Visibility = Visibility.Visible
- FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
- Case 4 '自定义
- FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
- FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Visible
- End Select
- FrmSetupLaunch.CardSkin.TriggerForceResize()
- End If
- PageLaunchLeft.SkinLegacy.Start()
- End Sub)
- End Sub
- Public Sub LaunchSkinID(Value As String)
- PageLaunchLeft.SkinLegacy.Start()
- End Sub
- #End Region
- #Region "Tool"
- Public Sub ToolDownloadThread(Value As Integer)
- NetTaskThreadLimit = Value + 1
- End Sub
- Public Sub ToolDownloadCert(Value As Boolean)
- ServicePointManager.ServerCertificateValidationCallback =
- Function(Sender, Certificate, Chain, Failure)
- Dim Request As HttpWebRequest = TryCast(Sender, HttpWebRequest)
- If Failure = Net.Security.SslPolicyErrors.None Then Return True '已通过验证
- '基于 #3018 和 #5879,只在访问正版登录 API 时跳过证书验证
- Log($"[System] 未通过 SSL 证书验证({Failure}),提供的证书为 {Certificate?.Subject},URL:{Request?.Address}", LogLevel.Debug)
- If Request Is Nothing Then
- Return Not Value
- ElseIf Request.Address.Host.Contains("xboxlive") OrElse Request.Address.Host.Contains("minecraftservices") Then
- Return Not Value '根据设置决定是否忽略错误
- Else
- Return False
- End If
- End Function
- End Sub
- Public Sub ToolDownloadSpeed(Value As Integer)
- If Value <= 14 Then
- NetTaskSpeedLimitHigh = (Value + 1) * 0.1 * 1024 * 1024L
- ElseIf Value <= 31 Then
- NetTaskSpeedLimitHigh = (Value - 11) * 0.5 * 1024 * 1024L
- ElseIf Value <= 41 Then
- NetTaskSpeedLimitHigh = (Value - 21) * 1024 * 1024L
- Else
- NetTaskSpeedLimitHigh = -1
- End If
- End Sub
- #End Region
- #Region "UI"
- '启动器
- Public Sub UiLauncherTransparent(Value As Integer)
- FrmMain.Opacity = Value / 1000 + 0.4
- End Sub
- Public Sub UiLauncherTheme(Value As Integer)
- ThemeRefresh(Value)
- End Sub
- Public Sub UiBackgroundColorful(Value As Boolean)
- ThemeRefresh()
- End Sub
- '背景图片
- Public Sub UiBackgroundOpacity(Value As Integer)
- FrmMain.ImgBack.Opacity = Value / 1000
- End Sub
- Public Sub UiBackgroundBlur(Value As Integer)
- If Value = 0 Then
- FrmMain.ImgBack.Effect = Nothing
- Else
- FrmMain.ImgBack.Effect = New Effects.BlurEffect With {.Radius = Value + 1}
- End If
- FrmMain.ImgBack.Margin = New Thickness(-(Value + 1) / 1.8)
- End Sub
- Public Sub UiBackgroundSuit(Value As Integer)
- If IsNothing(FrmMain.ImgBack.Background) Then Return
- Dim Width As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
- Dim Height As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
- If Value = 0 Then
- '智能:当图片较小时平铺,较大时适应
- If Width < FrmMain.PanMain.ActualWidth / 2 AndAlso Height < FrmMain.PanMain.ActualHeight / 2 Then
- Value = 4 '平铺
- Else
- Value = 2 '适应
- End If
- End If
- CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.None
- CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, 1, 1)
- CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.RelativeToBoundingBox
- Select Case Value
- Case 1 '居中
- FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Center
- FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Center
- CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
- FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
- FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
- Case 2 '适应
- FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
- FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
- CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.UniformToFill
- FrmMain.ImgBack.Width = Double.NaN
- FrmMain.ImgBack.Height = Double.NaN
- Case 3 '拉伸
- FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
- FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
- CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.Fill
- FrmMain.ImgBack.Width = Double.NaN
- FrmMain.ImgBack.Height = Double.NaN
- Case 4 '平铺
- FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch
- FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch
- CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
- CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.Tile
- CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height)
- CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.Absolute
- FrmMain.ImgBack.Width = Double.NaN
- FrmMain.ImgBack.Height = Double.NaN
- Case 5 '左上
- FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left
- FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top
- CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
- FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
- FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
- Case 6 '右上
- FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right
- FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top
- CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
- FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
- FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
- Case 7 '左下
- FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left
- FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom
- CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
- FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
- FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
- Case 8 '右下
- FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right
- FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom
- CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None
- FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width
- FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height
- End Select
- End Sub
- '主页
- Public Sub UiCustomType(Value As Integer)
- If FrmSetupUI Is Nothing Then Return
- Select Case Value
- Case 0 '无
- FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
- FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
- FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
- FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed
- FrmSetupUI.HintCustomWarn.Visibility = Visibility.Collapsed
- Case 1 '本地
- FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
- FrmSetupUI.PanCustomLocal.Visibility = Visibility.Visible
- FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
- FrmSetupUI.HintCustom.Visibility = Visibility.Visible
- FrmSetupUI.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible)
- FrmSetupUI.HintCustom.Text = $"从 PCL 文件夹下的 Custom.xaml 读取主页内容。{vbCrLf}你可以手动编辑该文件,向主页添加文本、图片、常用网站、快捷启动等功能。"
- CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.None)
- Case 2 '联网
- FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
- FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
- FrmSetupUI.PanCustomNet.Visibility = Visibility.Visible
- FrmSetupUI.HintCustom.Visibility = Visibility.Visible
- FrmSetupUI.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible)
- FrmSetupUI.HintCustom.Text = $"从指定网址联网获取主页内容。服主也可以用于动态更新服务器公告。{vbCrLf}如果你制作了稳定运行的联网主页,可以点击这条提示投稿,若合格即可加入预设!"
- CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.打开网页)
- CustomEventService.SetEventData(FrmSetupUI.HintCustom, "https://github.com/Meloong-Git/PCL/discussions/2528")
- Case 3 '预设
- FrmSetupUI.PanCustomPreset.Visibility = Visibility.Visible
- FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
- FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed
- FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed
- FrmSetupUI.HintCustomWarn.Visibility = Visibility.Collapsed
- End Select
- FrmSetupUI.CardCustom.TriggerForceResize()
- End Sub
- '顶部栏
- Public Sub UiLogoType(Value As Integer)
- Select Case Value
- Case 0 '无
- FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
- FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
- FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
- If Not IsNothing(FrmSetupUI) Then
- FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Visible
- FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
- FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
- End If
- Case 1 '默认
- FrmMain.ShapeTitleLogo.Visibility = Visibility.Visible
- FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
- FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
- If Not IsNothing(FrmSetupUI) Then
- FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
- FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
- FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
- End If
- Case 2 '文本
- FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
- FrmMain.LabTitleLogo.Visibility = Visibility.Visible
- FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed
- If Not IsNothing(FrmSetupUI) Then
- FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
- FrmSetupUI.PanLogoText.Visibility = Visibility.Visible
- FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed
- End If
- Setup.Load("UiLogoText", True)
- Case 3 '图片
- FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed
- FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed
- FrmMain.ImageTitleLogo.Visibility = Visibility.Visible
- If Not IsNothing(FrmSetupUI) Then
- FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed
- FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed
- FrmSetupUI.PanLogoChange.Visibility = Visibility.Visible
- End If
- Try
- FrmMain.ImageTitleLogo.Source = Path & "PCL\Logo.png"
- Catch ex As Exception
- FrmMain.ImageTitleLogo.Source = Nothing
- Log(ex, "显示标题栏图片失败", LogLevel.Msgbox)
- End Try
- End Select
- Setup.Load("UiLogoLeft", True)
- If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CardLogo.TriggerForceResize()
- End Sub
- Public Sub UiLogoText(Value As String)
- FrmMain.LabTitleLogo.Text = Value
- End Sub
- Public Sub UiLogoLeft(Value As Boolean)
- FrmMain.PanTitleMain.ColumnDefinitions(0).Width = New GridLength(If(Value AndAlso (Setup.Get("UiLogoType") = 0), 0, 1), GridUnitType.Star)
- End Sub
- '功能隐藏
- Public Sub UiHiddenPageLink(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenPageDownload(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenPageSetup(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenPageOther(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenFunctionSelect(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenFunctionModUpdate(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenFunctionHidden(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenSetupLaunch(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenSetupUi(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenSetupLink(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenSetupSystem(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenOtherHelp(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenOtherFeedback(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenOtherVote(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenOtherAbout(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- Public Sub UiHiddenOtherTest(Value As Boolean)
- PageSetupUI.HiddenRefresh()
- End Sub
- #End Region
- #Region "System"
- '调试选项
- Public Sub SystemDebugMode(Value As Boolean)
- ModeDebug = Value
- End Sub
- Public Sub SystemDebugAnim(Value As Integer)
- AniSpeed = If(Value >= 30, 200, MathClamp(Value * 0.1 + 0.1, 0.1, 3))
- End Sub
- #End Region
- #Region "Version"
- '游戏内存
- Public Sub VersionRamType(Type As Integer)
- If FrmInstanceSetup Is Nothing Then Return
- FrmInstanceSetup.RamType(Type)
- End Sub
- '服务器
- Public Sub VersionServerLogin(Type As Integer)
- If FrmInstanceSetup Is Nothing Then Return
- '为第三方登录清空缓存以更新描述
- WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "")
- If PageInstanceLeft.Instance Is Nothing Then Return
- PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
- LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
- End Sub
- #End Region
- End Class
|