GetServerDetailsTask.java

com.mojang.realmsclient.util.task.GetServerDetailsTask

信息

  • 全限定名:com.mojang.realmsclient.util.task.GetServerDetailsTask
  • 类型:public class
  • 包:com.mojang.realmsclient.util.task
  • 源码路径:src/main/java/com/mojang/realmsclient/util/task/GetServerDetailsTask.java
  • 起始行号:L34
  • 继承:LongRunningTask
  • 职责:

    TODO

字段/常量

  • APPLYING_PACK_TEXT

    • 类型: Component
    • 修饰符: private static final
    • 源码定位: L35
    • 说明:

      TODO

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L36
    • 说明:

      TODO

  • TITLE

    • 类型: Component
    • 修饰符: private static final
    • 源码定位: L37
    • 说明:

      TODO

  • server

    • 类型: RealmsServer
    • 修饰符: private final
    • 源码定位: L38
    • 说明:

      TODO

  • lastScreen

    • 类型: Screen
    • 修饰符: private final
    • 源码定位: L39
    • 说明:

      TODO

内部类/嵌套类型

构造器

public GetServerDetailsTask(Screen lastScreen, RealmsServer server) @ L41

  • 构造器名:GetServerDetailsTask
  • 源码定位:L41
  • 修饰符:public

参数:

  • lastScreen: Screen
  • server: RealmsServer

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void run() @ L46

  • 方法名:run
  • 源码定位:L46
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

private static UUID generatePackId(RealmsServer serverData) @ L96

  • 方法名:generatePackId
  • 源码定位:L96
  • 返回类型:UUID
  • 修饰符:private static

参数:

  • serverData: RealmsServer

说明:

TODO

public Component getTitle() @ L104

  • 方法名:getTitle
  • 源码定位:L104
  • 返回类型:Component
  • 修饰符:public

参数:

说明:

TODO

private RealmsJoinInformation fetchServerAddress() @ L109

  • 方法名:fetchServerAddress
  • 源码定位:L109
  • 返回类型:RealmsJoinInformation
  • 修饰符:private

参数:

说明:

TODO

public RealmsLongRunningMcoTaskScreen connectScreen(RealmsJoinInformation address) @ L127

  • 方法名:connectScreen
  • 源码定位:L127
  • 返回类型:RealmsLongRunningMcoTaskScreen
  • 修饰符:public

参数:

  • address: RealmsJoinInformation

说明:

TODO

private PopupScreen resourcePackDownloadConfirmationScreen(RealmsJoinInformation address, UUID packId, Function<RealmsJoinInformation,Screen> onCompletionScreen) @ L131

  • 方法名:resourcePackDownloadConfirmationScreen
  • 源码定位:L131
  • 返回类型:PopupScreen
  • 修饰符:private

参数:

  • address: RealmsJoinInformation
  • packId: UUID
  • onCompletionScreen: Function<RealmsJoinInformation,Screen>

说明:

TODO

private CompletableFuture<?> scheduleResourcePackDownload(RealmsJoinInformation address, UUID packId) @ L146

  • 方法名:scheduleResourcePackDownload
  • 源码定位:L146
  • 返回类型:CompletableFuture<?>
  • 修饰符:private

