formHomeRight.xaml.vb 74 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562
  1. Public Class formHomeRight
  2. ''' <summary>
  3. ''' 是否已经初始化过本窗体。
  4. ''' </summary>
  5. ''' <remarks></remarks>
  6. Public FormLoaded As Boolean = False
  7. ''' <summary>
  8. ''' 窗体初始化。
  9. ''' </summary>
  10. ''' <param name="sender"></param>
  11. ''' <param name="e"></param>
  12. ''' <remarks></remarks>
  13. Private Sub Load(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles panMain.Loaded
  14. '仅初始化一次
  15. If FormLoaded Then Exit Sub
  16. FormLoaded = True
  17. log("[HomeRight] 初始化开始")
  18. '加载邮箱、密码、用户名、登录方式
  19. textLoginEmail.Text = ReadReg("Email")
  20. If ReadReg("HomeSave", "True") = "True" Then textLoginPassword.Password = SerRemove(ReadReg("Password"))
  21. textLegacyUsername.Text = ReadReg("LaunchStartUsername")
  22. If textLegacyUsername.Text = "" Then textLegacyUsername.Text = "游戏名"
  23. ChangeLoginMethod(If(MODE_OFFLINE, LoginMethods.Legacy, Val(ReadReg("LaunchStartLoginMethod", LoginMethods.Legacy))), False)
  24. '版本信息已经由线程池委托加载
  25. '如果打开 PCL 在 7 次以内,提示切换版本列表的位置
  26. If Val(ReadIni("setup", "LastVersionCode", "0")) < 7 Then btnStartMore.ToolTip = "切换版本"
  27. log("[HomeRight] 初始化结束")
  28. End Sub
  29. #Region "Top | 登录方式"
  30. '各个状态下的透明度
  31. Private Const LAUNCH_SELECT As Double = 1
  32. Private Const LAUNCH_MOUSEIN As Double = 0.8
  33. Private Const LAUNCH_MOUSEOUT As Double = 0.5
  34. '统一的动画时长
  35. Private Const LAUNCH_LENGTH As Integer = 100
  36. Private Const LAUNCH_NEWPAGE As Integer = 100
  37. Private Const LAUNCH_OLDPAGE_DELAY As Integer = 20
  38. Private _LoginMethod As LoginMethods = LoginMethods.Unknown
  39. ''' <summary>
  40. ''' 目前的登录方式。
  41. ''' </summary>
  42. ''' <remarks></remarks>
  43. Public Property LoginMethod As LoginMethods
  44. Get
  45. Return _LoginMethod
  46. End Get
  47. Set(ByVal value As LoginMethods)
  48. _LoginMethod = value
  49. StartButtonRefresh()
  50. End Set
  51. End Property
  52. ''' <summary>
  53. ''' 切换登录方式。
  54. ''' </summary>
  55. ''' <param name="NewMethod">新的登录方式。</param>
  56. ''' <param name="UseAnimation">是否在切换方式时使用动画。</param>
  57. ''' <remarks></remarks>
  58. Public Sub ChangeLoginMethod(ByVal NewMethod As LoginMethods, Optional ByVal UseAnimation As Boolean = True)
  59. If NewMethod = LoginMethod Then Exit Sub
  60. '记录新的数据
  61. LoginMethod = NewMethod
  62. log("[HomeRight] 切换登录方式:" & GetStringFromEnum(LoginMethod))
  63. WriteReg("LaunchStartLoginMethod", LoginMethod)
  64. '改变目前的页面类型
  65. Select Case NewMethod
  66. Case LoginMethods.Legacy
  67. ChangeLoginPage(LoginPages.Legacy, UseAnimation)
  68. Case LoginMethods.Mojang
  69. '从目前的登录结果判断页面类型
  70. If LoginResult = "" Or IsMojangHeadLoaded = False Then
  71. ChangeLoginPage(LoginPages.Login, UseAnimation)
  72. Else
  73. ChangeLoginPage(LoginPages.Mojang, UseAnimation)
  74. End If
  75. End Select
  76. '改变顶部条的显示
  77. AniStop("btnTopLegacyMouse")
  78. AniStop("btnTopMojangMouse")
  79. Select Case NewMethod
  80. Case LoginMethods.Legacy
  81. '使用IsHitTestVisible来代替IsEnabled,防止鼠标动画
  82. btnTopLegacy.IsHitTestVisible = False
  83. btnTopMojang.IsHitTestVisible = True
  84. '先设置IsHitTestVisible,以便调用鼠标移出事件
  85. If UseAnimation Then
  86. AniStart({
  87. AaOpacity(btnTopLegacy, LAUNCH_SELECT - btnTopLegacy.Opacity, LAUNCH_LENGTH)
  88. }, "HomeRightChangeLoginMethod")
  89. '用鼠标移出事件来防止连续移出导致透明度异常降低,也能使得透明度恢复原状
  90. btnLaunch_MouseLeave(btnTopMojang, Nothing)
  91. Else
  92. btnTopLegacy.Opacity = LAUNCH_SELECT
  93. btnTopMojang.Opacity = LAUNCH_MOUSEOUT
  94. End If
  95. Case LoginMethods.Mojang
  96. btnTopLegacy.IsHitTestVisible = True
  97. btnTopMojang.IsHitTestVisible = False
  98. If UseAnimation Then
  99. AniStart({
  100. AaOpacity(btnTopMojang, LAUNCH_SELECT - btnTopMojang.Opacity, LAUNCH_SELECT)
  101. }, "HomeRightChangeLoginMethod")
  102. btnLaunch_MouseLeave(btnTopLegacy, Nothing)
  103. Else
  104. btnTopLegacy.Opacity = LAUNCH_MOUSEOUT
  105. btnTopMojang.Opacity = LAUNCH_SELECT
  106. End If
  107. End Select
  108. End Sub
  109. ''' <summary>
  110. ''' 目前的登录页面种类。
  111. ''' </summary>
  112. ''' <remarks></remarks>
  113. Private LoginPage As LoginPages = LoginPages.Unknown
  114. ''' <summary>
  115. ''' 登录页面的种类。
  116. ''' </summary>
  117. ''' <remarks></remarks>
  118. Private Enum LoginPages As Byte
  119. Mojang = 0
  120. Legacy = 1
  121. Login = 2
  122. Unknown = 3
  123. End Enum
  124. ''' <summary>
  125. ''' 切换显示的登录页面。
  126. ''' </summary>
  127. ''' <param name="NewPage">新的页面编号。</param>
  128. ''' <param name="UseAnimation">是否在切换页面时使用动画。</param>
  129. ''' <remarks></remarks>
  130. Private Sub ChangeLoginPage(ByVal NewPage As LoginPages, Optional ByVal UseAnimation As Boolean = True)
  131. If NewPage = LoginPage Then Exit Sub
  132. '切换页面
  133. Select Case NewPage
  134. Case LoginPages.Legacy
  135. panLegacy.Visibility = Visibility.Visible
  136. If UseAnimation Then
  137. panLegacy.Opacity = 0
  138. AniStart({
  139. AaOpacity(panLogin, -panLogin.Opacity, LAUNCH_NEWPAGE, LAUNCH_OLDPAGE_DELAY),
  140. AaOpacity(panMojang, -panMojang.Opacity, LAUNCH_NEWPAGE, LAUNCH_OLDPAGE_DELAY),
  141. AaOpacity(panLegacy, 1 - panLegacy.Opacity, LAUNCH_NEWPAGE),
  142. AaCode({"Visible", panLogin, False}, , True),
  143. AaCode({"Visible", panMojang, False})
  144. }, "ChangeLoginPage")
  145. Else
  146. panLegacy.Opacity = 1
  147. panLogin.Visibility = Visibility.Collapsed
  148. panMojang.Visibility = Visibility.Collapsed
  149. End If
  150. Case LoginPages.Login
  151. panLogin.Visibility = Visibility.Visible
  152. If UseAnimation Then
  153. panLogin.Opacity = 0
  154. AniStart({
  155. AaOpacity(panLegacy, -panLegacy.Opacity, LAUNCH_NEWPAGE, LAUNCH_OLDPAGE_DELAY),
  156. AaOpacity(panMojang, -panMojang.Opacity, LAUNCH_NEWPAGE, LAUNCH_OLDPAGE_DELAY),
  157. AaOpacity(panLogin, 1 - panLogin.Opacity, LAUNCH_NEWPAGE),
  158. AaCode({"Visible", panLegacy, False}, , True),
  159. AaCode({"Visible", panMojang, False})
  160. }, "ChangeLoginPage")
  161. Else
  162. panLogin.Opacity = 1
  163. panLegacy.Visibility = Visibility.Collapsed
  164. panMojang.Visibility = Visibility.Collapsed
  165. End If
  166. Case LoginPages.Mojang
  167. panMojang.Visibility = Visibility.Visible
  168. If UseAnimation Then
  169. panMojang.Opacity = 0
  170. AniStart({
  171. AaOpacity(panLegacy, -panLegacy.Opacity, LAUNCH_NEWPAGE, LAUNCH_OLDPAGE_DELAY),
  172. AaOpacity(panLogin, -panLogin.Opacity, LAUNCH_NEWPAGE, LAUNCH_OLDPAGE_DELAY),
  173. AaOpacity(panMojang, 1 - panMojang.Opacity, LAUNCH_NEWPAGE),
  174. AaCode({"Visible", panLegacy, False}, , True),
  175. AaCode({"Visible", panLogin, False})
  176. }, "ChangeLoginPage")
  177. Else
  178. panMojang.Opacity = 1
  179. panLegacy.Visibility = Visibility.Collapsed
  180. panLogin.Visibility = Visibility.Collapsed
  181. End If
  182. End Select
  183. '记录新的数据
  184. LoginPage = NewPage
  185. log("[HomeRight] 切换登录页面:" & GetStringFromEnum(LoginPage))
  186. End Sub
  187. #Region "鼠标动画"
  188. Private Sub btnLaunch_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnTopMojang.MouseEnter, btnTopLegacy.MouseEnter
  189. '不可用时的动画用IsHitTestVisible和平解决
  190. If Not sender.IsHitTestVisible Then Exit Sub
  191. AniStart({AaOpacity(sender, LAUNCH_MOUSEIN - sender.Opacity, LAUNCH_LENGTH)}, sender.Name & "Mouse")
  192. End Sub
  193. Private Sub btnLaunch_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnTopMojang.MouseLeave, btnTopLegacy.MouseLeave
  194. If Not sender.IsHitTestVisible Then Exit Sub
  195. AniStart({AaOpacity(sender, LAUNCH_MOUSEOUT - sender.Opacity, LAUNCH_LENGTH)}, sender.Name & "Mouse")
  196. End Sub
  197. #End Region
  198. '点击改变登录方式
  199. Private Sub btnLaunch_MouseLeftButtonUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles btnTopMojang.MouseLeftButtonUp, btnTopLegacy.MouseLeftButtonUp
  200. ChangeLoginMethod(GetEnumFromString(LoginMethod, sender.Tag))
  201. End Sub
  202. #End Region
  203. #Region "Login | 未登录页"
  204. '更改文本的保存
  205. Private Sub textEmail_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles textLoginEmail.TextChanged
  206. WriteReg("Email", textLoginEmail.Text)
  207. End Sub
  208. Private Sub textPassword_PasswordChanged(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles textLoginPassword.PasswordChanged
  209. textLoginSee.Text = textLoginPassword.Password
  210. WriteReg("Password", SerAdd(textLoginPassword.Password))
  211. End Sub
  212. '点击查看密码
  213. Private Sub btnLoginSeePassword_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles btnLoginSeePassword.MouseLeftButtonDown
  214. AniStart({
  215. AaOpacity(textLoginPassword, -textLoginPassword.Opacity, 100),
  216. AaOpacity(textLoginSee, 1 - textLoginSee.Opacity, 100)
  217. }, "HomeRightLoginSeePassword")
  218. End Sub
  219. Private Sub btnLoginSeePassword_Leave(ByVal sender As Object, ByVal e As EventArgs) Handles btnLoginSeePassword.MouseLeftButtonUp, btnLoginSeePassword.MouseLeave
  220. AniStart({
  221. AaOpacity(textLoginPassword, 1 - textLoginPassword.Opacity, 100),
  222. AaOpacity(textLoginSee, -textLoginSee.Opacity, 100)
  223. }, "HomeRightLoginSeePassword")
  224. End Sub
  225. 'Tab
  226. Private Sub textLoginEmail_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles textLoginEmail.KeyDown
  227. '在输入法里按下回车输入英文时也会触发KeyUp事件,所以采用KeyDown
  228. If e.Key = Input.Key.Tab Then textLoginPassword.Focus() '按下Tab时切换到密码框
  229. End Sub
  230. #End Region
  231. #Region "Mojang | 已登录页"
  232. '退出按钮的展开/收回
  233. Private Sub panMojang_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles panMojang.MouseEnter
  234. AniStart({
  235. AaWidth(btnMojangLogout, 18 - btnMojangLogout.ActualWidth, 100, , New AniEaseEnd),
  236. AaHeight(btnMojangLogout, 20 - btnMojangLogout.ActualHeight, 100, , New AniEaseEnd),
  237. AaWidth(labMojangLogoutPosition, -labMojangLogoutPosition.ActualWidth, 100, , New AniEaseEnd)
  238. }, "HomeRightMojangLogout")
  239. End Sub
  240. Private Sub panMojang_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles panMojang.MouseLeave
  241. AniStart({
  242. AaWidth(btnMojangLogout, -btnMojangLogout.ActualWidth, 100, , New AniEaseStart),
  243. AaHeight(btnMojangLogout, -btnMojangLogout.ActualHeight, 100, , New AniEaseStart),
  244. AaWidth(labMojangLogoutPosition, 10 - labMojangLogoutPosition.ActualWidth, 100, , New AniEaseStart)
  245. }, "HomeRightMojangLogout")
  246. End Sub
  247. '退出按钮的点击
  248. Private Sub panMojangInner_MouseLeftButtonUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles panMojangInner.MouseLeftButtonUp
  249. If e.GetPosition(panMojangInner).X - 10 - labMojangName.ActualWidth < 0 Then Exit Sub '退出的Path不完整所以不拥有完整的碰撞箱
  250. Logout()
  251. End Sub
  252. ''' <summary>
  253. ''' 退出登录。这会清空所有的登录信息。
  254. ''' </summary>
  255. ''' <remarks></remarks>
  256. Public Sub Logout()
  257. log("[HomeRight] 退出正版登录")
  258. LoginResult = ""
  259. textLoginEmail.Text = ""
  260. textLoginPassword.Password = ""
  261. WriteReg("AccessToken", "")
  262. WriteReg("ClientToken", "")
  263. WriteReg("MojangPlayerUUID", "")
  264. WriteReg("MojangPlayerName", "")
  265. IsMojangHeadLoaded = False
  266. timerMojangCheck.Tag = False
  267. timerMojangCheck.IsEnabled = True
  268. ChangeLoginPage(LoginPages.Login)
  269. StartButtonRefresh()
  270. End Sub
  271. '点击头像,打开皮肤页面
  272. Private Sub imgMojangHead_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles imgMojangHead2.MouseLeftButtonDown
  273. Process.Start("https://minecraft.net/zh-hans/profile")
  274. End Sub
  275. ''' <summary>
  276. ''' 是否加载过正版头像。
  277. ''' </summary>
  278. ''' <remarks></remarks>
  279. Public IsMojangHeadLoaded As Boolean = False
  280. ''' <summary>
  281. ''' 刷新正版头像。
  282. ''' </summary>
  283. ''' <returns></returns>
  284. ''' <remarks></remarks>
  285. Public Function LoadMojangSkin(ByVal SkinAddress As String) As Boolean
  286. '判断直接图片
  287. Select Case SkinAddress
  288. Case "Steve"
  289. log("[HomeRight] 载入正版头像:Steve")
  290. imgMojangHead1.Source = Nothing
  291. imgMojangHead2.Source = New MyBitmap(PATH_IMAGE & "steve.png")
  292. IsMojangHeadLoaded = True
  293. Return True
  294. Case "Alex"
  295. log("[HomeRight] 载入正版头像:Alex")
  296. imgMojangHead1.Source = Nothing
  297. imgMojangHead2.Source = New MyBitmap(PATH_IMAGE & "alex.png")
  298. IsMojangHeadLoaded = True
  299. Return True
  300. End Select
  301. '刷新头像
  302. Try
  303. If Not File.Exists(SkinAddress) Then
  304. log("[HomeRight] 载入正版头像失败:文件 " & SkinAddress & " 不存在")
  305. Return False
  306. End If
  307. imgMojangHead1.Source = New CroppedBitmap(New MyBitmap(SkinAddress), New Int32Rect(40, 8, 8, 8))
  308. imgMojangHead2.Source = New CroppedBitmap(New MyBitmap(SkinAddress), New Int32Rect(8, 8, 8, 8))
  309. log("[HomeRight] 载入正版头像成功")
  310. IsMojangHeadLoaded = True
  311. Return True
  312. Catch ex As Exception
  313. log("[HomeRight] 载入正版头像失败:" & GetStringFromException(ex), True)
  314. Return False
  315. End Try
  316. End Function
  317. Private Sub timerMojangCheck_Tick() Handles timerMojangCheck.Tick
  318. Try
  319. '确保控件已经加载
  320. If IsNothing(panMojang) Or IsNothing(labMojangName) Or IsNothing(panMain) Or IsNothing(textLegacyUsername) Or LoginResult = "" Then Exit Sub
  321. '判断皮肤状态
  322. If IsMojangHeadLoaded Then
  323. '已经由登录线程加载了头像
  324. timerMojangCheck.IsEnabled = False
  325. Else
  326. '缓存头像只尝试一次
  327. If timerMojangCheck.Tag = True Then Exit Sub
  328. timerMojangCheck.Tag = True
  329. '尚未加载头像,试图加载缓存头像
  330. Dim UUID = CType(Newtonsoft.Json.JsonConvert.DeserializeObject(LoginResult), JObject)("selectedProfile")("id").ToString
  331. Dim SkinAddress As String = ReadIni("cache\skin\SkinName", UUID)
  332. If Not SkinAddress = "" Then
  333. SkinAddress = PATH & "PCL\cache\skin\" & SkinAddress & ".png"
  334. log("[HomeRight] 从缓存加载正版头像:" & SkinAddress)
  335. LoadMojangSkin(SkinAddress)
  336. End If
  337. '如果加载失败则退出
  338. If Not IsMojangHeadLoaded Then Exit Sub
  339. End If
  340. '加载用户信息
  341. Dim LoginJson = CType(Newtonsoft.Json.JsonConvert.DeserializeObject(LoginResult), JObject)
  342. labMojangName.Content = LoginJson("selectedProfile")("name").ToString
  343. '如果未设置离线名,则设置为正版名
  344. If textLegacyUsername.Text = "" Or textLegacyUsername.Text = "游戏名" Then textLegacyUsername.Text = labMojangName.Content
  345. '显示登陆页
  346. If LoginMethod = LoginMethods.Mojang And IsMojangHeadLoaded Then ChangeLoginPage(LoginPages.Mojang)
  347. Catch ex As Exception
  348. log("[HomeRight] 正版页检测刻异常:" & GetStringFromException(ex, True), True)
  349. End Try
  350. End Sub
  351. #End Region
  352. #Region "Legacy | 离线页"
  353. '更改文本
  354. Private Sub textLegacyUsername_TextChanged(sender, e) Handles textLegacyUsername.TextChanged
  355. textLegacyUsername.Opacity = If(textLegacyUsername.Text = "游戏名", 0.3, 1)
  356. Try
  357. '不允许特殊字符"
  358. ''替换“-”与“ ”
  359. 'Dim NewText = textLegacyUsername.Text.Replace("-", "_").Replace(" ", "_")
  360. 'If Not NewText = textLegacyUsername.Text Then
  361. ' Dim OldStart = textLegacyUsername.SelectionStart
  362. ' textLegacyUsername.Text = NewText
  363. ' textLegacyUsername.SelectionStart = OldStart
  364. 'End If
  365. '检测非法字符
  366. 'Dim SafeCheck = RegexSearch(textLegacyUsername.Text, "[^0-9A-Za-z_]+")
  367. If textLegacyUsername.Text.Contains("""") Then
  368. ShowHint(New HintConverter("游戏名不能包含引号!", HintState.Warn))
  369. Dim Start = textLegacyUsername.SelectionStart
  370. textLegacyUsername.Text = textLegacyUsername.Text.Replace("""", "") '清除错误名称
  371. textLegacyUsername.SelectionStart = MathRange(Start - 1, 0, textLegacyUsername.Text.Length)
  372. Exit Sub
  373. End If
  374. '保存文本
  375. If Not textLegacyUsername.Text = "游戏名" Then WriteReg("LaunchStartUsername", textLegacyUsername.Text)
  376. '加载头像
  377. Dim UserName As String = textLegacyUsername.Text
  378. Dim th As New Thread(Sub() RefreshLegacySkin(UserName))
  379. th.Priority = ThreadPriority.BelowNormal
  380. th.Start()
  381. Catch ex As Exception
  382. ExShow(ex, "更改离线用户名失败", ErrorLevel.MsgboxAndFeedback)
  383. End Try
  384. End Sub
  385. '获取焦点时如果是“游戏名”则清空
  386. Private Sub textLegacyUsername_GotFocus(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles textLegacyUsername.GotFocus
  387. If textLegacyUsername.Text = "游戏名" Then textLegacyUsername.Text = ""
  388. End Sub
  389. '失去焦点时如果是空则设置
  390. Private Sub textLegacyUsername_LostFocus(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles textLegacyUsername.LostFocus
  391. If textLegacyUsername.Text = "" Then textLegacyUsername.Text = "游戏名"
  392. textLegacyUsername_TextChanged("LostFocus", Nothing)
  393. End Sub
  394. ''' <summary>
  395. ''' 每次用户名改变触发刷新头像。(异线程执行)
  396. ''' </summary>
  397. Public Sub RefreshLegacySkin(ByVal UserName As String)
  398. '隐藏目前头像
  399. frmMain.Dispatcher.Invoke(Sub()
  400. AniStart({
  401. AaOpacity(panLegacyHead, -panLegacyHead.Opacity, 100)
  402. }, "imgLegacyHead")
  403. End Sub)
  404. Dim CheckName As String = ""
  405. If ReadReg("LaunchSkin") = "3" And Not ReadReg("LaunchSkinName") = "" Then
  406. '如果设置了用户名则加载那个用户名
  407. UserName = ReadReg("LaunchSkinName")
  408. CheckName = UserName
  409. ElseIf UserName = "" Or UserName = "游戏名" Then
  410. '如果为空名或“游戏名”则加载史蒂夫头像
  411. frmMain.Dispatcher.Invoke(Sub() ShowLegacySkin("Steve", UserName, UserName))
  412. Exit Sub
  413. End If
  414. '不联网加载缓存头像
  415. Dim CacheAddress As String = GetSkinAddressByName(UserName, True, False)
  416. Dim IsSuccessed As Boolean = False
  417. If Not CacheAddress = "" Then frmMain.Dispatcher.Invoke(Sub() IsSuccessed = ShowLegacySkin(CacheAddress, UserName, CheckName))
  418. '联网加载正式头像
  419. If Not MODE_OFFLINE Then
  420. Dim RealAddress As String = GetSkinAddressByName(UserName, True, True)
  421. If IsSuccessed And RealAddress = CacheAddress Then Exit Sub '已经加载成功,并且路径与缓存一样,则退出执行
  422. If Not RealAddress = "" Then frmMain.Dispatcher.Invoke(Sub() IsSuccessed = ShowLegacySkin(RealAddress, UserName, CheckName))
  423. End If
  424. '如果没有成功,则加载史蒂夫头像
  425. If IsSuccessed Then Exit Sub
  426. frmMain.Dispatcher.Invoke(Sub() ShowLegacySkin("Steve", UserName, CheckName))
  427. End Sub
  428. ''' <summary>
  429. ''' 由用户名获取皮肤路径。这会返回 Steve,Alex,或文件路径。若失败会返回空字符串。
  430. ''' </summary>
  431. Public Function GetSkinAddressByName(ByVal UserName As String, ByVal IsLegacy As Boolean, ByVal TryOnline As Boolean) As String
  432. Try
  433. '如果不使用正版皮肤,通过离线皮肤设置判断皮肤种类
  434. If IsLegacy Then
  435. '判断皮肤种类
  436. Select Case Val(ReadReg("LaunchSkin", "3"))
  437. Case 0
  438. '默认
  439. Return GetSkinTypeFromUUID(FillLength(SerAdd(UserName), "0", 32))
  440. Case 1
  441. 'Steve
  442. Return "Steve"
  443. Case 2
  444. 'Alex
  445. Return "Alex"
  446. Case Else
  447. '使用正版皮肤
  448. '这样和 IsLegacy = True 结果一样,所以继续处理即可
  449. End Select
  450. End If
  451. '如果不进行联网尝试,直接获取离线缓存皮肤,如果没有缓存则返回空
  452. If Not TryOnline Then
  453. '获取 UUID
  454. Dim UUID = GetUUIDFromUserName(UserName, False)
  455. If UUID = "" Then Return ""
  456. '从 UUID 加载正版皮肤
  457. Return GetCacheSkinAddressByMojangUUID(UUID)
  458. End If
  459. '如果进行联网尝试,则联网下载皮肤
  460. '获取 UUID
  461. Dim RealUUID = GetUUIDFromUserName(UserName, True)
  462. If RealUUID = "" Then
  463. '不存在这个正版账号
  464. Dim OfflineUUID As String = FillLength(SerAdd(UserName), "0", 32)
  465. WriteIni("cache\skin\UUID", UserName, OfflineUUID)
  466. Dim OfflineSkinname As String = GetSkinTypeFromUUID(OfflineUUID)
  467. WriteIni("cache\skin\SkinName", OfflineUUID, OfflineSkinname)
  468. Return GetSkinTypeFromUUID(OfflineSkinname)
  469. End If
  470. '下载皮肤
  471. Return DownloadSkin(RealUUID)
  472. Catch ex As Exception
  473. ExShow(ex, "获取玩家皮肤失败")
  474. Return ""
  475. End Try
  476. End Function
  477. ''' <summary>
  478. ''' 显示离线头像。需要在 UI 线程执行。
  479. ''' </summary>
  480. Private Function ShowLegacySkin(ByVal SkinAddress As String, ByVal UserName As String, CheckName As String) As Boolean
  481. '输入的名称已经改变
  482. If Not UserName = If(CheckName = "", textLegacyUsername.Text, CheckName) Then Return False
  483. '判断直接图片
  484. Select Case SkinAddress
  485. Case "Steve"
  486. log("[HomeRight] 载入离线头像:Steve")
  487. imgLegacyHead1.Source = Nothing
  488. imgLegacyHead2.Source = New MyBitmap(PATH_IMAGE & "steve.png")
  489. GoTo Finish
  490. Case "Alex"
  491. log("[HomeRight] 载入离线头像:Alex")
  492. imgLegacyHead1.Source = Nothing
  493. imgLegacyHead2.Source = New MyBitmap(PATH_IMAGE & "alex.png")
  494. GoTo Finish
  495. End Select
  496. '刷新头像
  497. Try
  498. If Not File.Exists(SkinAddress) Then
  499. log("[HomeRight] 载入离线头像失败:文件 " & SkinAddress & " 不存在")
  500. Return False
  501. End If
  502. imgLegacyHead1.Source = New CroppedBitmap(New MyBitmap(SkinAddress), New Int32Rect(40, 8, 8, 8))
  503. imgLegacyHead2.Source = New CroppedBitmap(New MyBitmap(SkinAddress), New Int32Rect(8, 8, 8, 8))
  504. log("[HomeRight] 载入离线头像:" & SkinAddress)
  505. GoTo Finish
  506. Catch ex As Exception
  507. log("[HomeRight] 载入离线头像失败:" & GetStringFromException(ex), True)
  508. Return False
  509. End Try
  510. Exit Function
  511. Finish:
  512. AniStart({
  513. AaOpacity(panLegacyHead, 1 - panLegacyHead.Opacity, 100)
  514. }, "imgLegacyHead")
  515. Return True
  516. End Function
  517. #End Region
  518. #Region "Start | 开始游戏"
  519. #Region "状态切换"
  520. ''' <summary>
  521. ''' 开始游戏按钮状态枚举。
  522. ''' </summary>
  523. ''' <remarks></remarks>
  524. Public Enum StartButtonState As Byte
  525. ''' <summary>
  526. ''' 正常状态。
  527. ''' </summary>
  528. ''' <remarks></remarks>
  529. Normal = 0
  530. ''' <summary>
  531. ''' 加载版本列表中。
  532. ''' </summary>
  533. ''' <remarks></remarks>
  534. Loading = 1
  535. ''' <summary>
  536. ''' 没有可用版本。
  537. ''' </summary>
  538. ''' <remarks></remarks>
  539. NoVersion = 2
  540. ''' <summary>
  541. ''' 启动 Minecraft 中。
  542. ''' </summary>
  543. ''' <remarks></remarks>
  544. Launching = 3
  545. ''' <summary>
  546. ''' 需要登录。
  547. ''' </summary>
  548. ''' <remarks></remarks>
  549. Login = 4
  550. ''' <summary>
  551. ''' 正在登录。
  552. ''' </summary>
  553. Logining = 5
  554. End Enum
  555. Private _StartButtonIsLogining As Boolean = False
  556. ''' <summary>
  557. ''' 是否正在登录。
  558. ''' </summary>
  559. ''' <returns></returns>
  560. Public Property StartButtonIsLogining As Boolean
  561. Get
  562. Return _StartButtonIsLogining
  563. End Get
  564. Set(value As Boolean)
  565. _StartButtonIsLogining = value
  566. frmMain.Dispatcher.Invoke(Sub() StartButtonRefresh())
  567. End Set
  568. End Property
  569. Private _StartButtonIsLoading As Boolean = False
  570. ''' <summary>
  571. ''' 是否正在加载版本。
  572. ''' </summary>
  573. ''' <returns></returns>
  574. Public Property StartButtonIsLoading As Boolean
  575. Get
  576. Return _StartButtonIsLoading
  577. End Get
  578. Set(value As Boolean)
  579. _StartButtonIsLoading = value
  580. If value = False Then frmStart.IsVersionLoading = False
  581. frmMain.Dispatcher.Invoke(Sub() StartButtonRefresh())
  582. End Set
  583. End Property
  584. Private _StartButtonIsLaunching As Boolean = False
  585. ''' <summary>
  586. ''' 是否正在启动。
  587. ''' </summary>
  588. ''' <returns></returns>
  589. Public Property StartButtonIsLaunching As Boolean
  590. Get
  591. Return _StartButtonIsLaunching
  592. End Get
  593. Set(value As Boolean)
  594. _StartButtonIsLaunching = value
  595. frmMain.Dispatcher.Invoke(Sub() StartButtonRefresh())
  596. End Set
  597. End Property
  598. Private _StartButtonCurrent As StartButtonState = StartButtonState.Loading
  599. ''' <summary>
  600. ''' 开始游戏按钮的当前状态。
  601. ''' </summary>
  602. ''' <remarks></remarks>
  603. Public ReadOnly Property StartButtonCurrent As StartButtonState
  604. Get
  605. Return _StartButtonCurrent
  606. End Get
  607. End Property
  608. ''' <summary>
  609. ''' 刷新开始按钮状态。
  610. ''' </summary>
  611. Public Sub StartButtonRefresh()
  612. 'panStart.UpdateLayout()
  613. 'btnStartMore.UpdateLayout()
  614. 'pathStart1.UpdateLayout()
  615. 'pathStart2.UpdateLayout()
  616. 'pathStart3.UpdateLayout()
  617. 'labStartTop.UpdateLayout()
  618. 'labStartButtom.UpdateLayout()
  619. '确定状态
  620. Dim NewValue As StartButtonState
  621. If StartButtonIsLaunching Then
  622. NewValue = StartButtonState.Launching
  623. ElseIf StartButtonIsLoading Then
  624. NewValue = StartButtonState.Loading
  625. ElseIf SelectVersion.Name = "" Then
  626. NewValue = StartButtonState.NoVersion
  627. ElseIf StartButtonIsLogining And LoginMethod = LoginMethods.Mojang Then
  628. NewValue = StartButtonState.Logining
  629. ElseIf LoginResult = "" And LoginMethod = LoginMethods.Mojang Then
  630. NewValue = StartButtonState.Login
  631. Else
  632. NewValue = StartButtonState.Normal
  633. End If
  634. '如果不变则跳过
  635. If StartButtonCurrent = NewValue Then Exit Sub
  636. '切换事件
  637. Select Case NewValue
  638. Case StartButtonState.Normal
  639. labStartTop.Content = "开始游戏"
  640. labStartButtom.Content = SelectVersion.Name
  641. btnStartMore.IsHitTestVisible = True
  642. btnStart.IsHitTestVisible = True
  643. StartRightShow()
  644. StartButtomShow()
  645. Case StartButtonState.Loading
  646. labStartTop.Content = "加载中"
  647. SelectVersion = New MCVersion("")
  648. btnStartMore.IsHitTestVisible = False
  649. btnStart.IsHitTestVisible = False
  650. StartRightHide()
  651. HideVersion()
  652. StartButtomHide()
  653. Case StartButtonState.NoVersion
  654. labStartTop.Content = "下载游戏"
  655. SelectVersion = New MCVersion("")
  656. btnStartMore.IsHitTestVisible = False
  657. btnStart.IsHitTestVisible = True
  658. StartRightHide()
  659. StartButtomHide()
  660. Case StartButtonState.Launching
  661. labStartTop.Content = "游戏启动中"
  662. labStartButtom.Content = "初始化中"
  663. btnStartMore.IsHitTestVisible = False
  664. btnStart.IsHitTestVisible = False
  665. StartRightHide()
  666. StartButtomShow()
  667. Case StartButtonState.Login
  668. labStartTop.Content = "登录"
  669. btnStartMore.IsHitTestVisible = True
  670. btnStart.IsHitTestVisible = True
  671. StartRightShow()
  672. StartButtomHide()
  673. Case StartButtonState.Logining
  674. labStartTop.Content = "正在登录"
  675. btnStartMore.IsHitTestVisible = True
  676. btnStart.IsHitTestVisible = False
  677. StartRightShow()
  678. StartButtomHide()
  679. End Select
  680. _StartButtonCurrent = NewValue
  681. End Sub
  682. #End Region
  683. #Region "指向动画"
  684. Private Sub btnStart_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnStart.MouseEnter
  685. AniStart({
  686. AaOpacity(rectStart, 0.93 - rectStart.Opacity, 100)
  687. }, "HomeRightStart", False)
  688. End Sub
  689. Private Sub btnStart_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnStart.MouseLeave
  690. AniStart({
  691. AaOpacity(rectStart, 1 - rectStart.Opacity, 100)
  692. }, "HomeRightStart", False)
  693. End Sub
  694. Private Sub btnStartMore_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnStartMore.MouseEnter
  695. AniStart({
  696. AaY(pathStart1, -0.8, 100),
  697. AaY(pathStart3, 0.8, 100)
  698. }, GetUUID)
  699. End Sub
  700. Private Sub btnStartMore_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnStartMore.MouseLeave
  701. AniStart({
  702. AaY(pathStart1, 0.8, 100),
  703. AaY(pathStart3, -0.8, 100)
  704. }, GetUUID)
  705. End Sub
  706. #End Region
  707. #Region "UI 界面入口"
  708. '显示/隐藏 开始按钮右边的版本列表选择
  709. Public Sub StartRightHide()
  710. frmMain.Dispatcher.Invoke(Sub()
  711. AniStart(New Animation() {
  712. AaWidth(Me.btnStartMore, 12.0 - Me.btnStartMore.Width, 70, , New AniEaseEnd),
  713. AaOpacity(Me.pathStart1, -Me.pathStart1.Opacity, 70),
  714. AaOpacity(Me.pathStart2, -Me.pathStart2.Opacity, 70),
  715. AaOpacity(Me.pathStart3, -Me.pathStart3.Opacity, 70)
  716. }, "HomeRightStartButtonRight")
  717. End Sub)
  718. End Sub
  719. Public Sub StartRightShow()
  720. frmMain.Dispatcher.Invoke(Sub()
  721. AniStart(New Animation() {
  722. AaWidth(Me.btnStartMore, 36.0 - Me.btnStartMore.Width, 70,, New AniEaseEnd),
  723. AaOpacity(Me.pathStart1, 1.0 - Me.pathStart1.Opacity, 70),
  724. AaOpacity(Me.pathStart2, 1.0 - Me.pathStart2.Opacity, 70),
  725. AaOpacity(Me.pathStart3, 1.0 - Me.pathStart3.Opacity, 70)
  726. }, "HomeRightStartButtonRight")
  727. End Sub)
  728. End Sub
  729. '显示/隐藏 开始按钮下的小字
  730. Public Sub StartButtomHide()
  731. frmMain.Dispatcher.Invoke(Sub()
  732. AniStart({
  733. AaY(labStartTop, 17 - labStartTop.Margin.Top, 70, , New AniEaseEnd),
  734. AaOpacity(labStartButtom, -labStartButtom.Opacity, 70),
  735. AaY(labStartButtom, 40 - labStartButtom.Margin.Top, 70, , New AniEaseEnd)
  736. }, "StartButtonButtom")
  737. End Sub)
  738. End Sub
  739. Public Sub StartButtomShow()
  740. frmMain.Dispatcher.Invoke(Sub()
  741. AniStart({
  742. AaY(labStartTop, 10 - labStartTop.Margin.Top, 70, , New AniEaseStart),
  743. AaOpacity(labStartButtom, 0.5 - labStartButtom.Opacity, 70),
  744. AaY(labStartButtom, 35 - labStartButtom.Margin.Top, 70, , New AniEaseStart)
  745. }, "StartButtonButtom")
  746. End Sub)
  747. End Sub
  748. '设置 开始按钮下的小字
  749. Public Sub StartButtomSet(Text As String)
  750. frmHomeRight.Dispatcher.Invoke(Sub() labStartButtom.Content = Text)
  751. End Sub
  752. Private Const START_PROCESS_TIME As Integer = 2000
  753. Private _StartProcess As Double = 0
  754. Public Property StartProcess As Double
  755. Get
  756. Return _StartProcess
  757. End Get
  758. Set(value As Double)
  759. '设置 0 进度会被视为初始化,所以在属性不变时不会取消事件执行
  760. frmHomeRight.Dispatcher.Invoke(Sub()
  761. Select Case value
  762. Case 0
  763. '初始化控件(主要是复原完成动画改变的属性)
  764. AniStop("StartProcess")
  765. rectStartProcess.Width = 0
  766. rectStartProcess.Opacity = 1
  767. rectStartProcess.Background = FindResource("Color3")
  768. Case 1
  769. '启动成功
  770. '首先按照正常动画的流程进行,让进度条跑满,然后消失结束(进度条消失)
  771. Dim Delta As Double = rectStart.ActualWidth - rectStartProcess.Width
  772. AniStart({
  773. AaWidth(rectStartProcess, Delta, START_PROCESS_TIME * (Math.Abs(Delta) / rectStart.ActualWidth)),
  774. AaCode(Sub() labStartTop.Content = "游戏启动成功", , True),
  775. AaCode(Sub() StartButtomHide()),
  776. AaBackGround(rectStartProcess, New MyColor(0, 166, 0) - rectStartProcess.Background, 70),
  777. AaOpacity(rectStartProcess, -rectStartProcess.Opacity, 70, 1530,, True),
  778. AaCode(Sub() frmHomeRight.StartButtonIsLaunching = False, 1600)
  779. }, "StartProcess")
  780. Case -1
  781. '取消
  782. AniStart({
  783. AaWidth(rectStartProcess, -rectStartProcess.ActualWidth, 200),
  784. AaOpacity(rectStartProcess, -rectStartProcess.Opacity, 70, 180,, True),
  785. AaCode(Sub() frmHomeRight.StartButtonIsLaunching = False, 250)
  786. }, "StartProcess")
  787. Case -2
  788. '启动失败
  789. AniStart({
  790. AaWidth(rectStartProcess, -rectStartProcess.ActualWidth, 200),
  791. AaCode(Sub() labStartTop.Content = "游戏启动失败", , True),
  792. AaWidth(rectStartProcess, rectStart.ActualWidth, 0),
  793. AaCode(Sub() StartButtomHide()),
  794. AaBackGround(rectStartProcess, New MyColor(223, 56, 0) - rectStartProcess.Background, 70),
  795. AaOpacity(rectStartProcess, -rectStartProcess.Opacity, 70, 1530,, True),
  796. AaCode(Sub() frmHomeRight.StartButtonIsLaunching = False, 1600)
  797. }, "StartProcess")
  798. Case Else
  799. If _StartProcess = value Then Exit Sub
  800. '正常动画
  801. Dim Delta As Double = rectStart.ActualWidth * value - rectStartProcess.Width
  802. '预计 2s 完成整个动画,用差值进行匀速处理,让进度条匀速增长
  803. AniStart({
  804. AaWidth(rectStartProcess, Delta, START_PROCESS_TIME * (Math.Abs(Delta) / rectStart.ActualWidth))
  805. }, "StartProcess")
  806. End Select
  807. End Sub)
  808. _StartProcess = value
  809. End Set
  810. End Property
  811. #End Region
  812. Public Sub ClickStartButton() Handles btnStart.MouseLeftButtonUp
  813. Select Case StartButtonCurrent
  814. Case StartButtonState.NoVersion
  815. If MODE_OFFLINE Then
  816. ShowHint(New HintConverter("没有网络连接,无法下载", HintState.Warn))
  817. Else
  818. If frmMain.btnTopDown.Visibility = Visibility.Visible Then
  819. frmMain.PageChange("下载")
  820. Else
  821. ShowHint("下载页面已被隐藏")
  822. End If
  823. End If
  824. Case StartButtonState.Normal
  825. StartButtonIsLaunching = True
  826. Dim UserName As String = textLegacyUsername.Text 'GameStart 在非 UI 线程调用
  827. Dim th As New Thread(Sub()
  828. GameStart(New GameStartInfo With {
  829. .LoginMethod = LoginMethod,
  830. .UserName = (If((Me.LoginMethod = LoginMethods.Legacy), UserName, ReadJson(LoginResult)("selectedProfile")("name").ToString())),
  831. .SelectVersion = SelectVersion
  832. })
  833. End Sub)
  834. th.Start()
  835. Case StartButtonState.Login
  836. If MODE_OFFLINE Then
  837. ShowHint(New HintConverter("没有网络连接,无法登录", HintState.Warn))
  838. Else
  839. WriteReg("AccessToken", "")
  840. WriteReg("ClientToken", "")
  841. If textLoginEmail.Text = "" Then ShowHint(New HintConverter("请输入邮箱后再登录!", HintState.Warn)) : Exit Sub
  842. If RegexSearch(textLoginEmail.Text, "([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+").Count = 0 Then ShowHint(New HintConverter("请检查你的邮箱格式是否正确!", HintState.Warn)) : Exit Sub
  843. If textLoginPassword.Password = "" Then ShowHint(New HintConverter("请输入密码后再登录!", HintState.Warn)) : Exit Sub
  844. Pool.Add(New Thread(Sub() PoolLogin(False)))
  845. End If
  846. End Select
  847. End Sub
  848. #End Region
  849. #Region "Update | 更新"
  850. ''' <summary>
  851. ''' 显示更新。
  852. ''' </summary>
  853. ''' <param name="Info">显示的提示信息。</param>
  854. ''' <param name="Type">提示信息的种类。</param>
  855. ''' <remarks></remarks>
  856. Public Sub ShowUpdate(ByVal Info As String, ByVal Type As UpdateType)
  857. btnUpdate.Content = Info
  858. ShowUpdateType = Type
  859. Dim AniArray As New ArrayList From {
  860. AaHeight(panLaunch, 304 - panLaunch.Height, , , New AniEaseEnd),
  861. AaOpacity(btnUpdate, 0.6)
  862. }
  863. AniStart(AniArray, "HomeRightShowUpdate")
  864. End Sub
  865. Private ShowUpdateType As UpdateType = UpdateType.PCL
  866. ''' <summary>
  867. ''' 显示的更新种类。
  868. ''' </summary>
  869. ''' <remarks></remarks>
  870. Public Enum UpdateType As Byte
  871. ''' <summary>
  872. ''' Minecraft 更新。
  873. ''' </summary>
  874. ''' <remarks></remarks>
  875. MINECRAFT = 0
  876. ''' <summary>
  877. ''' PCL 更新。
  878. ''' </summary>
  879. ''' <remarks></remarks>
  880. PCL = 1
  881. End Enum
  882. Private Sub btnUpdate_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnUpdate.MouseEnter
  883. If sender.Opacity < 0.5 Then Exit Sub '不小心点到的?
  884. AniStart({
  885. AaOpacity(btnUpdate, 1 - btnUpdate.Opacity, 150)
  886. }, "btnUpdateMouse")
  887. End Sub
  888. Private Sub btnUpdate_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnUpdate.MouseLeave
  889. If sender.Opacity < 0.5 Then Exit Sub '不小心点到的?
  890. AniStart({
  891. AaOpacity(btnUpdate, 0.6 - btnUpdate.Opacity, 150)
  892. }, "btnUpdateMouse")
  893. End Sub
  894. Private Sub btnUpdate_MouseLeftButtonUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles btnUpdate.MouseLeftButtonUp
  895. If sender.Opacity < 0.5 Then Exit Sub '不小心点到的?
  896. Select Case ShowUpdateType
  897. Case UpdateType.MINECRAFT
  898. frmMain.PageChange("下载")
  899. AniStart({
  900. AaHeight(panLaunch, 277 - panLaunch.Height, , , New AniEaseEnd),
  901. AaOpacity(btnUpdate, -btnUpdate.Opacity, 200)
  902. }, "HomeRightHideUpdate")
  903. Case UpdateType.PCL
  904. If MyMsgbox(ReadIni("update", "Description", "").Replace("\n", vbCrLf), "发现启动器更新", "立即更新", "取消") = 1 Then
  905. ShowHint("正在更新,更新结束后 PCL 将会自动重启")
  906. Dim th As New Thread(AddressOf DownloadUpdate)
  907. th.Start()
  908. AniStart({
  909. AaHeight(panLaunch, 277 - panLaunch.Height, , , New AniEaseEnd),
  910. AaOpacity(btnUpdate, -btnUpdate.Opacity, 200)
  911. }, "HomeRightHideUpdate")
  912. End If
  913. End Select
  914. End Sub
  915. #End Region
  916. #Region "Version | 版本选择"
  917. #Region "鼠标动画"
  918. Private Sub btnVersionBack_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnVersionBack.MouseEnter
  919. AniStart({
  920. AaOpacity(pathVersionBack, 1 - pathVersionBack.Opacity, 100),
  921. AaOpacity(labVersionBack, 1 - labVersionBack.Opacity, 100)
  922. }, "btnVersionBackMouse")
  923. End Sub
  924. Private Sub btnVersionBack_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles btnVersionBack.MouseLeave
  925. AniStart({
  926. AaOpacity(pathVersionBack, 0.8 - pathVersionBack.Opacity, 100),
  927. AaOpacity(labVersionBack, 0.8 - labVersionBack.Opacity, 100)
  928. }, "btnVersionBackMouse")
  929. End Sub
  930. Private Sub panVersionHost_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles panVersionHostSWAP.MouseEnter, panVersionHostOLD.MouseEnter, panVersionHostWRONG.MouseEnter
  931. AniStart({
  932. AaBackGround(sender, New MyColor(25, Application.Current.Resources("ColorE3")) - New MyColor(CType(sender.Background, SolidColorBrush).Color), 100)
  933. }, sender.Name & "Mouse")
  934. End Sub
  935. Private Sub panVersionHost_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles panVersionHostSWAP.MouseLeave, panVersionHostOLD.MouseLeave, panVersionHostWRONG.MouseLeave
  936. AniStart({
  937. AaBackGround(sender, New MyColor(0, Application.Current.Resources("ColorE3")) - New MyColor(CType(sender.Background, SolidColorBrush).Color), 100)
  938. }, sender.Name & "Mouse")
  939. End Sub
  940. #End Region
  941. ''' <summary>
  942. ''' 显示版本选择列表。
  943. ''' </summary>
  944. ''' <remarks></remarks>
  945. Public Sub ShowVersionList() Handles btnStartMore.MouseLeftButtonUp
  946. Try
  947. '处理动画
  948. panVersion.IsHitTestVisible = True
  949. Dim AniArray As New ArrayList From {
  950. AaOpacity(panLaunch, -panLaunch.Opacity, 150),
  951. AaOpacity(panVersion, 1 - panVersion.Opacity, 150, 110),
  952. AaCode({"Visible", panLaunch, "False"}, 150)
  953. }
  954. Dim AniDelay As Integer = 150
  955. For Each Item As ListItem In panVersionNORMAL.Children
  956. Item.Opacity = 0
  957. AniArray.Add(AaOpacity(Item, 1, 100, AniDelay))
  958. AniDelay = AniDelay + 25
  959. Next
  960. panVersionHostSWAP.Opacity = 0
  961. AniArray.Add(AaOpacity(panVersionHostSWAP, 1, 100, AniDelay))
  962. AniDelay = AniDelay + 25
  963. panVersionHostOLD.Opacity = 0
  964. AniArray.Add(AaOpacity(panVersionHostOLD, 1, 100, AniDelay))
  965. AniDelay = AniDelay + 25
  966. panVersionHostWRONG.Opacity = 0
  967. AniArray.Add(AaOpacity(panVersionHostWRONG, 1, 100, AniDelay))
  968. AniStart(AniArray, "HomeRightShowVersionList")
  969. '背景处理
  970. panBackBounds = panVersion
  971. panBackHeightChange(panVersion, Nothing)
  972. '收回展开
  973. If Not pathVersionHostOLD.Data.ToString.Equals("M10,1A9,9,0,1,0,10.001,1 M6,8L10,12 14,8") Then panVersionHost_MouseLeftButtonUp(panVersionHostOLD, Nothing)
  974. If Not pathVersionHostSWAP.Data.ToString.Equals("M10,1A9,9,0,1,0,10.001,1 M6,8L10,12 14,8") Then panVersionHost_MouseLeftButtonUp(panVersionHostSWAP, Nothing)
  975. If Not pathVersionHostWRONG.Data.ToString.Equals("M10,1A9,9,0,1,0,10.001,1 M6,8L10,12 14,8") Then panVersionHost_MouseLeftButtonUp(panVersionHostWRONG, Nothing)
  976. '自动展开
  977. If panVersionNORMAL.Children.Count = 0 Then
  978. If Not panVersionSWAP.Children.Count = 0 Then panVersionHost_MouseLeftButtonUp(panVersionHostSWAP, Nothing) : Exit Sub
  979. If Not panVersionOLD.Children.Count = 0 Then panVersionHost_MouseLeftButtonUp(panVersionHostOLD, Nothing) : Exit Sub
  980. If Not panVersionWRONG.Children.Count = 0 Then panVersionHost_MouseLeftButtonUp(panVersionHostWRONG, Nothing) : Exit Sub
  981. End If
  982. '提示信息
  983. If ReadReg("VersionDeleteHint") = "" Then
  984. WriteReg("VersionDeleteHint", "True")
  985. ShowHint("你可以通过右键一个版本进行删除")
  986. End If
  987. Catch ex As Exception
  988. ExShow(ex, "展开版本列表失败", ErrorLevel.Barrier)
  989. End Try
  990. End Sub
  991. Private _SelectVersion As New MCVersion("")
  992. ''' <summary>
  993. ''' 当前选择的MC版本。
  994. ''' </summary>
  995. ''' <remarks></remarks>
  996. Public Property SelectVersion As MCVersion
  997. Get
  998. Return _SelectVersion
  999. End Get
  1000. Set(ByVal value As MCVersion)
  1001. _SelectVersion = value
  1002. labStartButtom.UpdateLayout()
  1003. If Not IsNothing(SelectVersion.Name) Then If StartButtonCurrent = StartButtonState.Normal Then labStartButtom.Content = SelectVersion.Name
  1004. End Set
  1005. End Property
  1006. ''' <summary>
  1007. ''' 将VersionsList的MCVersion对象加载为UI支持库。
  1008. ''' </summary>
  1009. ''' <remarks></remarks>
  1010. Public Sub LoadVersionList()
  1011. log("[HomeRight] UI线程加载版本列表开始")
  1012. panVersion.UpdateLayout() '防止控件未加载导致炸掉
  1013. Try
  1014. '读取应该选择的版本。参数高于历史记录。
  1015. Dim ShouldSelectVersion As String = GetProgramArgument("Version", ReadIni("setup", "History"))
  1016. '清空控件
  1017. panVersionNORMAL.Children.Clear()
  1018. panVersionSWAP.Children.Clear()
  1019. panVersionOLD.Children.Clear()
  1020. panVersionWRONG.Children.Clear()
  1021. panVersionSWAP.Height = 0
  1022. panVersionOLD.Height = 0
  1023. panVersionWRONG.Height = 0
  1024. '添加控件
  1025. For Each VerType As VersionSwapState In VersionsList.Keys
  1026. '获取对应控件
  1027. Dim GridHost As Grid = FindName("panVersionHost" & GetStringFromEnum(VerType))
  1028. Dim LabelHost As Label = FindName("labVersionHost" & GetStringFromEnum(VerType))
  1029. Dim PathHost As Shapes.Path = FindName("pathVersionHost" & GetStringFromEnum(VerType))
  1030. Dim PanelHost As StackPanel = FindName("panVersion" & GetStringFromEnum(VerType))
  1031. '初始化
  1032. If IsNothing(PanelHost) Then GoTo NextKey
  1033. If VersionsList(VerType).Count > 0 Then
  1034. GridHost.Height = 27
  1035. PathHost.Data = (New GeometryConverter).ConvertFromString("M10,1A9,9,0,1,0,10.001,1 M6,8L10,12 14,8")
  1036. Select Case VerType
  1037. Case VersionSwapState.SWAP
  1038. LabelHost.Content = "折叠的版本 (" & VersionsList(VerType).Count & ")"
  1039. PanelHost.Height = 0
  1040. Case VersionSwapState.OLD
  1041. LabelHost.Content = "过时的版本 (" & VersionsList(VerType).Count & ")"
  1042. PanelHost.Height = 0
  1043. Case VersionSwapState.WRONG
  1044. LabelHost.Content = "错误的版本 (" & VersionsList(VerType).Count & ")"
  1045. PanelHost.Height = 0
  1046. End Select
  1047. For Each Ver As MCVersion In VersionsList(VerType)
  1048. '增加控件
  1049. Dim Con = New ListItem With {.Name = "listitemVersion" & GetUUID(), .SubText = Ver.Description, .MainText = Ver.Name, .ShowButton = False, .UseLayoutRounding = True, .AtLeastCheck = False,
  1050. .Logo = New BitmapImage(New Uri(Ver.Logo, UriKind.Absolute)), .Version = Ver, .Opacity = 0, .CanCheck = Not Ver.SwapType = VersionSwapState.WRONG}
  1051. PanelHost.Children.Add(Con)
  1052. '确认历史记录
  1053. If Ver.Name = ShouldSelectVersion Then ChangeVersion(Con, Nothing)
  1054. '增加事件
  1055. AddHandler Con.MouseLeftButtonUp, AddressOf ChangeVersion
  1056. AddHandler Con.MouseRightButtonUp, AddressOf DeleteVersion
  1057. AddHandler Con.MouseEnter, Sub()
  1058. Con.ToolTip = If(Con.labMain.ActualWidth >= Con.ActualWidth - 47, Con.labMain.Content, Nothing)
  1059. End Sub
  1060. Next
  1061. Else
  1062. GridHost.Height = 0
  1063. End If
  1064. NextKey:
  1065. Next
  1066. If SelectVersion.Name = "" Then
  1067. '选择第一项
  1068. For Each List As UIElementCollection In {panVersionNORMAL.Children, panVersionSWAP.Children, panVersionOLD.Children}
  1069. For Each Version In List
  1070. ChangeVersion(Version, Nothing)
  1071. GoTo EndSelect
  1072. Next
  1073. Next
  1074. End If
  1075. EndSelect:
  1076. log("[HomeRight] UI线程加载版本列表结束")
  1077. Catch ex As Exception
  1078. log("[HomeRight] UI线程加载版本列表失败:" & GetStringFromException(ex, True), True)
  1079. ShowHint(New HintConverter("显示版本列表失败:" & GetStringFromException(ex), HintState.Critical))
  1080. Finally
  1081. StartButtonIsLoading = False
  1082. IsPoolVersionListRunning = False
  1083. End Try
  1084. End Sub
  1085. ''' <summary>
  1086. ''' 改变选择的版本。
  1087. ''' </summary>
  1088. ''' <param name="sender"></param>
  1089. ''' <param name="e"></param>
  1090. ''' <remarks></remarks>
  1091. Private Sub ChangeVersion(ByVal sender As ListItem, ByVal e As System.Windows.Input.MouseButtonEventArgs)
  1092. If sender.Version.VersionCheckResult = VersionCheckState.NO_PROBLEM Then
  1093. '选择版本
  1094. If Not IsNothing(e) Then HideVersion() '如果不是代码调用就返回
  1095. For Each Item As ListItem In panVersionNORMAL.Children
  1096. Item.Checked = False
  1097. Next
  1098. For Each Item As ListItem In panVersionOLD.Children
  1099. Item.Checked = False
  1100. Next
  1101. For Each Item As ListItem In panVersionSWAP.Children
  1102. Item.Checked = False
  1103. Next
  1104. sender.Checked = True
  1105. SelectVersion = sender.Version
  1106. log("[HomeRight] 当前选择的MC版本:" & sender.MainText)
  1107. WriteIni("setup", "History", sender.MainText)
  1108. Else
  1109. If IsNothing(e) Then Exit Sub '如果不是代码调用就不提示
  1110. '查看报错原因
  1111. Select Case sender.Version.VersionCheckResult
  1112. Case VersionCheckState.EMPTY_FOLDER
  1113. ShowHint(New HintConverter("不存在任何版本文件,建议删除或重新下载", HintState.Warn))
  1114. Case VersionCheckState.INHERITS_EXCEPTION
  1115. ShowHint(New HintConverter("依赖版本(" & sender.Version.InheritVersion & ")存在问题", HintState.Warn))
  1116. Case VersionCheckState.INHERITS_NOT_EXIST
  1117. ShowHint(New HintConverter("该版本需要依赖版本(" & sender.Version.InheritVersion & ")才能运行", HintState.Warn))
  1118. Case VersionCheckState.JAR_NOT_EXIST
  1119. ShowHint(New HintConverter("未找到版本主文件,建议重新下载安装该版本", HintState.Warn))
  1120. Case VersionCheckState.JSON_CANT_READ
  1121. ShowHint(New HintConverter("Json文件无法读取,建议删除或重新下载", HintState.Warn))
  1122. Case VersionCheckState.JSON_NOT_EXIST
  1123. ShowHint(New HintConverter("Json文件不存在,建议重新下载(较老启动器下载的版本均存在此问题)", HintState.Warn))
  1124. End Select
  1125. End If
  1126. End Sub
  1127. ''' <summary>
  1128. ''' 删除选择的版本。
  1129. ''' </summary>
  1130. Private Sub DeleteVersion(ByVal sender As ListItem, ByVal e As System.Windows.Input.MouseButtonEventArgs)
  1131. If MyMsgbox("你确定要删除这个版本吗?该操作不可撤销!", "删除确认", "确认", "取消", , True) = 1 Then
  1132. Try
  1133. My.Computer.FileSystem.DeleteDirectory(PATH_MC & "versions\" & sender.MainText, FileIO.DeleteDirectoryOption.DeleteAllContents)
  1134. '重新载入
  1135. HideVersion() '返回
  1136. Dim th As New Thread(Sub() PoolVersionList())
  1137. th.Start()
  1138. log("[HomeRight] 删除版本:" & sender.MainText)
  1139. ShowHint(New HintConverter("Minecraft " & sender.MainText & " 删除成功", HintState.Finish))
  1140. Catch ex As Exception
  1141. ExShow(ex, "Minecraft " & sender.MainText & " 删除失败", ErrorLevel.AllUsers)
  1142. End Try
  1143. End If
  1144. End Sub
  1145. '切换显示/隐藏
  1146. Private Sub panVersionHost_MouseLeftButtonUp(ByVal sender As Grid, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles panVersionHostOLD.MouseLeftButtonUp, panVersionHostSWAP.MouseLeftButtonUp, panVersionHostWRONG.MouseLeftButtonUp
  1147. '获取对应控件
  1148. Dim PathHost As Shapes.Path = FindName("pathVersionHost" & sender.Tag)
  1149. Dim PanelHost As StackPanel = FindName("panVersion" & sender.Tag)
  1150. If PathHost.Data.ToString.Equals("M10,1A9,9,0,1,0,10.001,1 M6,8L10,12 14,8") Then
  1151. '未展开
  1152. PathHost.Data = (New GeometryConverter).ConvertFromString("M10,1A9,9,0,1,0,10.001,1 M6,12L10,8 14,12")
  1153. PanelHost.Opacity = 1
  1154. AniStart({
  1155. AaStack(PanelHost),
  1156. AaHeight(PanelHost, PanelHost.Children.Count * 40 - PanelHost.Height, 250, , New AniEaseEnd)
  1157. }, "Show" & sender.Name)
  1158. Else
  1159. '展开
  1160. PathHost.Data = (New GeometryConverter).ConvertFromString("M10,1A9,9,0,1,0,10.001,1 M6,8L10,12 14,8")
  1161. AniStart({
  1162. AaHeight(PanelHost, -PanelHost.ActualHeight, PanelHost.Children.Count * 30, , New AniEaseEnd),
  1163. AaOpacity(PanelHost, 1 - PanelHost.Opacity)
  1164. }, "Show" & sender.Name)
  1165. End If
  1166. End Sub
  1167. '返回
  1168. Public Sub HideVersion() Handles btnVersionBack.MouseLeftButtonUp
  1169. panVersion.IsHitTestVisible = False
  1170. panLaunch.Visibility = Visibility.Visible
  1171. AniStart({
  1172. AaOpacity(panLaunch, 1 - panLaunch.Opacity, 150, 110),
  1173. AaOpacity(panVersion, -panVersion.Opacity, 150),
  1174. AaValue(scrollVersion, -scrollVersion.Value, 1, , , True)
  1175. }, "HomeRightShowVersionList")
  1176. panBackBounds = panLaunch
  1177. panBackHeightChange(panLaunch, Nothing)
  1178. End Sub
  1179. '绑定滚动条
  1180. Private Sub panVersionList_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles panVersionList.Loaded
  1181. If scrollVersion.SetControl(panVersionList, False) Then AddHandler panVersion.MouseWheel, AddressOf scrollVersion.RunMouseWheel
  1182. End Sub
  1183. '背景高度改变
  1184. Private panBackBounds As Grid = panLaunch
  1185. Private Sub panBackHeightChange(ByVal sender As Grid, ByVal e As EventArgs) Handles panVersion.SizeChanged, panLaunch.SizeChanged
  1186. If Not sender.Equals(panBackBounds) Then Exit Sub
  1187. AniStart({
  1188. AaHeight(panBack, sender.ActualHeight - panBack.ActualHeight, 100, , New AniEaseEnd)
  1189. }, "HomeRightpanBackHeightChange")
  1190. End Sub
  1191. #End Region
  1192. '#Region "版本设置 | panSetup"
  1193. ' Private SetupVersion As ListItem '选择的版本
  1194. ' Private CanWrite As Boolean = True '是否可以写入设置
  1195. ' '版本设置
  1196. ' Private Sub VersionSetup(ByVal sender As ListItem, ByVal e As System.Windows.Input.MouseButtonEventArgs)
  1197. ' CanWrite = False
  1198. ' UseControlAnimation = False
  1199. ' '禁止进入其它版本设置
  1200. ' For Each item In lisVer.Children
  1201. ' If item.GetType.Name = "ListItem" Then item.ShowButton = False
  1202. ' Next
  1203. ' '刷新基础信息
  1204. ' SetupVersion = sender
  1205. ' imgSetupLogo.Source = sender.imgLeft.Source
  1206. ' textSetupFolder.Text = sender.MainText
  1207. ' '初始化设置信息
  1208. ' textSetupServer.Text = "无"
  1209. ' textSetupDes.Text = If(SetupVersion.SubText = "", SetupVersion.MainText, SetupVersion.SubText)
  1210. ' checkSetupIcon.Checked = File.Exists(PATH_MC & "\versions\" & SetupVersion.MainText & "\PCL\icon.png")
  1211. ' '刷新设置信息
  1212. ' If File.Exists(PATH_MC & "versions\" & sender.MainText & "\PCL\Setup.ini") Then
  1213. ' Dim cfg As Array = ReadFileToEnd(PATH_MC & "versions\" & sender.MainText & "\PCL\Setup.ini", Encoding.Default).Split(vbCrLf)
  1214. ' '循环每行读取
  1215. ' checkSetupOffline.Checked = ReadIni(PATH_MC & "versions\" & sender.MainText & "\PCL\Setup.ini", "Offline", "False")
  1216. ' textSetupServer.Text = ReadIni(PATH_MC & "versions\" & sender.MainText & "\PCL\Setup.ini", "Server", "")
  1217. ' textSetupDes.Text = ReadIni(PATH_MC & "versions\" & sender.MainText & "\PCL\Setup.ini", "Des", "")
  1218. ' End If
  1219. ' '显示动画
  1220. ' AniStop("VersionShow")
  1221. ' AniStart({
  1222. ' AaCode({"Visible", panSetup, True}),
  1223. ' AaOpacity(panVersion, -1, 200),
  1224. ' AaOpacity(panSetup, 1, 200, 200),
  1225. ' AaCode({"Visible", panVersion, False}, 400),
  1226. ' AaWidth(lineSetup1, 246 - lineSetup1.Width, 400, 300, AniAdditionType.FadeOut),
  1227. ' AaWidth(lineSetup2, 246 - lineSetup2.Width, 400, 300, AniAdditionType.FadeOut)
  1228. ' }, "VersionShow")
  1229. ' CanWrite = True
  1230. ' UseControlAnimation = True
  1231. ' log("[HomeRight] 加载版本设置页面:" & sender.MainText)
  1232. ' End Sub
  1233. ' '重命名
  1234. ' Private Sub textSetupFolder_TextChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles textSetupFolder.TextChanged
  1235. ' '如果变更了名字就显示确认按钮
  1236. ' If Not IsNothing(SetupVersion) Then
  1237. ' AniStop("SetupRename")
  1238. ' AniStart({
  1239. ' AaCode({"Visible", btnSetupDelete, True}),
  1240. ' AaOpacity(btnSetupFolderEnter, If(textSetupFolder.Text = SetupVersion.MainText, 0, 0.7) - btnSetupFolderEnter.Opacity, 200)
  1241. ' }, "SetupRename")
  1242. ' End If
  1243. ' End Sub
  1244. ' Private Sub textSetupFolder_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles textSetupFolder.KeyUp
  1245. ' '回车处理
  1246. ' If e.Key = Key.Enter Then btnSetupFolderEnter_MouseUp(sender, Nothing)
  1247. ' End Sub
  1248. ' Private Sub btnSetupFolderEnter_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles btnSetupFolderEnter.MouseUp
  1249. ' If btnSetupFolderEnter.Opacity > 0.1 Then '已经显示这个按钮(0.1是因为浮点运算bug)
  1250. ' If MyMsgbox("重命名", "你确定要重命名这个版本吗?重命名后可能会导致游戏无法启动!", , "取消") = 1 Then
  1251. ' Try
  1252. ' log("[HomeRight] 重命名版本:" & textSetupFolder.Text)
  1253. ' '重命名主文件夹
  1254. ' Dim BaseDir As String = PATH_MC & "versions\" & textSetupFolder.Text
  1255. ' Microsoft.VisualBasic.FileSystem.Rename(SetupVersion.Version.Folder, BaseDir)
  1256. ' '重命名Json
  1257. ' Using Writter As New StreamWriter(BaseDir & "\" & textSetupFolder.Text & ".json", False)
  1258. ' Writter.Write(ReadFileToEnd(BaseDir & "\" & SetupVersion.MainText & ".json").Replace("""id"": """ & SetupVersion.MainText, """id"": """ & textSetupFolder.Text))
  1259. ' Writter.Flush()
  1260. ' End Using
  1261. ' File.Delete(BaseDir & "\" & SetupVersion.MainText & ".json")
  1262. ' '重命名Jar
  1263. ' If File.Exists(BaseDir & "\" & textSetupFolder.Text & ".jar") Then
  1264. ' File.Delete(BaseDir & "\" & textSetupFolder.Text & ".jar")
  1265. ' Microsoft.VisualBasic.FileSystem.Rename(BaseDir & "\" & SetupVersion.MainText & ".jar", BaseDir & "\" & textSetupFolder.Text & ".jar")
  1266. ' End If
  1267. ' '重命名natives
  1268. ' If Directory.Exists(BaseDir & "\" & SetupVersion.MainText & "-natives") Then Microsoft.VisualBasic.FileSystem.Rename(BaseDir & "\" & SetupVersion.MainText & "-natives", BaseDir & "\" & textSetupFolder.Text & "-natives")
  1269. ' Catch ex As Exception
  1270. ' log("[HomeRight] 重命名版本失败:" & GetStringFromException(ex, True), True)
  1271. ' MyMsgbox("重命名失败", "详细的错误信息:" & GetStringFromException(ex) & vbCrLf & "该版本可能已经损坏。")
  1272. ' End Try
  1273. ' '重命名结束处理
  1274. ' btnSetupBack_MouseUp() '返回版本列表
  1275. ' LoadVersionList() '重新加载版本列表
  1276. ' End If
  1277. ' End If
  1278. ' End Sub
  1279. ' '自定义图标
  1280. ' Private Sub checkSetupIcon_MouseUp() Handles checkSetupIcon.MouseUp
  1281. ' If checkSetupIcon.Checked Then
  1282. ' '试图启用自定义图标
  1283. ' Dim fileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif;*.jpeg)|*.png;*.jpg;*.gif;*.jpeg", "选择作为图标的文件")
  1284. ' '选择文件结束
  1285. ' If fileName = "" Then checkSetupIcon.Checked = False : Exit Sub
  1286. ' Try
  1287. ' '设置当前显示
  1288. ' imgSetupLogo.Source = (New ImageSourceConverter).ConvertFromString(fileName)
  1289. ' SetupVersion.Logo = (New ImageSourceConverter).ConvertFromString(fileName)
  1290. ' '拷贝文件
  1291. ' File.Delete(PATH_MC & "versions\" & SetupVersion.MainText & "\PCL\icon.png")
  1292. ' File.Copy(fileName, PATH_MC & "versions\" & SetupVersion.MainText & "\PCL\icon.png")
  1293. ' Catch ex As Exception
  1294. ' '清除只需要改变Checked,会自动调用禁用代码
  1295. ' checkSetupIcon.Checked = False
  1296. ' End Try
  1297. ' Else
  1298. ' '还原当前显示
  1299. ' Select Case SetupVersion.Version.Type
  1300. ' Case MCVersionType.FORGE
  1301. ' imgSetupLogo.Source = New BitmapImage(New Uri("/Images/Block-Anvil.png", UriKind.Relative))
  1302. ' SetupVersion.Logo = New BitmapImage(New Uri("/Images/Block-Anvil.png", UriKind.Relative))
  1303. ' Case MCVersionType.OLD
  1304. ' imgSetupLogo.Source = New BitmapImage(New Uri("/Images/Block-CobbleStone.png", UriKind.Relative))
  1305. ' SetupVersion.Logo = New BitmapImage(New Uri("/Images/Block-CobbleStone.png", UriKind.Relative))
  1306. ' Case MCVersionType.SNAPSHOT
  1307. ' imgSetupLogo.Source = New BitmapImage(New Uri("/Images/Block-CommandBlock.png", UriKind.Relative))
  1308. ' SetupVersion.Logo = New BitmapImage(New Uri("/Images/Block-CommandBlock.png", UriKind.Relative))
  1309. ' Case Else 'OptiFine、原版、未知
  1310. ' imgSetupLogo.Source = New BitmapImage(New Uri("/Images/Block-Grass.png", UriKind.Relative))
  1311. ' SetupVersion.Logo = New BitmapImage(New Uri("/Images/Block-Grass.png", UriKind.Relative))
  1312. ' End Select
  1313. ' '删除
  1314. ' File.Delete(PATH_MC & "versions\" & SetupVersion.MainText & "\PCL\icon.png")
  1315. ' End If
  1316. ' End Sub
  1317. ' Private Sub imgSetupLogo_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles imgSetupLogo.MouseUp
  1318. ' '试图启用自定义图标
  1319. ' Dim fileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif;*.jpeg)|*.png;*.jpg;*.gif;*.jpeg", "选择作为图标的文件")
  1320. ' '选择文件结束
  1321. ' If fileName = "" Then Exit Sub
  1322. ' '选择了一个文件
  1323. ' Try
  1324. ' '设置当前显示
  1325. ' imgSetupLogo.Source = (New ImageSourceConverter).ConvertFromString(fileName)
  1326. ' SetupVersion.Logo = (New ImageSourceConverter).ConvertFromString(fileName)
  1327. ' '拷贝文件
  1328. ' File.Delete(PATH_MC & "versions\" & SetupVersion.MainText & "\PCL\icon.png")
  1329. ' File.Copy(fileName, PATH_MC & "versions\" & SetupVersion.MainText & "\PCL\icon.png")
  1330. ' checkSetupIcon.Checked = True
  1331. ' Catch ex As Exception
  1332. ' checkSetupIcon.Checked = False
  1333. ' '还原当前显示
  1334. ' Select Case SetupVersion.Version.Type
  1335. ' Case MCVersionType.FORGE
  1336. ' imgSetupLogo.Source = New BitmapImage(New Uri("/Images/Block-Anvil.png", UriKind.Relative))
  1337. ' SetupVersion.Logo = New BitmapImage(New Uri("/Images/Block-Anvil.png", UriKind.Relative))
  1338. ' Case MCVersionType.OLD
  1339. ' imgSetupLogo.Source = New BitmapImage(New Uri("/Images/Block-CobbleStone.png", UriKind.Relative))
  1340. ' SetupVersion.Logo = New BitmapImage(New Uri("/Images/Block-CobbleStone.png", UriKind.Relative))
  1341. ' Case MCVersionType.SNAPSHOT
  1342. ' imgSetupLogo.Source = New BitmapImage(New Uri("/Images/Block-CommandBlock.png", UriKind.Relative))
  1343. ' SetupVersion.Logo = New BitmapImage(New Uri("/Images/Block-CommandBlock.png", UriKind.Relative))
  1344. ' Case Else 'OptiFine、原版、未知
  1345. ' imgSetupLogo.Source = New BitmapImage(New Uri("/Images/Block-Grass.png", UriKind.Relative))
  1346. ' SetupVersion.Logo = New BitmapImage(New Uri("/Images/Block-Grass.png", UriKind.Relative))
  1347. ' End Select
  1348. ' '删除
  1349. ' File.Delete(PATH_MC & "versions\" & SetupVersion.MainText & "\PCL\icon.png")
  1350. ' End Try
  1351. ' End Sub
  1352. ' '自定义描述
  1353. ' Private Sub textSetupDes_TextChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles textSetupDes.TextChanged
  1354. ' If CanWrite Then
  1355. ' '改变当前显示
  1356. ' SetupVersion.SubText = If(textSetupDes.Text = SetupVersion.MainText, "", textSetupDes.Text)
  1357. ' End If
  1358. ' End Sub
  1359. ' '写入设置
  1360. ' Public Sub SetupWrite() Handles checkSetupOffline.MouseUp, textSetupServer.TextChanged, textSetupDes.TextChanged
  1361. ' If CanWrite Then
  1362. ' Using iniWriter As New StreamWriter(PATH_MC & "versions\" & SetupVersion.MainText & "\PCL\Setup.ini", False, Encoding.Unicode)
  1363. ' iniWriter.WriteLine()
  1364. ' iniWriter.WriteLine("Offline:" & checkSetupOffline.Checked)
  1365. ' iniWriter.WriteLine("Des:" & textSetupDes.Text)
  1366. ' iniWriter.WriteLine("Server:" & If(Len(textSetupServer.Text) < 5, "无", textSetupServer.Text))
  1367. ' iniWriter.Flush()
  1368. ' End Using
  1369. ' End If
  1370. ' End Sub
  1371. ' '返回
  1372. ' Private Sub btnSetupBack_MouseUp() Handles btnSetupBack.MouseUp
  1373. ' '允许进入其它版本设置
  1374. ' For Each item In lisVer.Children
  1375. ' If item.GetType.Name = "ListItem" Then item.ShowButton = True
  1376. ' Next
  1377. ' '显示动画
  1378. ' AniStop("VersionShow")
  1379. ' AniStart({
  1380. ' AaCode({"Visible", panVersion, True}),
  1381. ' AaOpacity(panSetup, -1, 200),
  1382. ' AaOpacity(panVersion, 1, 200, 200),
  1383. ' AaCode({"Visible", panSetup, False}, 400),
  1384. ' AaWidth(lineSetup1, -lineSetup1.Width, 0, 400),
  1385. ' AaWidth(lineSetup2, -lineSetup2.Width, 0, 400)
  1386. ' }, "VersionShow")
  1387. ' End Sub
  1388. ' '高级版本设置
  1389. ' Private Sub btnSetupAdvance_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSetupAdvance.Click
  1390. ' Dim setupPage As New msgVersion(SetupVersion.Version)
  1391. ' If Not IsNothing(setupPage.panMain.Parent) Then setupPage.panMain.Parent.SetValue(ContentPresenter.ContentProperty, Nothing)
  1392. ' MyMsgbox("高级版本设置", setupPage.panMain, "完成")
  1393. ' LoadVersionList()
  1394. ' End Sub
  1395. '#End Region
  1396. End Class