From ab5157b7b9637affad1b162808ddedefdee42e69 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Tue, 2 Nov 2021 16:06:10 +0800 Subject: Refactor MenuInfoProvider to give more concrete info --- .../shedaniel/rei/impl/client/view/ViewsImpl.java | 72 +++++++++++----------- .../rei/impl/common/transfer/InputSlotCrafter.java | 16 +++-- .../impl/common/transfer/MenuInfoRegistryImpl.java | 28 ++++++++- .../autocrafting/DefaultCategoryHandler.java | 2 +- 4 files changed, 75 insertions(+), 43 deletions(-) (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index d5e73916d..a76cce52f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -280,44 +280,46 @@ public class ViewsImpl implements Views { AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; Set> craftables = new HashSet<>(); for (Map.Entry, List> entry : DisplayRegistry.getInstance().getAll().entrySet()) { - MenuInfo info = menu != null ? - (MenuInfo) MenuInfoRegistry.getInstance().get(entry.getKey(), menu.getClass()) - : null; - - class InfoContext implements MenuInfoContext { - private Display display; - - @Override - public AbstractContainerMenu getMenu() { - return menu; - } - - @Override - public LocalPlayer getPlayerEntity() { - return Minecraft.getInstance().player; - } - - @Override - public MenuInfo getContainerInfo() { - return info; - } + List displays = entry.getValue(); + for (Display display : displays) { + MenuInfo info = menu != null ? + MenuInfoRegistry.getInstance().getClient(display, menu) + : null; - @Override - public CategoryIdentifier getCategoryIdentifier() { - return (CategoryIdentifier) entry.getKey(); + class InfoContext implements MenuInfoContext { + private Display display; + + public InfoContext(Display display) { + this.display = display; + } + + @Override + public AbstractContainerMenu getMenu() { + return menu; + } + + @Override + public LocalPlayer getPlayerEntity() { + return Minecraft.getInstance().player; + } + + @Override + public MenuInfo getContainerInfo() { + return info; + } + + @Override + public CategoryIdentifier getCategoryIdentifier() { + return (CategoryIdentifier) entry.getKey(); + } + + @Override + public Display getDisplay() { + return display; + } } - @Override - public Display getDisplay() { - return display; - } - } - - InfoContext context = new InfoContext(); - - List displays = entry.getValue(); - for (Display display : displays) { - context.display = display; + InfoContext context = new InfoContext(display); Iterable inputSlots = info != null ? info.getInputSlots(context) : Collections.emptySet(); int slotsCraftable = 0; List requiredInput = display.getRequiredEntries(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java index 8c5df5b53..aa233ca85 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java @@ -55,16 +55,24 @@ public class InputSlotCrafter inventoryStacks; private ServerPlayer player; - private InputSlotCrafter(CategoryIdentifier category, T container, CompoundTag display, MenuInfo menuInfo) { + private InputSlotCrafter(CategoryIdentifier category, T container) { this.category = category; this.container = container; + } + + public void setDisplay(D display) { + this.display = display; + } + + public void setMenuInfo(MenuInfo menuInfo) { this.menuInfo = menuInfo; - this.display = menuInfo.read(this, display); } public static InputSlotCrafter start(CategoryIdentifier category, T menu, ServerPlayer player, CompoundTag display, boolean hasShift) { - MenuInfo menuInfo = Objects.requireNonNull(MenuInfoRegistry.getInstance().get(category, (Class) menu.getClass()), "Container Info does not exist on the server!"); - InputSlotCrafter crafter = new InputSlotCrafter<>(category, menu, display, menuInfo); + InputSlotCrafter crafter = new InputSlotCrafter<>(category, menu); + MenuInfo menuInfo = Objects.requireNonNull(MenuInfoRegistry.getInstance().get(category, menu, crafter, display), "Container Info does not exist on the server!"); + crafter.setMenuInfo(menuInfo); + crafter.setDisplay(menuInfo.read(crafter, display)); crafter.fillInputSlots(player, hasShift); return crafter; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java index bf84c1808..a42cf8d89 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java @@ -31,12 +31,17 @@ import me.shedaniel.rei.api.common.plugins.REIServerPlugin; import me.shedaniel.rei.api.common.transfer.info.MenuInfo; import me.shedaniel.rei.api.common.transfer.info.MenuInfoProvider; import me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry; +import me.shedaniel.rei.api.common.transfer.info.MenuSerializationProviderContext; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.inventory.AbstractContainerMenu; import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.Function; import java.util.function.Predicate; public class MenuInfoRegistryImpl implements MenuInfoRegistry { @@ -58,11 +63,28 @@ public class MenuInfoRegistryImpl implements MenuInfoRegistry { @Override @Nullable public MenuInfo get(CategoryIdentifier category, Class menuClass) { + return getInternal(category, menuClass, provider -> provider.provide(category, menuClass)); + } + + @Override + @Nullable + @Environment(EnvType.CLIENT) + public MenuInfo getClient(D display, C menu) { + return getInternal((CategoryIdentifier) display.getCategoryIdentifier(), (Class) menu.getClass(), provider -> provider.provideClient(display, menu)); + } + + @Override + @Nullable + public MenuInfo get(CategoryIdentifier category, C menu, MenuSerializationProviderContext context, CompoundTag tag) { + return getInternal(category, (Class) menu.getClass(), provider -> provider.provide(category, menu, context, tag)); + } + + private MenuInfo getInternal(CategoryIdentifier category, Class menuClass, Function, Optional>> function) { Map, List>> infoMap = map.get(category); if (infoMap != null && !infoMap.isEmpty()) { if (infoMap.containsKey(menuClass)) { for (MenuInfoProvider provider : infoMap.get(menuClass)) { - Optional> info = ((MenuInfoProvider) provider).provide(category, menuClass); + Optional> info = function.apply((MenuInfoProvider) provider); if (info.isPresent()) { return info.get(); } @@ -71,7 +93,7 @@ public class MenuInfoRegistryImpl implements MenuInfoRegistry { for (Map.Entry, List>> entry : infoMap.entrySet()) { if (entry.getKey().isAssignableFrom(menuClass)) { for (MenuInfoProvider provider : entry.getValue()) { - Optional> info = ((MenuInfoProvider) provider).provide(category, menuClass); + Optional> info = function.apply((MenuInfoProvider) provider); if (info.isPresent()) { return info.get(); } @@ -84,7 +106,7 @@ public class MenuInfoRegistryImpl implements MenuInfoRegistry { if (entry.getKey().test(category) && !entry.getValue().isEmpty()) { List> infoList = entry.getValue(); if (!infoList.isEmpty()) { - Optional> info = ((MenuInfoProvider) infoList.get(0)).provide(category, menuClass); + Optional> info = function.apply((MenuInfoProvider) infoList.get(0)); if (info.isPresent()) { return info.get(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java b/runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java index 0e6e3c4d1..a890ac95b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java @@ -61,7 +61,7 @@ public class DefaultCategoryHandler implements TransferHandler { return Result.createNotApplicable(); } AbstractContainerMenu menu = context.getMenu(); - MenuInfo menuInfo = MenuInfoRegistry.getInstance().get((CategoryIdentifier) display.getCategoryIdentifier(), (Class) menu.getClass()); + MenuInfo menuInfo = MenuInfoRegistry.getInstance().getClient(display, menu); if (menuInfo == null) { return Result.createNotApplicable(); } -- cgit