RealmsWorldsTab.java

com.mojang.realmsclient.gui.screens.configuration.RealmsWorldsTab

信息

  • 全限定名:com.mojang.realmsclient.gui.screens.configuration.RealmsWorldsTab
  • 类型:package-private class
  • 包:com.mojang.realmsclient.gui.screens.configuration
  • 源码路径:src/main/java/com/mojang/realmsclient/gui/screens/configuration/RealmsWorldsTab.java
  • 起始行号:L25
  • 继承:GridLayoutTab
  • 实现:RealmsConfigurationTab
  • 职责:

    TODO

字段/常量

  • TITLE

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

      TODO

  • configurationScreen

    • 类型: RealmsConfigureWorldScreen
    • 修饰符: private final
    • 源码定位: L27
    • 说明:

      TODO

  • minecraft

    • 类型: Minecraft
    • 修饰符: private final
    • 源码定位: L28
    • 说明:

      TODO

  • serverData

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

      TODO

  • optionsButton

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

      TODO

  • backupButton

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

      TODO

  • resetWorldButton

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

      TODO

  • slotButtonList

    • 类型: List<RealmsWorldSlotButton>
    • 修饰符: private final
    • 源码定位: L33
    • 说明:

      TODO

内部类/嵌套类型

构造器

RealmsWorldsTab(RealmsConfigureWorldScreen configurationScreen, Minecraft minecraft, RealmsServer serverData) @ L35

  • 构造器名:RealmsWorldsTab
  • 源码定位:L35
  • 修饰符:package-private

参数:

  • configurationScreen: RealmsConfigureWorldScreen
  • minecraft: Minecraft
  • serverData: RealmsServer

说明:

TODO

方法

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

private void resetButtonPressed() @ L76

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

参数:

说明:

TODO

private void templateSelectionCallback(WorldTemplate worldTemplate) @ L96

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

参数:

  • worldTemplate: WorldTemplate

说明:

TODO

private boolean isMinigame() @ L106

  • 方法名:isMinigame
  • 源码定位:L106
  • 返回类型:boolean
  • 修饰符:private

参数:

说明:

TODO

public void onSelected(RealmsServer serverData) @ L110

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

参数:

  • serverData: RealmsServer

说明:

TODO

public void updateData(RealmsServer serverData) @ L115

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

参数:

  • serverData: RealmsServer

说明:

TODO

private RealmsWorldSlotButton createSlotButton(int i) @ L145

  • 方法名:createSlotButton
  • 源码定位:L145
  • 返回类型:RealmsWorldSlotButton
  • 修饰符:private

参数:

  • i: int

说明:

TODO

private void switchToMinigame() @ L165

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

参数:

说明:

TODO

private void switchToFullSlot(int selectedSlot, RealmsServer serverData) @ L179

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

参数:

  • selectedSlot: int
  • serverData: RealmsServer

说明:

TODO

private void switchToEmptySlot(int selectedSlot, RealmsServer serverData) @ L200

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

参数:

  • selectedSlot: int
  • serverData: RealmsServer

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
class RealmsWorldsTab extends GridLayoutTab implements RealmsConfigurationTab {
    static final Component TITLE = Component.translatable("mco.configure.worlds.title");
    private final RealmsConfigureWorldScreen configurationScreen;
    private final Minecraft minecraft;
    private RealmsServer serverData;
    private final Button optionsButton;
    private final Button backupButton;
    private final Button resetWorldButton;
    private final List<RealmsWorldSlotButton> slotButtonList = Lists.newArrayList();
 
    RealmsWorldsTab(RealmsConfigureWorldScreen configurationScreen, Minecraft minecraft, RealmsServer serverData) {
        super(TITLE);
        this.configurationScreen = configurationScreen;
        this.minecraft = minecraft;
        this.serverData = serverData;
        GridLayout.RowHelper helper = this.layout.spacing(20).createRowHelper(1);
        GridLayout.RowHelper slots = new GridLayout().spacing(16).createRowHelper(4);
        this.slotButtonList.clear();
 
        for (int i = 1; i < 5; i++) {
            this.slotButtonList.add(slots.addChild(this.createSlotButton(i), LayoutSettings.defaults().alignVerticallyBottom()));
        }
 
        helper.addChild(slots.getGrid());
        GridLayout.RowHelper buttons = new GridLayout().spacing(8).createRowHelper(1);
        this.optionsButton = buttons.addChild(
            Button.builder(
                    Component.translatable("mco.configure.world.buttons.options"),
                    button -> minecraft.setScreen(
                        new RealmsSlotOptionsScreen(
                            configurationScreen, serverData.slots.get(serverData.activeSlot).copy(), serverData.worldType, serverData.activeSlot
                        )
                    )
                )
                .bounds(0, 0, 150, 20)
                .build()
        );
        this.backupButton = buttons.addChild(
            Button.builder(
                    Component.translatable("mco.configure.world.backup"),
                    button -> minecraft.setScreen(new RealmsBackupScreen(configurationScreen, serverData.copy(), serverData.activeSlot))
                )
                .bounds(0, 0, 150, 20)
                .build()
        );
        this.resetWorldButton = buttons.addChild(Button.builder(Component.empty(), button -> this.resetButtonPressed()).bounds(0, 0, 150, 20).build());
        helper.addChild(buttons.getGrid(), LayoutSettings.defaults().alignHorizontallyCenter());
        this.backupButton.active = true;
        this.updateData(serverData);
    }
 