参数:

  • address: RealmsJoinInformation
  • packId: UUID

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class GetServerDetailsTask extends LongRunningTask {
    private static final Component APPLYING_PACK_TEXT = Component.translatable("multiplayer.applyingPack");
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final Component TITLE = Component.translatable("mco.connect.connecting");
    private final RealmsServer server;
    private final Screen lastScreen;
 
    public GetServerDetailsTask(Screen lastScreen, RealmsServer server) {
        this.lastScreen = lastScreen;
        this.server = server;
    }
 
    @Override
    public void run() {
        RealmsJoinInformation address;
        try {
            address = this.fetchServerAddress();
        } catch (CancellationException var4) {
            LOGGER.info("User aborted connecting to realms");
            return;
        } catch (RealmsServiceException var5) {
            switch (var5.realmsError.errorCode()) {
                case 6002:
                    setScreen(new RealmsTermsScreen(this.lastScreen, this.server));
                    return;
                case 6006:
                    boolean isOwner = Minecraft.getInstance().isLocalPlayer(this.server.ownerUUID);
                    setScreen(
                        (Screen)(isOwner
                            ? new RealmsBrokenWorldScreen(this.lastScreen, this.server.id, this.server.isMinigameActive())
                            : new RealmsGenericErrorScreen(
                                Component.translatable("mco.brokenworld.nonowner.title"),
                                Component.translatable("mco.brokenworld.nonowner.error"),
                                this.lastScreen
                            ))
                    );
                    return;
                default:
                    this.error(var5);
                    LOGGER.error("Couldn't connect to world", (Throwable)var5);
                    return;
            }
        } catch (TimeoutException var6) {
            this.error(Component.translatable("mco.errorMessage.connectionFailure"));
            return;
        } catch (Exception var7) {
            LOGGER.error("Couldn't connect to world", (Throwable)var7);
            this.error(var7);
            return;
        }
 
        if (address.address() == null) {
            this.error(Component.translatable("mco.errorMessage.connectionFailure"));
        } else {
            boolean requiresResourcePack = address.resourcePackUrl() != null && address.resourcePackHash() != null;
            Screen nextScreen = (Screen)(requiresResourcePack
                ? this.resourcePackDownloadConfirmationScreen(address, generatePackId(this.server), this::connectScreen)
                : this.connectScreen(address));
            setScreen(nextScreen);
        }
    }
 
    private static UUID generatePackId(RealmsServer serverData) {
        return serverData.minigameName != null
            ? UUID.nameUUIDFromBytes(("minigame:" + serverData.minigameName).getBytes(StandardCharsets.UTF_8))
            : UUID.nameUUIDFromBytes(
                ("realms:" + Objects.requireNonNullElse(serverData.name, "") + ":" + serverData.activeSlot).getBytes(StandardCharsets.UTF_8)
            );
    }
 
    @Override
    public Component getTitle() {
        return TITLE;
    }
 
    private RealmsJoinInformation fetchServerAddress() throws RealmsServiceException, TimeoutException, CancellationException {
        RealmsClient client = RealmsClient.getOrCreate();
 
        for (int i = 0; i < 40; i++) {
            if (this.aborted()) {
                throw new CancellationException();
            }
 
            try {
                return client.join(this.server.id);
            } catch (RetryCallException var4) {
                pause(var4.delaySeconds);
            }
        }
 
        throw new TimeoutException();
    }
 
    public RealmsLongRunningMcoTaskScreen connectScreen(RealmsJoinInformation address) {
        return new RealmsLongRunningMcoConnectTaskScreen(this.lastScreen, address, new ConnectTask(this.lastScreen, this.server, address));
    }
 
    private PopupScreen resourcePackDownloadConfirmationScreen(
        RealmsJoinInformation address, UUID packId, Function<RealmsJoinInformation, Screen> onCompletionScreen
    ) {
        Component popupMessage = Component.translatable("mco.configure.world.resourcepack.question");
        return RealmsPopups.infoPopupScreen(this.lastScreen, popupMessage, popupScreen -> {
            setScreen(new GenericMessageScreen(APPLYING_PACK_TEXT));
            this.scheduleResourcePackDownload(address, packId).thenRun(() -> setScreen(onCompletionScreen.apply(address))).exceptionally(e -> {
                Minecraft.getInstance().getDownloadedPackSource().cleanupAfterDisconnect();
                LOGGER.error("Failed to download resource pack from {}", address, e);
                setScreen(new RealmsGenericErrorScreen(Component.translatable("mco.download.resourcePack.fail"), this.lastScreen));
                return null;
            });
        });
    }
 
    private CompletableFuture<?> scheduleResourcePackDownload(RealmsJoinInformation address, UUID packId) {
        try {
            if (address.resourcePackUrl() == null) {
                return CompletableFuture.failedFuture(new IllegalStateException("resourcePackUrl was null"));
            } else if (address.resourcePackHash() == null) {
                return CompletableFuture.failedFuture(new IllegalStateException("resourcePackHash was null"));
            } else {
                DownloadedPackSource packSource = Minecraft.getInstance().getDownloadedPackSource();
                CompletableFuture<Void> result = packSource.waitForPackFeedback(packId);
                packSource.allowServerPacks();
                packSource.pushPack(packId, new URL(address.resourcePackUrl()), address.resourcePackHash());
                return result;
            }
        } catch (Exception var5) {
            return CompletableFuture.failedFuture(var5);
        }
    }
}

引用的其他类