From a70e53364d519dcaa191682f832809cb79358bb3 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sun, 30 Oct 2022 13:43:38 +0800 Subject: [PATCH] fix(multiplayer): force using authlib-injector in multiplayer mode. --- .../jackhuang/hmcl/game/LauncherHelper.java | 10 +++++- .../MultiplayerOfflineAccount.java | 36 +++++++++++++++++++ .../hmcl/ui/multiplayer/MultiplayerPage.java | 22 ++++++++++++ .../ui/multiplayer/MultiplayerPageSkin.java | 7 +--- .../hmcl/auth/offline/OfflineAccount.java | 9 +++-- 5 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerOfflineAccount.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 7b74187ca..d53cc4c6e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -72,7 +72,7 @@ import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class LauncherHelper { private final Profile profile; - private final Account account; + private Account account; private final String selectedVersion; private File scriptFile; private final VersionSetting setting; @@ -91,6 +91,14 @@ public final class LauncherHelper { private final TaskExecutorDialogPane launchingStepsPane = new TaskExecutorDialogPane(TaskCancellationAction.NORMAL); + public Account getAccount() { + return account; + } + + public void setAccount(Account account) { + this.account = account; + } + public void setTestMode() { launcherVisibility = LauncherVisibility.KEEP; showLogs = true; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerOfflineAccount.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerOfflineAccount.java new file mode 100644 index 000000000..b02569961 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerOfflineAccount.java @@ -0,0 +1,36 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2022 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.ui.multiplayer; + +import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorArtifactProvider; +import org.jackhuang.hmcl.auth.offline.OfflineAccount; +import org.jackhuang.hmcl.auth.offline.Skin; + +import java.util.UUID; + +public class MultiplayerOfflineAccount extends OfflineAccount { + + public MultiplayerOfflineAccount(AuthlibInjectorArtifactProvider downloader, String username, UUID uuid, Skin skin) { + super(downloader, username, uuid, skin); + } + + @Override + protected boolean loadAuthlibInjector(Skin skin) { + return true; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java index 9312c9eda..b26ab6905 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java @@ -22,14 +22,19 @@ import com.jfoenix.controls.JFXDialogLayout; import javafx.beans.property.*; import javafx.scene.control.Label; import javafx.scene.control.Skin; +import org.jackhuang.hmcl.auth.Account; +import org.jackhuang.hmcl.auth.offline.OfflineAccount; import org.jackhuang.hmcl.event.Event; import org.jackhuang.hmcl.setting.DownloadProviders; +import org.jackhuang.hmcl.setting.Profile; +import org.jackhuang.hmcl.setting.Profiles; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.ui.decorator.DecoratorAnimatedPage; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; +import org.jackhuang.hmcl.ui.versions.Versions; import org.jackhuang.hmcl.util.HMCLService; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.TaskCancellationAction; @@ -135,6 +140,23 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP return session.getReadOnlyProperty(); } + void launchGame() { + Profile profile = Profiles.getSelectedProfile(); + Versions.launch(profile, profile.getSelectedVersion(), (launcherHelper) -> { + launcherHelper.setKeep(); + Account account = launcherHelper.getAccount(); + if (account instanceof OfflineAccount && !(account instanceof MultiplayerOfflineAccount)) { + OfflineAccount offlineAccount = (OfflineAccount) account; + launcherHelper.setAccount(new MultiplayerOfflineAccount( + offlineAccount.getDownloader(), + offlineAccount.getUsername(), + offlineAccount.getUUID(), + offlineAccount.getSkin() + )); + } + }); + } + private void checkAgreement(Runnable runnable) { if (globalConfig().getMultiplayerAgreementVersion() < MultiplayerManager.HIPER_AGREEMENT_VERSION) { JFXDialogLayout agreementPane = new JFXDialogLayout(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPageSkin.java index 7b7ab7db3..42b4b0ef8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPageSkin.java @@ -33,9 +33,6 @@ import javafx.scene.control.ScrollPane; import javafx.scene.layout.*; import javafx.stage.FileChooser; import javafx.util.StringConverter; -import org.jackhuang.hmcl.game.LauncherHelper; -import org.jackhuang.hmcl.setting.Profile; -import org.jackhuang.hmcl.setting.Profiles; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; @@ -43,7 +40,6 @@ import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.ui.construct.MessageDialogPane.MessageType; import org.jackhuang.hmcl.ui.decorator.DecoratorAnimatedPage; -import org.jackhuang.hmcl.ui.versions.Versions; import org.jackhuang.hmcl.util.HMCLService; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; @@ -80,8 +76,7 @@ public class MultiplayerPageSkin extends DecoratorAnimatedPage.DecoratorAnimated item.setTitle(i18n("version.launch")); item.setLeftGraphic(wrap(SVG::rocketLaunchOutline)); item.setOnAction(e -> { - Profile profile = Profiles.getSelectedProfile(); - Versions.launch(profile, profile.getSelectedVersion(), LauncherHelper::setKeep); + control.launchGame(); }); }) .startCategory(i18n("help")) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/OfflineAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/OfflineAccount.java index 2e7214186..3bbbabad9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/OfflineAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/OfflineAccount.java @@ -67,6 +67,10 @@ public class OfflineAccount extends Account { } } + public AuthlibInjectorArtifactProvider getDownloader() { + return downloader; + } + @Override public UUID getUUID() { return uuid; @@ -91,7 +95,7 @@ public class OfflineAccount extends Account { invalidate(); } - private boolean loadAuthlibInjector(Skin skin) { + protected boolean loadAuthlibInjector(Skin skin) { if (skin == null) return false; if (skin.getType() == Skin.Type.DEFAULT) return false; TextureModel defaultModel = TextureModel.detectUUID(getUUID()); @@ -158,7 +162,8 @@ public class OfflineAccount extends Account { server.start(); try { - server.addCharacter(new YggdrasilServer.Character(uuid, username, skin.load(username).run())); + server.addCharacter(new YggdrasilServer.Character(uuid, username, + skin != null ? skin.load(username).run() : null)); } catch (IOException e) { // ignore } catch (Exception e) {