/* * Decompiled with CFR 0.152. * * Could not load the following classes: * com.google.common.collect.Lists */ package net.minecraft.client.gui.screens.debug; import com.google.common.collect.Lists; import java.util.List; import net.minecraft.ChatFormatting; import net.minecraft.client.GameNarrator; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.input.KeyEvent; import net.minecraft.client.multiplayer.MultiPlayerGameMode; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.protocol.game.ServerboundChangeGameModePacket; import net.minecraft.resources.Identifier; import net.minecraft.server.commands.GameModeCommand; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.GameType; import net.minecraft.world.level.block.Blocks; public class GameModeSwitcherScreen extends Screen { private static final Identifier SLOT_SPRITE = Identifier.withDefaultNamespace("gamemode_switcher/slot"); private static final Identifier SELECTION_SPRITE = Identifier.withDefaultNamespace("gamemode_switcher/selection"); private static final Identifier GAMEMODE_SWITCHER_LOCATION = Identifier.withDefaultNamespace("textures/gui/container/gamemode_switcher.png"); private static final int SPRITE_SHEET_WIDTH = 128; private static final int SPRITE_SHEET_HEIGHT = 128; private static final int SLOT_AREA = 26; private static final int SLOT_PADDING = 5; private static final int SLOT_AREA_PADDED = 31; private static final int HELP_TIPS_OFFSET_Y = 5; private static final int ALL_SLOTS_WIDTH = GameModeIcon.values().length * 31 - 5; private final GameModeIcon previousHovered; private GameModeIcon currentlyHovered; private int firstMouseX; private int firstMouseY; private boolean setFirstMousePos; private final List slots = Lists.newArrayList(); public GameModeSwitcherScreen() { super(GameNarrator.NO_TITLE); this.currentlyHovered = this.previousHovered = GameModeIcon.getFromGameType(this.getDefaultSelected()); } private GameType getDefaultSelected() { MultiPlayerGameMode gameMode = Minecraft.getInstance().gameMode; GameType previous = gameMode.getPreviousPlayerMode(); if (previous != null) { return previous; } return gameMode.getPlayerMode() == GameType.CREATIVE ? GameType.SURVIVAL : GameType.CREATIVE; } @Override protected void init() { super.init(); this.slots.clear(); this.currentlyHovered = this.previousHovered; for (int i = 0; i < GameModeIcon.VALUES.length; ++i) { GameModeIcon icon = GameModeIcon.VALUES[i]; this.slots.add(new GameModeSlot(icon, this.width / 2 - ALL_SLOTS_WIDTH / 2 + i * 31, this.height / 2 - 31)); } } @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float a) { graphics.drawCenteredString(this.font, this.currentlyHovered.name, this.width / 2, this.height / 2 - 31 - 20, -1); MutableComponent selectKey = Component.translatable("debug.gamemodes.select_next", this.minecraft.options.keyDebugSwitchGameMode.getTranslatedKeyMessage().copy().withStyle(ChatFormatting.AQUA)); graphics.drawCenteredString(this.font, selectKey, this.width / 2, this.height / 2 + 5, -1); if (!this.setFirstMousePos) { this.firstMouseX = mouseX; this.firstMouseY = mouseY; this.setFirstMousePos = true; } boolean sameAsFirstMousePos = this.firstMouseX == mouseX && this.firstMouseY == mouseY; for (GameModeSlot slot : this.slots) { slot.render(graphics, mouseX, mouseY, a); slot.setSelected(this.currentlyHovered == slot.icon); if (sameAsFirstMousePos || !slot.isHoveredOrFocused()) continue; this.currentlyHovered = slot.icon; } } @Override public void renderBackground(GuiGraphics graphics, int mouseX, int mouseY, float a) { int xo = this.width / 2 - 62; int yo = this.height / 2 - 31 - 27; graphics.blit(RenderPipelines.GUI_TEXTURED, GAMEMODE_SWITCHER_LOCATION, xo, yo, 0.0f, 0.0f, 125, 75, 128, 128); } private void switchToHoveredGameMode() { GameModeSwitcherScreen.switchToHoveredGameMode(this.minecraft, this.currentlyHovered); } private static void switchToHoveredGameMode(Minecraft minecraft, GameModeIcon toGameMode) { if (!minecraft.canSwitchGameMode()) { return; } GameModeIcon currentGameMode = GameModeIcon.getFromGameType(minecraft.gameMode.getPlayerMode()); if (toGameMode != currentGameMode && GameModeCommand.PERMISSION_CHECK.check(minecraft.player.permissions())) { minecraft.player.connection.send(new ServerboundChangeGameModePacket(toGameMode.mode)); } } @Override public boolean keyPressed(KeyEvent event) { if (this.minecraft.options.keyDebugSwitchGameMode.matches(event)) { this.setFirstMousePos = false; this.currentlyHovered = this.currentlyHovered.getNext(); return true; } return super.keyPressed(event); } @Override public boolean keyReleased(KeyEvent event) { if (this.minecraft.options.keyDebugModifier.matches(event)) { this.switchToHoveredGameMode(); this.minecraft.setScreen(null); return true; } return super.keyReleased(event); } @Override public boolean isPauseScreen() { return false; } private static enum GameModeIcon { CREATIVE(Component.translatable("gameMode.creative"), GameType.CREATIVE, new ItemStack(Blocks.GRASS_BLOCK)), SURVIVAL(Component.translatable("gameMode.survival"), GameType.SURVIVAL, new ItemStack(Items.IRON_SWORD)), ADVENTURE(Component.translatable("gameMode.adventure"), GameType.ADVENTURE, new ItemStack(Items.MAP)), SPECTATOR(Component.translatable("gameMode.spectator"), GameType.SPECTATOR, new ItemStack(Items.ENDER_EYE)); private static final GameModeIcon[] VALUES; private static final int ICON_AREA = 16; private static final int ICON_TOP_LEFT = 5; private final Component name; private final GameType mode; private final ItemStack renderStack; private GameModeIcon(Component name, GameType mode, ItemStack renderStack) { this.name = name; this.mode = mode; this.renderStack = renderStack; } private void drawIcon(GuiGraphics graphics, int x, int y) { graphics.renderItem(this.renderStack, x, y); } private GameModeIcon getNext() { return switch (this.ordinal()) { default -> throw new MatchException(null, null); case 0 -> SURVIVAL; case 1 -> ADVENTURE; case 2 -> SPECTATOR; case 3 -> CREATIVE; }; } private static GameModeIcon getFromGameType(GameType gameType) { return switch (gameType) { default -> throw new MatchException(null, null); case GameType.SPECTATOR -> SPECTATOR; case GameType.SURVIVAL -> SURVIVAL; case GameType.CREATIVE -> CREATIVE; case GameType.ADVENTURE -> ADVENTURE; }; } static { VALUES = GameModeIcon.values(); } } public static class GameModeSlot extends AbstractWidget { private final GameModeIcon icon; private boolean isSelected; public GameModeSlot(GameModeIcon icon, int x, int y) { super(x, y, 26, 26, icon.name); this.icon = icon; } @Override public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float a) { this.drawSlot(graphics); if (this.isSelected) { this.drawSelection(graphics); } this.icon.drawIcon(graphics, this.getX() + 5, this.getY() + 5); } @Override public void updateWidgetNarration(NarrationElementOutput output) { this.defaultButtonNarrationText(output); } @Override public boolean isHoveredOrFocused() { return super.isHoveredOrFocused() || this.isSelected; } public void setSelected(boolean isSelected) { this.isSelected = isSelected; } private void drawSlot(GuiGraphics graphics) { graphics.blitSprite(RenderPipelines.GUI_TEXTURED, SLOT_SPRITE, this.getX(), this.getY(), 26, 26); } private void drawSelection(GuiGraphics graphics) { graphics.blitSprite(RenderPipelines.GUI_TEXTURED, SELECTION_SPRITE, this.getX(), this.getY(), 26, 26); } } }