From 687e6503f44b504db141ed777588c2bdfa2184ca Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 16 Jul 2020 23:30:07 +0800 Subject: Added FocusedStackProvider api. Optimised item rendering. Signed-off-by: shedaniel --- .../me/shedaniel/rei/impl/RecipeHelperImpl.java | 66 +++++++++++++++++----- 1 file changed, 53 insertions(+), 13 deletions(-) (limited to 'src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java') diff --git a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java index b9d23b679..66e9e33ef 100644 --- a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java @@ -36,13 +36,17 @@ import me.shedaniel.rei.impl.subsets.SubsetsRegistryImpl; import me.shedaniel.rei.utils.CollectionUtils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.ContainerScreen; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeManager; import net.minecraft.util.ActionResult; import net.minecraft.util.Identifier; +import net.minecraft.util.TypedActionResult; import net.minecraft.util.Util; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Consumer; @@ -54,26 +58,23 @@ import java.util.stream.Collectors; @Environment(EnvType.CLIENT) public class RecipeHelperImpl implements RecipeHelper { - private static final Comparator VISIBILITY_HANDLER_COMPARATOR; + private static final Comparator FOCUSED_STACK_PROVIDER_COMPARATOR = Comparator.comparingDouble(FocusedStackProvider::getPriority).reversed(); + private static final Comparator VISIBILITY_HANDLER_COMPARATOR = Comparator.comparingDouble(DisplayVisibilityHandler::getPriority).reversed(); @SuppressWarnings("rawtypes") private static final Comparator RECIPE_COMPARATOR = Comparator.comparing((Recipe o) -> o.getId().getNamespace()).thenComparing(o -> o.getId().getPath()); - static { - Comparator comparator = Comparator.comparingDouble(DisplayVisibilityHandler::getPriority); - VISIBILITY_HANDLER_COMPARATOR = comparator.reversed(); - } - - private final List autoTransferHandlers = Lists.newLinkedList(); - private final List recipeFunctions = Lists.newLinkedList(); - private final List screenClickAreas = Lists.newLinkedList(); + private final List focusedStackProviders = Lists.newArrayList(); + private final List autoTransferHandlers = Lists.newArrayList(); + private final List recipeFunctions = Lists.newArrayList(); + private final List screenClickAreas = Lists.newArrayList(); private final int[] recipeCount = {0}; private final Map> recipeCategoryListMap = Maps.newLinkedHashMap(); private final Map, Identifier> categories = Maps.newLinkedHashMap(); private final Map> reversedCategories = Maps.newHashMap(); - private final Map autoCraftAreaSupplierMap = Maps.newLinkedHashMap(); - private final Map>> categoryWorkingStations = Maps.newLinkedHashMap(); - private final List displayVisibilityHandlers = Lists.newLinkedList(); - private final List> liveRecipeGenerators = Lists.newLinkedList(); + private final Map autoCraftAreaSupplierMap = Maps.newHashMap(); + private final Map>> categoryWorkingStations = Maps.newHashMap(); + private final List displayVisibilityHandlers = Lists.newArrayList(); + private final List> liveRecipeGenerators = Lists.newArrayList(); private RecipeManager recipeManager; private boolean arePluginsLoading = false; @@ -362,6 +363,7 @@ public class RecipeHelperImpl implements RecipeHelper { this.displayVisibilityHandlers.clear(); this.liveRecipeGenerators.clear(); this.autoTransferHandlers.clear(); + this.focusedStackProviders.clear(); ((SubsetsRegistryImpl) SubsetsRegistry.INSTANCE).reset(); ((FluidSupportProviderImpl) FluidSupportProvider.INSTANCE).reset(); ((DisplayHelperImpl) DisplayHelper.getInstance()).resetData(); @@ -424,6 +426,23 @@ public class RecipeHelperImpl implements RecipeHelper { return -1f; } }); + registerFocusedStackProvider(new FocusedStackProvider() { + @Override + @NotNull + public TypedActionResult provide(Screen screen) { + if (screen instanceof ContainerScreen) { + ContainerScreen containerScreen = (ContainerScreen) screen; + if (containerScreen.focusedSlot != null && !containerScreen.focusedSlot.getStack().isEmpty()) + return TypedActionResult.success(EntryStack.create(containerScreen.focusedSlot.getStack())); + } + return TypedActionResult.pass(EntryStack.empty()); + } + + @Override + public double getPriority() { + return -1.0; + } + }); DisplayHelper.getInstance().registerHandler(new OverlayDecider() { @Override public boolean isHandingScreen(Class screen) { @@ -478,6 +497,27 @@ public class RecipeHelperImpl implements RecipeHelper { return handler; } + @Override + public void registerFocusedStackProvider(FocusedStackProvider provider) { + focusedStackProviders.add(provider); + focusedStackProviders.sort(FOCUSED_STACK_PROVIDER_COMPARATOR); + } + + @Override + @Nullable + public EntryStack getScreenFocusedStack(Screen screen) { + for (FocusedStackProvider provider : focusedStackProviders) { + TypedActionResult result = Objects.requireNonNull(provider.provide(screen)); + if (result.getResult() == ActionResult.SUCCESS) { + if (!result.getValue().isEmpty()) + return result.getValue(); + return null; + } else if (result.getResult() == ActionResult.FAIL) + return null; + } + return null; + } + @Override public List getSortedAutoCraftingHandler() { return autoTransferHandlers.stream().sorted(Comparator.comparingDouble(AutoTransferHandler::getPriority).reversed()).collect(Collectors.toList()); -- cgit