package lv.enes.mc.eris_alchemy.client; import lv.enes.mc.eris_alchemy.block.entity.AlchemicalChestEntity; import lv.enes.mc.eris_alchemy.block.entity.EnergyCondenserEntity; import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry.DynamicItemRenderer; import net.minecraft.client.gui.screens.MenuScreens.ScreenConstructor; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.MenuAccess; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.ChestRenderer; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import java.util.LinkedHashMap; import java.util.Map; import java.util.function.BiConsumer; import static lv.enes.mc.eris_alchemy.ErisAlchemyRegistry.*; public final class ErisAlchemyClientRegistry { private ErisAlchemyClientRegistry() {} public static final class BlockEntityRenderers { private BlockEntityRenderers() {} @FunctionalInterface public interface Consumer { void consume(BlockEntityType type, BlockEntityRendererProvider provider); } public static void consume(Consumer consumer) { data.values().forEach(pair -> pair.beConsumed(consumer)); } private record Pair( BlockEntityType type, BlockEntityRendererProvider provider ) { public void beConsumed(Consumer consumer) { consumer.consume(type, provider); } } private static final Map, Pair> data = new LinkedHashMap<>(); private static void register( BlockEntityType type, BlockEntityRendererProvider provider ) { data.put(type, new Pair<>(type, provider)); } static { register(BlockEntities.ALCHEMICAL_CHEST, ChestRenderer::new); register(BlockEntities.ENERGY_CONDENSER, ChestRenderer::new); } } public static final class ItemRenderers { private ItemRenderers() {} public static void consume(BiConsumer consumer) { data.forEach(consumer); } private static final Map data = new LinkedHashMap<>(); private static void register(ItemLike item, DynamicItemRenderer renderer) { data.put(item, renderer); } static { register( Items.ALCHEMICAL_CHEST, new ChestItemRenderer<>(Blocks.ALCHEMICAL_CHEST, AlchemicalChestEntity::new)::renderByItem ); register( Items.ENERGY_CONDENSER, new ChestItemRenderer<>(Blocks.ENERGY_CONDENSER, EnergyCondenserEntity::new)::renderByItem ); } } public static final class MenuScreens { private MenuScreens() {} @FunctionalInterface public interface Consumer { > void consume(MenuType menu, ScreenConstructor constructor); } public static void consume(Consumer consumer) { data.values().forEach(pair -> pair.beConsumed(consumer)); } private record Pair>( MenuType menu, ScreenConstructor constructor ) { public void beConsumed(Consumer consumer) { consumer.consume(menu, constructor); } } private static final Map, Pair> data = new LinkedHashMap<>(); private static > void register( MenuType menu, ScreenConstructor constructor ) { data.put(menu, new Pair<>(menu, constructor)); } static { register(Menus.ALCHEMICAL_CHEST, AlchemicalChestScreen::new); register(Menus.ENERGY_CONDENSER, EnergyCondenserScreen::new); } } }