diff --git a/common/src/main/java/me/shedaniel/architectury/registry/ScreenRegisters.java b/common/src/main/java/me/shedaniel/architectury/registry/ScreenRegisters.java new file mode 100644 index 00000000..fe8567d8 --- /dev/null +++ b/common/src/main/java/me/shedaniel/architectury/registry/ScreenRegisters.java @@ -0,0 +1,65 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021 shedaniel + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package me.shedaniel.architectury.registry; + +import java.util.function.BiFunction; + +import me.shedaniel.architectury.ExpectPlatform; + +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +public class ScreenRegisters { + @ExpectPlatform + public static MenuType registerSimpleMenuType(ResourceLocation identifier, BiFunction menuTypeSupplier) { + throw new AssertionError(); + } + + @ExpectPlatform + public static MenuType registerExtendedMenuType(ResourceLocation identifier, ExtendedMenuTypeFactory menuTypeSupplier) { + throw new AssertionError(); + } + + @Environment(EnvType.CLIENT) + @ExpectPlatform + public static > void registerScreenFactory(MenuType menuType, ScreenFactory screenSupplier) { + throw new AssertionError(); + } + + @Environment(EnvType.CLIENT) + @FunctionalInterface + public interface ScreenFactory> { + S create(H var1, Inventory var2, Component var3); + } + + @FunctionalInterface + public interface ExtendedMenuTypeFactory { + T create(int var1, Inventory var2, FriendlyByteBuf var3); + } +} diff --git a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ScreenRegistersImpl.java b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ScreenRegistersImpl.java new file mode 100644 index 00000000..3b526555 --- /dev/null +++ b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ScreenRegistersImpl.java @@ -0,0 +1,53 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021 shedaniel + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package me.shedaniel.architectury.registry.fabric; + +import java.util.function.BiFunction; + +import me.shedaniel.architectury.ExpectPlatform; +import me.shedaniel.architectury.registry.ScreenRegisters; + +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; +import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; + +public class ScreenRegistersImpl { + public static MenuType registerMenuType(ResourceLocation identifier, BiFunction menuTypeSupplier) { + return ScreenHandlerRegistry.registerSimple(identifier, (integer, inventory) -> menuTypeSupplier.apply(integer, inventory)); + } + + public static MenuType registerExtendedMenuType(ResourceLocation identifier, ScreenRegisters.ExtendedMenuTypeFactory menuTypeSupplier) { + return ScreenHandlerRegistry.registerExtended(identifier, (integer, inventory, friendlyByteBuf) -> menuTypeSupplier.create(integer, inventory, friendlyByteBuf)); + } + + @Environment(EnvType.CLIENT) + public static > void registerScreenFactory(MenuType menuType, ScreenRegisters.ScreenFactory screenSupplier) { + ScreenRegistry.register(menuType, (H h, Inventory i, Component t) -> screenSupplier.create(h, i, t)); + } +} diff --git a/forge/src/main/java/me/shedaniel/architectury/registry/forge/ScreenRegistersImpl.java b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ScreenRegistersImpl.java new file mode 100644 index 00000000..dcea8981 --- /dev/null +++ b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ScreenRegistersImpl.java @@ -0,0 +1,60 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021 shedaniel + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package me.shedaniel.architectury.registry.forge; + +import java.util.function.BiFunction; + +import me.shedaniel.architectury.forge.ArchitecturyForge; +import me.shedaniel.architectury.registry.DeferredRegister; +import me.shedaniel.architectury.registry.ScreenRegisters; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.extensions.IForgeContainerType; + +import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.core.Registry; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; + +public class ScreenRegistersImpl { + private static final DeferredRegister MENU_TYPE_REGISTRY = DeferredRegister.create(ArchitecturyForge.MOD_ID, Registry.MENU_REGISTRY); + + public static MenuType registerMenuType(ResourceLocation identifier, BiFunction menuTypeSupplier) { + MenuType menuType = IForgeContainerType.create((windowId, inv, data) -> menuTypeSupplier.apply(windowId, inv)); + MENU_TYPE_REGISTRY.register(identifier, () -> menuType); + return menuType; + } + + public static MenuType registerExtendedMenuType(ResourceLocation identifier, ScreenRegisters.ExtendedMenuTypeFactory menuTypeSupplier) { + MenuType menuType = IForgeContainerType.create((windowId, inv, data) -> menuTypeSupplier.create(windowId, inv, data)); + MENU_TYPE_REGISTRY.register(identifier, () -> menuType); + return menuType; + } + + @OnlyIn(Dist.CLIENT) + public static > void registerScreenFactory(MenuType menuType, ScreenRegisters.ScreenFactory screenSupplier) { + MenuScreens.register(menuType, (H t, Inventory i, Component c) -> screenSupplier.create(t, i, c)); + } +}