RealmsConfigureWorldScreen.java

com.mojang.realmsclient.gui.screens.configuration.RealmsConfigureWorldScreen

信息

  • 全限定名:com.mojang.realmsclient.gui.screens.configuration.RealmsConfigureWorldScreen
  • 类型:public class
  • 包:com.mojang.realmsclient.gui.screens.configuration
  • 源码路径:src/main/java/com/mojang/realmsclient/gui/screens/configuration/RealmsConfigureWorldScreen.java
  • 起始行号:L50
  • 继承:RealmsScreen
  • 职责:

    TODO

字段/常量

  • LOGGER

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

      TODO

  • PLAY_TEXT

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

      TODO

  • lastScreen

    • 类型: RealmsMainScreen
    • 修饰符: private final
    • 源码定位: L53
    • 说明:

      TODO

  • serverData

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

      TODO

  • regions

    • 类型: PreferredRegionsDto
    • 修饰符: private
    • 源码定位: L55
    • 说明:

      TODO

  • regionServiceQuality

    • 类型: Map<RealmsRegion,ServiceQuality>
    • 修饰符: private final
    • 源码定位: L56
    • 说明:

      TODO

  • serverId

    • 类型: long
    • 修饰符: private final
    • 源码定位: L57
    • 说明:

      TODO

  • stateChanged

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L58
    • 说明:

      TODO

  • tabManager

    • 类型: TabManager
    • 修饰符: private final
    • 源码定位: L59
    • 说明:

      TODO

  • playButton

    • 类型: Button
    • 修饰符: private
    • 源码定位: L62
    • 说明:

      TODO

  • tabNavigationBar

    • 类型: TabNavigationBar
    • 修饰符: private
    • 源码定位: L63
    • 说明:

      TODO

  • layout

    • 类型: HeaderAndFooterLayout
    • 修饰符: final
    • 源码定位: L64
    • 说明:

      TODO

内部类/嵌套类型

构造器

public RealmsConfigureWorldScreen(RealmsMainScreen lastScreen, long serverId, RealmsServer serverData, PreferredRegionsDto regions) @ L66

  • 构造器名:RealmsConfigureWorldScreen
  • 源码定位:L66
  • 修饰符:public

参数:

  • lastScreen: RealmsMainScreen
  • serverId: long
  • serverData: RealmsServer
  • regions: PreferredRegionsDto

说明:

TODO

public RealmsConfigureWorldScreen(RealmsMainScreen lastScreen, long serverId) @ L74

  • 构造器名:RealmsConfigureWorldScreen
  • 源码定位:L74
  • 修饰符:public

参数:

  • lastScreen: RealmsMainScreen
  • serverId: long

说明:

TODO

方法

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

public void init() @ L78

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

参数:

说明:

TODO

private void onTabSelected(Tab tab) @ L117

  • 方法名:onTabSelected
  • 源码定位:L117
  • 返回类型:void
  • 修饰符:private

参数:

  • tab: Tab

说明:

TODO

private void onTabDeselected(Tab tab) @ L123

  • 方法名:onTabDeselected
  • 源码定位:L123
  • 返回类型:void
  • 修饰符:private

参数:

  • tab: Tab

说明:

TODO

public int getContentHeight() @ L129

  • 方法名:getContentHeight
  • 源码定位:L129
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public int getHeaderHeight() @ L133

  • 方法名:getHeaderHeight
  • 源码定位:L133
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public Screen getLastScreen() @ L137

  • 方法名:getLastScreen
  • 源码定位:L137
  • 返回类型:Screen
  • 修饰符:public

参数:

说明:

TODO

public Screen createErrorScreen(RealmsServiceException exception) @ L141

  • 方法名:createErrorScreen
  • 源码定位:L141
  • 返回类型:Screen
  • 修饰符:public

参数:

  • exception: RealmsServiceException

说明:

TODO

public void repositionElements() @ L145

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

参数:

说明:

TODO

private void updateButtonStates() @ L157

  • 方法名:updateButtonStates
  • 源码定位:L157
  • 返回类型:void
  • 修饰符:private

