aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2020-07-16 23:30:07 +0800
committershedaniel <daniel@shedaniel.me>2020-07-16 23:30:07 +0800
commit687e6503f44b504db141ed777588c2bdfa2184ca (patch)
tree2337de861656d600ad713527868a066844fb364c /src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java
parentbe6a2ca9f20059d19907230425ca258f908d5644 (diff)
downloadRoughlyEnoughItems-687e6503f44b504db141ed777588c2bdfa2184ca.tar.gz
RoughlyEnoughItems-687e6503f44b504db141ed777588c2bdfa2184ca.tar.bz2
RoughlyEnoughItems-687e6503f44b504db141ed777588c2bdfa2184ca.zip
Added FocusedStackProvider api.
Optimised item rendering. Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java')
-rw-r--r--src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java66
1 files changed, 53 insertions, 13 deletions
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<DisplayVisibilityHandler> VISIBILITY_HANDLER_COMPARATOR;
+ private static final Comparator<FocusedStackProvider> FOCUSED_STACK_PROVIDER_COMPARATOR = Comparator.comparingDouble(FocusedStackProvider::getPriority).reversed();
+ private static final Comparator<DisplayVisibilityHandler> VISIBILITY_HANDLER_COMPARATOR = Comparator.comparingDouble(DisplayVisibilityHandler::getPriority).reversed();
@SuppressWarnings("rawtypes")
private static final Comparator<Recipe> RECIPE_COMPARATOR = Comparator.comparing((Recipe o) -> o.getId().getNamespace()).thenComparing(o -> o.getId().getPath());
- static {
- Comparator<DisplayVisibilityHandler> comparator = Comparator.comparingDouble(DisplayVisibilityHandler::getPriority);
- VISIBILITY_HANDLER_COMPARATOR = comparator.reversed();
- }
-
- private final List<AutoTransferHandler> autoTransferHandlers = Lists.newLinkedList();
- private final List<RecipeFunction> recipeFunctions = Lists.newLinkedList();
- private final List<ScreenClickArea> screenClickAreas = Lists.newLinkedList();
+ private final List<FocusedStackProvider> focusedStackProviders = Lists.newArrayList();
+ private final List<AutoTransferHandler> autoTransferHandlers = Lists.newArrayList();
+ private final List<RecipeFunction> recipeFunctions = Lists.newArrayList();
+ private final List<ScreenClickArea> screenClickAreas = Lists.newArrayList();
private final int[] recipeCount = {0};
private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
private final Map<RecipeCategory<?>, Identifier> categories = Maps.newLinkedHashMap();
private final Map<Identifier, RecipeCategory<?>> reversedCategories = Maps.newHashMap();
- private final Map<Identifier, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newLinkedHashMap();
- private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newLinkedHashMap();
- private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newLinkedList();
- private final List<LiveRecipeGenerator<RecipeDisplay>> liveRecipeGenerators = Lists.newLinkedList();
+ private final Map<Identifier, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newHashMap();
+ private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newHashMap();
+ private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newArrayList();
+ private final List<LiveRecipeGenerator<RecipeDisplay>> 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<EntryStack> 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) {
@@ -479,6 +498,27 @@ public class RecipeHelperImpl implements RecipeHelper {
}
@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<EntryStack> 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<AutoTransferHandler> getSortedAutoCraftingHandler() {
return autoTransferHandlers.stream().sorted(Comparator.comparingDouble(AutoTransferHandler::getPriority).reversed()).collect(Collectors.toList());
}