MenuScreens.java

net.minecraft.client.gui.screens.MenuScreens

信息

  • 全限定名:net.minecraft.client.gui.screens.MenuScreens
  • 类型:public class
  • 包:net.minecraft.client.gui.screens
  • 源码路径:src/main/java/net/minecraft/client/gui/screens/MenuScreens.java
  • 起始行号:L39
  • 职责:

    TODO

字段/常量

  • LOGGER

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

      TODO

  • SCREENS

    • 类型: Map<MenuType<?>,MenuScreens.ScreenConstructor<?,?>>
    • 修饰符: private static final
    • 源码定位: L41
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.gui.screens.MenuScreens.ScreenConstructor
    • 类型: interface
    • 修饰符: private
    • 源码定位: L107
    • 说明:

      TODO

构造器

方法

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

public static <T extends AbstractContainerMenu> void create(MenuType<T> type, Minecraft minecraft, int containerId, Component title) @ L43

  • 方法名:create
  • 源码定位:L43
  • 返回类型: void
  • 修饰符:public static

参数:

  • type: MenuType
  • minecraft: Minecraft
  • containerId: int
  • title: Component

说明:

TODO

private static <T extends AbstractContainerMenu> MenuScreens.ScreenConstructor<T,?> getConstructor(MenuType<T> type) @ L52

  • 方法名:getConstructor
  • 源码定位:L52
  • 返回类型: MenuScreens.ScreenConstructor<T,?>
  • 修饰符:private static

参数:

  • type: MenuType

说明:

TODO

private static <M extends AbstractContainerMenu,U extends Screen &MenuAccess<M>> void register(MenuType<?extends M> type, MenuScreens.ScreenConstructor<M,U> factory) @ L56

  • 方法名:register
  • 源码定位:L56
  • 返回类型:<M extends AbstractContainerMenu,U extends Screen &MenuAccess> void
  • 修饰符:private static

参数:

  • type: MenuType<?extends M>
  • factory: MenuScreens.ScreenConstructor<M,U>

说明:

TODO

public static boolean selfTest() @ L65

  • 方法名:selfTest
  • 源码定位:L65
  • 返回类型:boolean
  • 修饰符:public static

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class MenuScreens {
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final Map<MenuType<?>, MenuScreens.ScreenConstructor<?, ?>> SCREENS = Maps.newHashMap();
 
    public static <T extends AbstractContainerMenu> void create(MenuType<T> type, Minecraft minecraft, int containerId, Component title) {
        MenuScreens.ScreenConstructor<T, ?> constructor = getConstructor(type);
        if (constructor == null) {
            LOGGER.warn("Failed to create screen for menu type: {}", BuiltInRegistries.MENU.getKey(type));
        } else {
            constructor.fromPacket(title, type, minecraft, containerId);
        }
    }
 
    private static <T extends AbstractContainerMenu> MenuScreens.@Nullable ScreenConstructor<T, ?> getConstructor(MenuType<T> type) {
        return (MenuScreens.ScreenConstructor<T, ?>)SCREENS.get(type);
    }
 
    private static <M extends AbstractContainerMenu, U extends Screen & MenuAccess<M>> void register(
        MenuType<? extends M> type, MenuScreens.ScreenConstructor<M, U> factory
    ) {
        MenuScreens.ScreenConstructor<?, ?> prev = SCREENS.put(type, factory);
        if (prev != null) {
            throw new IllegalStateException("Duplicate registration for " + BuiltInRegistries.MENU.getKey(type));
        }
    }
 
    public static boolean selfTest() {
        boolean failed = false;
 
        for (MenuType<?> menuType : BuiltInRegistries.MENU) {
            if (!SCREENS.containsKey(menuType)) {
                LOGGER.debug("Menu {} has no matching screen", BuiltInRegistries.MENU.getKey(menuType));
                failed = true;
            }
        }
 
        return failed;
    }
 
    static {
        register(MenuType.GENERIC_9x1, ContainerScreen::new);
        register(MenuType.GENERIC_9x2, ContainerScreen::new);
        register(MenuType.GENERIC_9x3, ContainerScreen::new);
        register(MenuType.GENERIC_9x4, ContainerScreen::new);
        register(MenuType.GENERIC_9x5, ContainerScreen::new);
        register(MenuType.GENERIC_9x6, ContainerScreen::new);
        register(MenuType.GENERIC_3x3, DispenserScreen::new);
        register(MenuType.CRAFTER_3x3, CrafterScreen::new);
        register(MenuType.ANVIL, AnvilScreen::new);
        register(MenuType.BEACON, BeaconScreen::new);
        register(MenuType.BLAST_FURNACE, BlastFurnaceScreen::new);
        register(MenuType.BREWING_STAND, BrewingStandScreen::new);
        register(MenuType.CRAFTING, CraftingScreen::new);
        register(MenuType.ENCHANTMENT, EnchantmentScreen::new);
        register(MenuType.FURNACE, FurnaceScreen::new);
        register(MenuType.GRINDSTONE, GrindstoneScreen::new);
        register(MenuType.HOPPER, HopperScreen::new);
        register(MenuType.LECTERN, LecternScreen::new);
        register(MenuType.LOOM, LoomScreen::new);
        register(MenuType.MERCHANT, MerchantScreen::new);
        register(MenuType.SHULKER_BOX, ShulkerBoxScreen::new);
        register(MenuType.SMITHING, SmithingScreen::new);
        register(MenuType.SMOKER, SmokerScreen::new);
        register(MenuType.CARTOGRAPHY_TABLE, CartographyTableScreen::new);
        register(MenuType.STONECUTTER, StonecutterScreen::new);
    }
 
    @OnlyIn(Dist.CLIENT)
    private interface ScreenConstructor<T extends AbstractContainerMenu, U extends Screen & MenuAccess<T>> {
        default void fromPacket(Component title, MenuType<T> type, Minecraft minecraft, int containerId) {
            U screen = this.create(type.create(containerId, minecraft.player.getInventory()), minecraft.player.getInventory(), title);
            minecraft.player.containerMenu = screen.getMenu();
            minecraft.setScreen(screen);
        }
 
        U create(T menu, Inventory inventory, final Component title);
    }
}

引用的其他类