参数:

说明:

TODO

public void extractRenderState(GuiGraphicsExtractor graphics, int xm, int ym, float a) @ L166

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

参数:

  • graphics: GuiGraphicsExtractor
  • xm: int
  • ym: int
  • a: float

说明:

TODO

public boolean keyPressed(KeyEvent event) @ L174

  • 方法名:keyPressed
  • 源码定位:L174
  • 返回类型:boolean
  • 修饰符:public

参数:

  • event: KeyEvent

说明:

TODO

protected void extractMenuBackground(GuiGraphicsExtractor graphics) @ L179

  • 方法名:extractMenuBackground
  • 源码定位:L179
  • 返回类型:void
  • 修饰符:protected

参数:

  • graphics: GuiGraphicsExtractor

说明:

TODO

public void onClose() @ L187

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

参数:

说明:

TODO

public void fetchRegionData() @ L199

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

参数:

说明:

TODO

public void fetchServerData(long realmId) @ L209

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

参数:

  • realmId: long

说明:

TODO

private void onRealmsDataFetched() @ L219

  • 方法名:onRealmsDataFetched
  • 源码定位:L219
  • 返回类型:void
  • 修饰符:private

参数:

说明:

TODO

public void saveSlotSettings(RealmsSlot slot) @ L265

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

参数:

  • slot: RealmsSlot

说明:

TODO

public void saveSettings(String name, String desc, RegionSelectionPreference preference, RealmsRegion region) @ L292

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

参数:

  • name: String
  • desc: String
  • preference: RegionSelectionPreference
  • region: RealmsRegion

说明:

TODO

public void openTheWorld(boolean join) @ L317

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

参数:

  • join: boolean

说明:

TODO

public void closeTheWorld() @ L323

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

参数:

说明:

TODO

public void stateChanged() @ L328

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

参数:

说明:

TODO

public boolean invitePlayer(long serverId, String name) @ L339

  • 方法名:invitePlayer
  • 源码定位:L339
  • 返回类型:boolean
  • 修饰符:public

参数:

  • serverId: long
  • name: String

说明:

TODO

public RealmsConfigureWorldScreen getNewScreen() @ L358

  • 方法名:getNewScreen
  • 源码定位:L358
  • 返回类型:RealmsConfigureWorldScreen
  • 修饰符:public

参数:

说明:

TODO

public RealmsConfigureWorldScreen getNewScreenWithKnownData(RealmsServer serverData) @ L364

  • 方法名:getNewScreenWithKnownData
  • 源码定位:L364
  • 返回类型:RealmsConfigureWorldScreen
  • 修饰符:public

