在陶瓦联机界面启动游戏时禁用离线皮肤功能 (#4916)
This commit is contained in:
@@ -387,7 +387,7 @@ public final class HMCLGameRepository extends DefaultGameRepository {
|
|||||||
vs.setUsesGlobal(true);
|
vs.setUsesGlobal(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public LaunchOptions getLaunchOptions(String version, JavaRuntime javaVersion, Path gameDir, List<String> javaAgents, List<String> javaArguments, boolean makeLaunchScript) {
|
public LaunchOptions.Builder getLaunchOptions(String version, JavaRuntime javaVersion, Path gameDir, List<String> javaAgents, List<String> javaArguments, boolean makeLaunchScript) {
|
||||||
VersionSetting vs = getVersionSetting(version);
|
VersionSetting vs = getVersionSetting(version);
|
||||||
|
|
||||||
LaunchOptions.Builder builder = new LaunchOptions.Builder()
|
LaunchOptions.Builder builder = new LaunchOptions.Builder()
|
||||||
@@ -461,7 +461,7 @@ public final class HMCLGameRepository extends DefaultGameRepository {
|
|||||||
if (vs.isAutoMemory() && builder.getJavaArguments().stream().anyMatch(it -> it.startsWith("-Xmx")))
|
if (vs.isAutoMemory() && builder.getJavaArguments().stream().anyMatch(it -> it.startsWith("-Xmx")))
|
||||||
builder.setMaxMemory(null);
|
builder.setMaxMemory(null);
|
||||||
|
|
||||||
return builder.create();
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import javafx.stage.Stage;
|
|||||||
import org.jackhuang.hmcl.Launcher;
|
import org.jackhuang.hmcl.Launcher;
|
||||||
import org.jackhuang.hmcl.auth.*;
|
import org.jackhuang.hmcl.auth.*;
|
||||||
import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorDownloadException;
|
import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorDownloadException;
|
||||||
|
import org.jackhuang.hmcl.auth.offline.OfflineAccount;
|
||||||
import org.jackhuang.hmcl.download.DefaultDependencyManager;
|
import org.jackhuang.hmcl.download.DefaultDependencyManager;
|
||||||
import org.jackhuang.hmcl.download.DownloadProvider;
|
import org.jackhuang.hmcl.download.DownloadProvider;
|
||||||
import org.jackhuang.hmcl.download.LibraryAnalyzer;
|
import org.jackhuang.hmcl.download.LibraryAnalyzer;
|
||||||
@@ -81,6 +82,7 @@ public final class LauncherHelper {
|
|||||||
private final VersionSetting setting;
|
private final VersionSetting setting;
|
||||||
private LauncherVisibility launcherVisibility;
|
private LauncherVisibility launcherVisibility;
|
||||||
private boolean showLogs;
|
private boolean showLogs;
|
||||||
|
private boolean disableOfflineSkin = false;
|
||||||
|
|
||||||
public LauncherHelper(Profile profile, Account account, String selectedVersion) {
|
public LauncherHelper(Profile profile, Account account, String selectedVersion) {
|
||||||
this.profile = Objects.requireNonNull(profile);
|
this.profile = Objects.requireNonNull(profile);
|
||||||
@@ -111,6 +113,10 @@ public final class LauncherHelper {
|
|||||||
launcherVisibility = LauncherVisibility.KEEP;
|
launcherVisibility = LauncherVisibility.KEEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setDisableOfflineSkin() {
|
||||||
|
disableOfflineSkin = true;
|
||||||
|
}
|
||||||
|
|
||||||
public void launch() {
|
public void launch() {
|
||||||
FXUtils.checkFxUserThread();
|
FXUtils.checkFxUserThread();
|
||||||
|
|
||||||
@@ -188,8 +194,12 @@ public final class LauncherHelper {
|
|||||||
.thenComposeAsync(() -> gameVersion.map(s -> new GameVerificationFixTask(dependencyManager, s, version.get())).orElse(null))
|
.thenComposeAsync(() -> gameVersion.map(s -> new GameVerificationFixTask(dependencyManager, s, version.get())).orElse(null))
|
||||||
.thenComposeAsync(() -> logIn(account).withStage("launch.state.logging_in"))
|
.thenComposeAsync(() -> logIn(account).withStage("launch.state.logging_in"))
|
||||||
.thenComposeAsync(authInfo -> Task.supplyAsync(() -> {
|
.thenComposeAsync(authInfo -> Task.supplyAsync(() -> {
|
||||||
LaunchOptions launchOptions = repository.getLaunchOptions(
|
LaunchOptions.Builder launchOptionsBuilder = repository.getLaunchOptions(
|
||||||
selectedVersion, javaVersionRef.get(), profile.getGameDir(), javaAgents, javaArguments, scriptFile != null);
|
selectedVersion, javaVersionRef.get(), profile.getGameDir(), javaAgents, javaArguments, scriptFile != null);
|
||||||
|
if (disableOfflineSkin) {
|
||||||
|
launchOptionsBuilder.setDaemon(false);
|
||||||
|
}
|
||||||
|
LaunchOptions launchOptions = launchOptionsBuilder.create();
|
||||||
|
|
||||||
LOG.info("Here's the structure of game mod directory:\n" + FileUtils.printFileStructure(repository.getModsDirectory(selectedVersion), 10));
|
LOG.info("Here's the structure of game mod directory:\n" + FileUtils.printFileStructure(repository.getModsDirectory(selectedVersion), 10));
|
||||||
|
|
||||||
@@ -639,9 +649,12 @@ public final class LauncherHelper {
|
|||||||
return future;
|
return future;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Task<AuthInfo> logIn(Account account) {
|
private Task<AuthInfo> logIn(Account account) {
|
||||||
return Task.composeAsync(() -> {
|
return Task.composeAsync(() -> {
|
||||||
try {
|
try {
|
||||||
|
if (disableOfflineSkin && account instanceof OfflineAccount offlineAccount)
|
||||||
|
return Task.completed(offlineAccount.logInWithoutSkin());
|
||||||
|
else
|
||||||
return Task.completed(account.logIn());
|
return Task.completed(account.logIn());
|
||||||
} catch (CredentialExpiredException e) {
|
} catch (CredentialExpiredException e) {
|
||||||
LOG.info("Credential has expired", e);
|
LOG.info("Credential has expired", e);
|
||||||
|
|||||||
@@ -232,7 +232,10 @@ public class TerracottaControllerPage extends StackPane {
|
|||||||
MessageDialogPane.MessageType.QUESTION
|
MessageDialogPane.MessageType.QUESTION
|
||||||
).addAction(i18n("version.launch"), () -> {
|
).addAction(i18n("version.launch"), () -> {
|
||||||
Profile profile = Profiles.getSelectedProfile();
|
Profile profile = Profiles.getSelectedProfile();
|
||||||
Versions.launch(profile, profile.getSelectedVersion(), LauncherHelper::setKeep);
|
Versions.launch(profile, profile.getSelectedVersion(), launcherHelper -> {
|
||||||
|
launcherHelper.setKeep();
|
||||||
|
launcherHelper.setDisableOfflineSkin();
|
||||||
|
});
|
||||||
}).addCancel(i18n("terracotta.status.waiting.host.launch.skip"), () -> {
|
}).addCancel(i18n("terracotta.status.waiting.host.launch.skip"), () -> {
|
||||||
TerracottaState.HostScanning s1 = TerracottaManager.setScanning();
|
TerracottaState.HostScanning s1 = TerracottaManager.setScanning();
|
||||||
if (s1 != null) {
|
if (s1 != null) {
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import javafx.geometry.Insets;
|
|||||||
import javafx.scene.layout.BorderPane;
|
import javafx.scene.layout.BorderPane;
|
||||||
import javafx.scene.layout.Priority;
|
import javafx.scene.layout.Priority;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
import org.jackhuang.hmcl.game.LauncherHelper;
|
|
||||||
import org.jackhuang.hmcl.setting.Profile;
|
import org.jackhuang.hmcl.setting.Profile;
|
||||||
import org.jackhuang.hmcl.setting.Profiles;
|
import org.jackhuang.hmcl.setting.Profiles;
|
||||||
import org.jackhuang.hmcl.terracotta.TerracottaMetadata;
|
import org.jackhuang.hmcl.terracotta.TerracottaMetadata;
|
||||||
@@ -71,7 +70,10 @@ public class TerracottaPage extends DecoratorAnimatedPage implements DecoratorPa
|
|||||||
AdvancedListBox toolbar = new AdvancedListBox()
|
AdvancedListBox toolbar = new AdvancedListBox()
|
||||||
.addNavigationDrawerItem(i18n("version.launch"), SVG.ROCKET_LAUNCH, () -> {
|
.addNavigationDrawerItem(i18n("version.launch"), SVG.ROCKET_LAUNCH, () -> {
|
||||||
Profile profile = Profiles.getSelectedProfile();
|
Profile profile = Profiles.getSelectedProfile();
|
||||||
Versions.launch(profile, profile.getSelectedVersion(), LauncherHelper::setKeep);
|
Versions.launch(profile, profile.getSelectedVersion(), launcherHelper -> {
|
||||||
|
launcherHelper.setKeep();
|
||||||
|
launcherHelper.setDisableOfflineSkin();
|
||||||
|
});
|
||||||
}, item -> {
|
}, item -> {
|
||||||
instanceChangeListenerHolder = FXUtils.onWeakChangeAndOperate(Profiles.selectedVersionProperty(),
|
instanceChangeListenerHolder = FXUtils.onWeakChangeAndOperate(Profiles.selectedVersionProperty(),
|
||||||
instanceName -> item.setSubtitle(StringUtils.isNotBlank(instanceName) ? instanceName : i18n("version.empty"))
|
instanceName -> item.setSubtitle(StringUtils.isNotBlank(instanceName) ? instanceName : i18n("version.empty"))
|
||||||
|
|||||||
@@ -103,10 +103,14 @@ public class OfflineAccount extends Account {
|
|||||||
return skin != null && skin.getType() != Skin.Type.DEFAULT;
|
return skin != null && skin.getType() != Skin.Type.DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AuthInfo logInWithoutSkin() throws AuthenticationException {
|
||||||
|
// Using "legacy" user type here because "mojang" user type may cause "invalid session token" or "disconnected" when connecting to a game server.
|
||||||
|
return new AuthInfo(username, uuid, UUIDTypeAdapter.fromUUID(UUID.randomUUID()), AuthInfo.USER_TYPE_MSA, "{}");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AuthInfo logIn() throws AuthenticationException {
|
public AuthInfo logIn() throws AuthenticationException {
|
||||||
// Using "legacy" user type here because "mojang" user type may cause "invalid session token" or "disconnected" when connecting to a game server.
|
AuthInfo authInfo = logInWithoutSkin();
|
||||||
AuthInfo authInfo = new AuthInfo(username, uuid, UUIDTypeAdapter.fromUUID(UUID.randomUUID()), AuthInfo.USER_TYPE_MSA, "{}");
|
|
||||||
|
|
||||||
if (loadAuthlibInjector(skin)) {
|
if (loadAuthlibInjector(skin)) {
|
||||||
CompletableFuture<AuthlibInjectorArtifactInfo> artifactTask = CompletableFuture.supplyAsync(() -> {
|
CompletableFuture<AuthlibInjectorArtifactInfo> artifactTask = CompletableFuture.supplyAsync(() -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user