package com.mojang.realmsclient.gui.screens; import com.mojang.realmsclient.RealmsMainScreen; import com.mojang.realmsclient.client.RealmsClient; import com.mojang.realmsclient.dto.RealmsServer; import com.mojang.realmsclient.exception.RealmsServiceException; import com.mojang.realmsclient.util.task.RealmCreationTask; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.Util; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.layouts.CommonLayouts; import net.minecraft.client.gui.layouts.HeaderAndFooterLayout; import net.minecraft.client.gui.layouts.LinearLayout; import net.minecraft.client.gui.screens.AlertScreen; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.realms.RealmsScreen; import net.minecraft.util.StringUtil; @Environment(EnvType.CLIENT) public class RealmsCreateRealmScreen extends RealmsScreen { private static final Component CREATE_REALM_TEXT = Component.translatable("mco.selectServer.create"); private static final Component NAME_LABEL = Component.translatable("mco.configure.world.name"); private static final Component DESCRIPTION_LABEL = Component.translatable("mco.configure.world.description"); private static final int BUTTON_SPACING = 10; private static final int CONTENT_WIDTH = 210; private final RealmsMainScreen lastScreen; private final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this); private EditBox nameBox; private EditBox descriptionBox; private final Runnable createWorldRunnable; public RealmsCreateRealmScreen(RealmsMainScreen lastScreen, RealmsServer server, boolean isSnapshor) { super(CREATE_REALM_TEXT); this.lastScreen = lastScreen; this.createWorldRunnable = () -> this.createWorld(server, isSnapshor); } @Override public void init() { this.layout.addTitleHeader(this.title, this.font); LinearLayout linearLayout = this.layout.addToContents(LinearLayout.vertical()).spacing(10); Button button = Button.builder(CommonComponents.GUI_CONTINUE, buttonx -> this.createWorldRunnable.run()).build(); button.active = false; this.nameBox = new EditBox(this.font, 210, 20, NAME_LABEL); this.nameBox.setResponder(string -> button.active = !StringUtil.isBlank(string)); this.descriptionBox = new EditBox(this.font, 210, 20, DESCRIPTION_LABEL); linearLayout.addChild(CommonLayouts.labeledElement(this.font, this.nameBox, NAME_LABEL)); linearLayout.addChild(CommonLayouts.labeledElement(this.font, this.descriptionBox, DESCRIPTION_LABEL)); LinearLayout linearLayout2 = this.layout.addToFooter(LinearLayout.horizontal().spacing(10)); linearLayout2.addChild(button); linearLayout2.addChild(Button.builder(CommonComponents.GUI_BACK, buttonx -> this.onClose()).build()); this.layout.visitWidgets(guiEventListener -> { AbstractWidget var10000 = this.addRenderableWidget(guiEventListener); }); this.repositionElements(); } @Override protected void setInitialFocus() { this.setInitialFocus(this.nameBox); } @Override protected void repositionElements() { this.layout.arrangeElements(); } private void createWorld(RealmsServer server, boolean isSnapshot) { if (!server.isSnapshotRealm() && isSnapshot) { AtomicBoolean atomicBoolean = new AtomicBoolean(); this.minecraft.setScreen(new AlertScreen(() -> { atomicBoolean.set(true); this.lastScreen.resetScreen(); this.minecraft.setScreen(this.lastScreen); }, Component.translatable("mco.upload.preparing"), Component.empty())); CompletableFuture.supplyAsync(() -> createSnapshotRealm(server), Util.backgroundExecutor()).thenAcceptAsync(realmsServer -> { if (!atomicBoolean.get()) { this.showResetWorldScreen(realmsServer); } }, this.minecraft).exceptionallyAsync(throwable -> { this.lastScreen.resetScreen(); Component component; if (throwable.getCause() instanceof RealmsServiceException realmsServiceException) { component = realmsServiceException.realmsError.errorMessage(); } else { component = Component.translatable("mco.errorMessage.initialize.failed"); } this.minecraft.setScreen(new RealmsGenericErrorScreen(component, this.lastScreen)); return null; }, this.minecraft); } else { this.showResetWorldScreen(server); } } private static RealmsServer createSnapshotRealm(RealmsServer server) { RealmsClient realmsClient = RealmsClient.getOrCreate(); try { return realmsClient.createSnapshotRealm(server.id); } catch (RealmsServiceException var3) { throw new RuntimeException(var3); } } private void showResetWorldScreen(RealmsServer server) { RealmCreationTask realmCreationTask = new RealmCreationTask(server.id, this.nameBox.getValue(), this.descriptionBox.getValue()); RealmsResetWorldScreen realmsResetWorldScreen = RealmsResetWorldScreen.forNewRealm(this, server, realmCreationTask, () -> this.minecraft.execute(() -> { RealmsMainScreen.refreshServerList(); this.minecraft.setScreen(this.lastScreen); })); this.minecraft.setScreen(realmsResetWorldScreen); } @Override public void onClose() { this.minecraft.setScreen(this.lastScreen); } }