参数:

  • serverData: RealmsServer

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class RealmsConfigureWorldScreen extends RealmsScreen {
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final Component PLAY_TEXT = Component.translatable("mco.selectServer.play");
    private final RealmsMainScreen lastScreen;
    private @Nullable RealmsServer serverData;
    private @Nullable PreferredRegionsDto regions;
    private final Map<RealmsRegion, ServiceQuality> regionServiceQuality = new LinkedHashMap<>();
    private final long serverId;
    private boolean stateChanged;
    private final TabManager tabManager = new TabManager(
        x$0 -> this.addRenderableWidget(x$0), x$0 -> this.removeWidget(x$0), this::onTabSelected, this::onTabDeselected
    );
    private @Nullable Button playButton;
    private @Nullable TabNavigationBar tabNavigationBar;
    final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this);
 
    public RealmsConfigureWorldScreen(RealmsMainScreen lastScreen, long serverId, @Nullable RealmsServer serverData, @Nullable PreferredRegionsDto regions) {
        super(Component.empty());
        this.lastScreen = lastScreen;
        this.serverId = serverId;
        this.serverData = serverData;
        this.regions = regions;
    }
 
    public RealmsConfigureWorldScreen(RealmsMainScreen lastScreen, long serverId) {
        this(lastScreen, serverId, null, null);
    }
 
    @Override
    public void init() {
        if (this.serverData == null) {
            this.fetchServerData(this.serverId);
        }
 
        if (this.regions == null) {
            this.fetchRegionData();
        }
 
        Component loadingTitle = Component.translatable("mco.configure.world.loading");
        this.tabNavigationBar = TabNavigationBar.builder(this.tabManager, this.width)
            .addTabs(
                new LoadingTab(this.getFont(), RealmsWorldsTab.TITLE, loadingTitle),
                new LoadingTab(this.getFont(), RealmsPlayersTab.TITLE, loadingTitle),
                new LoadingTab(this.getFont(), RealmsSubscriptionTab.TITLE, loadingTitle),
                new LoadingTab(this.getFont(), RealmsSettingsTab.TITLE, loadingTitle)
            )
            .build();
        this.tabNavigationBar.setTabActiveState(3, false);
        this.addRenderableWidget(this.tabNavigationBar);
        LinearLayout footer = this.layout.addToFooter(LinearLayout.horizontal().spacing(8));
        this.playButton = footer.addChild(Button.builder(PLAY_TEXT, button -> {
            this.onClose();
            RealmsMainScreen.play(this.serverData, this);
        }).width(150).build());
        this.playButton.active = false;
        footer.addChild(Button.builder(CommonComponents.GUI_BACK, button -> this.onClose()).build());
        this.layout.visitWidgets(button -> {
            button.setTabOrderGroup(1);
            this.addRenderableWidget(button);
        });
        this.tabNavigationBar.selectTab(0, false);
        this.repositionElements();
        if (this.serverData != null && this.regions != null) {
            this.onRealmsDataFetched();
        }
    }
 
    private void onTabSelected(Tab tab) {
        if (this.serverData != null && tab instanceof RealmsConfigurationTab configurationTab) {
            configurationTab.onSelected(this.serverData);
        }
    }
 
    private void onTabDeselected(Tab tab) {
        if (this.serverData != null && tab instanceof RealmsConfigurationTab configurationTab) {
            configurationTab.onDeselected(this.serverData);
        }
    }
 
    public int getContentHeight() {
        return this.layout.getContentHeight();
    }
 
    public int getHeaderHeight() {
        return this.layout.getHeaderHeight();
    }
 
    public Screen getLastScreen() {
        return this.lastScreen;
    }
 
    public Screen createErrorScreen(RealmsServiceException exception) {
        return new RealmsGenericErrorScreen(exception, this.lastScreen);
    }
 
    @Override
    public void repositionElements() {
        if (this.tabNavigationBar != null) {
            this.tabNavigationBar.updateWidth(this.width);
            int tabAreaTop = this.tabNavigationBar.getRectangle().bottom();
            ScreenRectangle tabArea = new ScreenRectangle(0, tabAreaTop, this.width, this.height - this.layout.getFooterHeight() - tabAreaTop);
            this.tabManager.setTabArea(tabArea);
            this.layout.setHeaderHeight(tabAreaTop);
            this.layout.arrangeElements();
        }
    }
 
    private void updateButtonStates() {
        if (this.serverData != null && this.playButton != null) {
            this.playButton.active = this.serverData.shouldPlayButtonBeActive();
            if (!this.playButton.active && this.serverData.state == RealmsServer.State.CLOSED) {
                this.playButton.setTooltip(Tooltip.create(RealmsServer.WORLD_CLOSED_COMPONENT));
            }
        }
    }
 
    @Override
    public void extractRenderState(GuiGraphicsExtractor graphics, int xm, int ym, float a) {
        super.extractRenderState(graphics, xm, ym, a);
        graphics.blit(
            RenderPipelines.GUI_TEXTURED, Screen.FOOTER_SEPARATOR, 0, this.height - this.layout.getFooterHeight() - 2, 0.0F, 0.0F, this.width, 2, 32, 2
        );
    }
 
    @Override
    public boolean keyPressed(KeyEvent event) {
        return this.tabNavigationBar.keyPressed(event) ? true : super.keyPressed(event);
    }
 
    @Override
    protected void extractMenuBackground(GuiGraphicsExtractor graphics) {
        graphics.blit(
            RenderPipelines.GUI_TEXTURED, CreateWorldScreen.TAB_HEADER_BACKGROUND, 0, 0, 0.0F, 0.0F, this.width, this.layout.getHeaderHeight(), 16, 16
        );
        this.extractMenuBackground(graphics, 0, this.layout.getHeaderHeight(), this.width, this.height);
    }
 
    @Override
    public void onClose() {
        if (this.serverData != null && this.tabManager.getCurrentTab() instanceof RealmsConfigurationTab tab) {
            tab.onDeselected(this.serverData);
        }
 
        this.minecraft.setScreen(this.lastScreen);
        if (this.stateChanged) {
            this.lastScreen.resetScreen();
        }
    }
 
    public void fetchRegionData() {
        RealmsUtil.supplyAsync(
                RealmsClient::getPreferredRegionSelections, RealmsUtil.openScreenAndLogOnFailure(this::createErrorScreen, "Couldn't get realms region data")
            )
            .thenAcceptAsync(regions -> {
                this.regions = regions;
                this.onRealmsDataFetched();
            }, this.minecraft);
    }
 
    public void fetchServerData(long realmId) {
        RealmsUtil.<RealmsServer>supplyAsync(
                client -> client.getOwnRealm(realmId), RealmsUtil.openScreenAndLogOnFailure(this::createErrorScreen, "Couldn't get own world")
            )
            .thenAcceptAsync(serverData -> {
                this.serverData = serverData;
                this.onRealmsDataFetched();
            }, this.minecraft);
    }
 
    private void onRealmsDataFetched() {
        if (this.serverData != null && this.regions != null) {
            this.regionServiceQuality.clear();
 
            for (RegionDataDto region : this.regions.regionData()) {
                if (region.region() != RealmsRegion.INVALID_REGION) {
                    this.regionServiceQuality.put(region.region(), region.serviceQuality());
                }
            }
 
            int focusedTabIndex = -1;
            if (this.tabNavigationBar != null) {
                focusedTabIndex = this.tabNavigationBar.getTabs().indexOf(this.tabManager.getCurrentTab());
            }
 
            if (this.tabNavigationBar != null) {
                this.removeWidget(this.tabNavigationBar);
            }
 
            this.tabNavigationBar = this.addRenderableWidget(
                TabNavigationBar.builder(this.tabManager, this.width)
                    .addTabs(
                        new RealmsWorldsTab(this, Objects.requireNonNull(this.minecraft), this.serverData),
                        new RealmsPlayersTab(this, this.minecraft, this.serverData),
                        new RealmsSubscriptionTab(this, this.minecraft, this.serverData),
                        new RealmsSettingsTab(this, this.minecraft, this.serverData, this.regionServiceQuality)
                    )
                    .build()
            );
            this.setFocused(this.tabNavigationBar);
            if (focusedTabIndex != -1) {
                this.tabNavigationBar.selectTab(focusedTabIndex, false);
            }
 
            this.tabNavigationBar.setTabActiveState(3, !this.serverData.expired);
            if (this.serverData.expired) {
                this.tabNavigationBar.setTabTooltip(3, Tooltip.create(Component.translatable("mco.configure.world.settings.expired")));
            } else {
                this.tabNavigationBar.setTabTooltip(3, null);
            }
 
            this.updateButtonStates();
            this.repositionElements();
        }
    }
 
    public void saveSlotSettings(RealmsSlot slot) {
        RealmsSlot oldSlot = this.serverData.slots.get(this.serverData.activeSlot);
        slot.options.templateId = oldSlot.options.templateId;
        slot.options.templateImage = oldSlot.options.templateImage;
        RealmsClient client = RealmsClient.getOrCreate();
 
        try {
            if (this.serverData.activeSlot != slot.slotId) {
                throw new RealmsServiceException(RealmsError.CustomError.configurationError());
            }
 
            client.updateSlot(this.serverData.id, slot.slotId, slot.options, slot.settings);
            this.serverData.slots.put(this.serverData.activeSlot, slot);
            if (slot.options.gameMode != oldSlot.options.gameMode || slot.isHardcore() != oldSlot.isHardcore()) {
                RealmsMainScreen.refreshServerList();
            }
 
            this.stateChanged();
        } catch (RealmsServiceException var5) {
            LOGGER.error("Couldn't save slot settings", (Throwable)var5);
            this.minecraft.setScreen(new RealmsGenericErrorScreen(var5, this));
            return;
        }
 
        this.minecraft.setScreen(this);
    }
 
    public void saveSettings(String name, String desc, RegionSelectionPreference preference, @Nullable RealmsRegion region) {
        String description = StringUtil.isBlank(desc) ? "" : desc;
        String finalName = StringUtil.isBlank(name) ? "" : name;
        RealmsClient client = RealmsClient.getOrCreate();
 
        try {
            RealmsSlot realmsSlot = this.serverData.slots.get(this.serverData.activeSlot);
            RealmsRegion regionSelection = preference == RegionSelectionPreference.MANUAL ? region : null;
            RegionSelectionPreferenceDto regionSelectionPreference = new RegionSelectionPreferenceDto(preference, regionSelection);
            client.updateConfiguration(
                this.serverData.id, finalName, description, regionSelectionPreference, realmsSlot.slotId, realmsSlot.options, realmsSlot.settings
            );
            this.serverData.regionSelectionPreference = regionSelectionPreference;
            this.serverData.name = name;
            this.serverData.motd = description;
            this.stateChanged();
        } catch (RealmsServiceException var11) {
            LOGGER.error("Couldn't save settings", (Throwable)var11);
            this.minecraft.setScreen(new RealmsGenericErrorScreen(var11, this));
            return;
        }
 
        this.minecraft.setScreen(this);
    }
 
    public void openTheWorld(boolean join) {
        RealmsConfigureWorldScreen screenWithKnownData = this.getNewScreenWithKnownData(this.serverData);
        this.minecraft
            .setScreen(new RealmsLongRunningMcoTaskScreen(this.getNewScreen(), new OpenServerTask(this.serverData, screenWithKnownData, join, this.minecraft)));
    }
 
    public void closeTheWorld() {
        RealmsConfigureWorldScreen screenWithKnownData = this.getNewScreenWithKnownData(this.serverData);
        this.minecraft.setScreen(new RealmsLongRunningMcoTaskScreen(this.getNewScreen(), new CloseServerTask(this.serverData, screenWithKnownData)));
    }
 
    public void stateChanged() {
        this.stateChanged = true;
        if (this.tabNavigationBar != null) {
            for (Tab child : this.tabNavigationBar.getTabs()) {
                if (child instanceof RealmsConfigurationTab tab) {
                    tab.updateData(this.serverData);
                }
            }
        }
    }
 
    public boolean invitePlayer(long serverId, String name) {
        RealmsClient client = RealmsClient.getOrCreate();
 
        try {
            List<PlayerInfo> players = client.invite(serverId, name);
            if (this.serverData != null) {
                this.serverData.players = players;
            } else {
                this.serverData = client.getOwnRealm(serverId);
            }
 
            this.stateChanged();
            return true;
        } catch (RealmsServiceException var6) {
            LOGGER.error("Couldn't invite user", (Throwable)var6);
            return false;
        }
    }
 
    public RealmsConfigureWorldScreen getNewScreen() {
        RealmsConfigureWorldScreen realmsConfigureWorldScreen = new RealmsConfigureWorldScreen(this.lastScreen, this.serverId);
        realmsConfigureWorldScreen.stateChanged = this.stateChanged;
        return realmsConfigureWorldScreen;
    }
 
    public RealmsConfigureWorldScreen getNewScreenWithKnownData(RealmsServer serverData) {
        RealmsConfigureWorldScreen realmsConfigureWorldScreen = new RealmsConfigureWorldScreen(this.lastScreen, this.serverId, serverData, this.regions);
        realmsConfigureWorldScreen.stateChanged = this.stateChanged;
        return realmsConfigureWorldScreen;
    }
}

引用的其他类