minecraft-src/net/minecraft/client/quickplay/QuickPlay.java
2025-09-18 12:27:44 +00:00

139 lines
6.1 KiB
Java

package net.minecraft.client.quickplay;
import com.mojang.logging.LogUtils;
import com.mojang.realmsclient.RealmsMainScreen;
import com.mojang.realmsclient.client.RealmsClient;
import com.mojang.realmsclient.dto.RealmsServer;
import com.mojang.realmsclient.dto.RealmsServerList;
import com.mojang.realmsclient.exception.RealmsServiceException;
import com.mojang.realmsclient.gui.screens.RealmsLongRunningMcoTaskScreen;
import com.mojang.realmsclient.util.task.GetServerDetailsTask;
import java.util.List;
import java.util.concurrent.ExecutionException;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.ConnectScreen;
import net.minecraft.client.gui.screens.DisconnectedScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen;
import net.minecraft.client.gui.screens.worldselection.SelectWorldScreen;
import net.minecraft.client.main.GameConfig;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.ServerList;
import net.minecraft.client.multiplayer.resolver.ServerAddress;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.network.chat.Component;
import net.minecraft.util.StringUtil;
import net.minecraft.world.level.storage.LevelStorageSource;
import net.minecraft.world.level.storage.LevelSummary;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
@Environment(EnvType.CLIENT)
public class QuickPlay {
private static final Logger LOGGER = LogUtils.getLogger();
public static final Component ERROR_TITLE = Component.translatable("quickplay.error.title");
private static final Component INVALID_IDENTIFIER = Component.translatable("quickplay.error.invalid_identifier");
private static final Component REALM_CONNECT = Component.translatable("quickplay.error.realm_connect");
private static final Component REALM_PERMISSION = Component.translatable("quickplay.error.realm_permission");
private static final Component TO_TITLE = Component.translatable("gui.toTitle");
private static final Component TO_WORLD_LIST = Component.translatable("gui.toWorld");
private static final Component TO_REALMS_LIST = Component.translatable("gui.toRealms");
public static void connect(Minecraft minecraft, GameConfig.QuickPlayVariant variant, RealmsClient client) {
if (!variant.isEnabled()) {
LOGGER.error("Quick play disabled");
minecraft.setScreen(new TitleScreen());
} else {
switch (variant) {
case GameConfig.QuickPlayMultiplayerData quickPlayMultiplayerData:
joinMultiplayerWorld(minecraft, quickPlayMultiplayerData.serverAddress());
break;
case GameConfig.QuickPlayRealmsData quickPlayRealmsData:
joinRealmsWorld(minecraft, client, quickPlayRealmsData.realmId());
break;
case GameConfig.QuickPlaySinglePlayerData quickPlaySinglePlayerData:
String string = quickPlaySinglePlayerData.worldId();
if (StringUtil.isBlank(string)) {
string = getLatestSingleplayerWorld(minecraft.getLevelSource());
}
joinSingleplayerWorld(minecraft, string);
break;
case GameConfig.QuickPlayDisabled quickPlayDisabled:
LOGGER.error("Quick play disabled");
minecraft.setScreen(new TitleScreen());
break;
default:
throw new MatchException(null, null);
}
}
}
@Nullable
private static String getLatestSingleplayerWorld(LevelStorageSource levelSource) {
try {
List<LevelSummary> list = (List<LevelSummary>)levelSource.loadLevelSummaries(levelSource.findLevelCandidates()).get();
if (list.isEmpty()) {
LOGGER.warn("no latest singleplayer world found");
return null;
} else {
return ((LevelSummary)list.getFirst()).getLevelId();
}
} catch (ExecutionException | InterruptedException var2) {
LOGGER.error("failed to load singleplayer world summaries", (Throwable)var2);
return null;
}
}
private static void joinSingleplayerWorld(Minecraft minecraft, @Nullable String levelName) {
if (!StringUtil.isBlank(levelName) && minecraft.getLevelSource().levelExists(levelName)) {
minecraft.createWorldOpenFlows().openWorld(levelName, () -> minecraft.setScreen(new TitleScreen()));
} else {
Screen screen = new SelectWorldScreen(new TitleScreen());
minecraft.setScreen(new DisconnectedScreen(screen, ERROR_TITLE, INVALID_IDENTIFIER, TO_WORLD_LIST));
}
}
private static void joinMultiplayerWorld(Minecraft minecraft, String ip) {
ServerList serverList = new ServerList(minecraft);
serverList.load();
ServerData serverData = serverList.get(ip);
if (serverData == null) {
serverData = new ServerData(I18n.get("selectServer.defaultName"), ip, ServerData.Type.OTHER);
serverList.add(serverData, true);
serverList.save();
}
ServerAddress serverAddress = ServerAddress.parseString(ip);
ConnectScreen.startConnecting(new JoinMultiplayerScreen(new TitleScreen()), minecraft, serverAddress, serverData, true, null);
}
private static void joinRealmsWorld(Minecraft minecraft, RealmsClient realmsClient, String serverId) {
long l;
RealmsServerList realmsServerList;
try {
l = Long.parseLong(serverId);
realmsServerList = realmsClient.listRealms();
} catch (NumberFormatException var8) {
Screen screen = new RealmsMainScreen(new TitleScreen());
minecraft.setScreen(new DisconnectedScreen(screen, ERROR_TITLE, INVALID_IDENTIFIER, TO_REALMS_LIST));
return;
} catch (RealmsServiceException var9) {
Screen screenx = new TitleScreen();
minecraft.setScreen(new DisconnectedScreen(screenx, ERROR_TITLE, REALM_CONNECT, TO_TITLE));
return;
}
RealmsServer realmsServer = (RealmsServer)realmsServerList.servers.stream().filter(realmsServerx -> realmsServerx.id == l).findFirst().orElse(null);
if (realmsServer == null) {
Screen screen = new RealmsMainScreen(new TitleScreen());
minecraft.setScreen(new DisconnectedScreen(screen, ERROR_TITLE, REALM_PERMISSION, TO_REALMS_LIST));
} else {
TitleScreen titleScreen = new TitleScreen();
minecraft.setScreen(new RealmsLongRunningMcoTaskScreen(titleScreen, new GetServerDetailsTask(titleScreen, realmsServer)));
}
}
}