    private void resetButtonPressed() {
        if (this.isMinigame()) {
            this.minecraft
                .setScreen(
                    new RealmsSelectWorldTemplateScreen(
                        Component.translatable("mco.template.title.minigame"), this::templateSelectionCallback, RealmsServer.WorldType.MINIGAME, null
                    )
                );
        } else {
            this.minecraft
                .setScreen(
                    RealmsResetWorldScreen.forResetSlot(
                        this.configurationScreen,
                        this.serverData.copy(),
                        () -> this.minecraft.execute(() -> this.minecraft.setScreen(this.configurationScreen.getNewScreen()))
                    )
                );
        }
    }
 
    private void templateSelectionCallback(@Nullable WorldTemplate worldTemplate) {
        if (worldTemplate != null && WorldTemplate.WorldTemplateType.MINIGAME == worldTemplate.type()) {
            this.configurationScreen.stateChanged();
            RealmsConfigureWorldScreen newScreen = this.configurationScreen.getNewScreen();
            this.minecraft.setScreen(new RealmsLongRunningMcoTaskScreen(newScreen, new SwitchMinigameTask(this.serverData.id, worldTemplate, newScreen)));
        } else {
            this.minecraft.setScreen(this.configurationScreen);
        }
    }
 
    private boolean isMinigame() {
        return this.serverData.isMinigameActive();
    }
 
    @Override
    public void onSelected(RealmsServer serverData) {
        this.updateData(serverData);
    }
 
    @Override
    public void updateData(RealmsServer serverData) {
        this.serverData = serverData;
        this.optionsButton.active = !serverData.expired && !this.isMinigame();
        this.resetWorldButton.active = !serverData.expired;
        if (this.isMinigame()) {
            this.resetWorldButton.setMessage(Component.translatable("mco.configure.world.buttons.switchminigame"));
        } else {
            boolean emptySlot = serverData.slots.containsKey(serverData.activeSlot) && serverData.slots.get(serverData.activeSlot).options.empty;
            if (emptySlot) {
                this.resetWorldButton.setMessage(Component.translatable("mco.configure.world.buttons.newworld"));
            } else {
                this.resetWorldButton.setMessage(Component.translatable("mco.configure.world.buttons.resetworld"));
            }
        }
 
        this.backupButton.active = !this.isMinigame();
 
        for (RealmsWorldSlotButton realmsWorldSlotButton : this.slotButtonList) {
            RealmsWorldSlotButton.State state = realmsWorldSlotButton.setServerData(serverData);
            if (state.activeSlot) {
                realmsWorldSlotButton.setSize(80, 80);
            } else {
                realmsWorldSlotButton.setSize(50, 50);
            }
        }
 
        this.slotButtonList.get(serverData.activeSlot - 1).updateSlotState(serverData);
    }
 
    private RealmsWorldSlotButton createSlotButton(int i) {
        return new RealmsWorldSlotButton(0, 0, 80, 80, i, this.serverData, button -> {
            RealmsWorldSlotButton.State state = ((RealmsWorldSlotButton)button).getState();
            switch (state.action) {
                case SWITCH_SLOT:
                    if (state.minigame) {
                        this.switchToMinigame();
                    } else if (state.empty) {
                        this.switchToEmptySlot(i, this.serverData);
                    } else {
                        this.switchToFullSlot(i, this.serverData);
                    }
                case NOTHING:
                    return;
                default:
                    throw new IllegalStateException("Unknown action " + state.action);
            }
        });
    }
 
    private void switchToMinigame() {
        RealmsSelectWorldTemplateScreen screen = new RealmsSelectWorldTemplateScreen(
            Component.translatable("mco.template.title.minigame"),
            this::templateSelectionCallback,
            RealmsServer.WorldType.MINIGAME,
            null,
            List.of(
                Component.translatable("mco.minigame.world.info.line1").withColor(-4539718),
                Component.translatable("mco.minigame.world.info.line2").withColor(-4539718)
            )
        );
        this.minecraft.setScreen(screen);
    }
 
    private void switchToFullSlot(int selectedSlot, RealmsServer serverData) {
        this.minecraft
            .setScreen(
                RealmsPopups.infoPopupScreen(
                    this.configurationScreen,
                    Component.translatable("mco.configure.world.slot.switch.question.line1"),
                    popup -> {
                        RealmsConfigureWorldScreen newScreen = this.configurationScreen.getNewScreen();
                        this.configurationScreen.stateChanged();
                        this.minecraft
                            .setScreen(
                                new RealmsLongRunningMcoTaskScreen(
                                    newScreen,
                                    new SwitchSlotTask(serverData.id, selectedSlot, () -> this.minecraft.execute(() -> this.minecraft.setScreen(newScreen)))
                                )
                            );
                    }
                )
            );
    }
 
    private void switchToEmptySlot(int selectedSlot, RealmsServer serverData) {
        this.minecraft
            .setScreen(
                RealmsPopups.infoPopupScreen(
                    this.configurationScreen,
                    Component.translatable("mco.configure.world.slot.switch.question.line1"),
                    popups -> {
                        this.configurationScreen.stateChanged();
                        RealmsResetWorldScreen resetWorldScreen = RealmsResetWorldScreen.forEmptySlot(
                            this.configurationScreen,
                            selectedSlot,
                            serverData,
                            () -> this.minecraft.execute(() -> this.minecraft.setScreen(this.configurationScreen.getNewScreen()))
                        );
                        this.minecraft.setScreen(resetWorldScreen);
                    }
                )
            );
    }
}

引用的其他类