Skip to content

Commit

Permalink
Add cache for FoodValues during JEI plugin running
Browse files Browse the repository at this point in the history
  • Loading branch information
SihenZhang authored and SeraphJACK committed Aug 12, 2024
1 parent 5dae290 commit dd6c872
Show file tree
Hide file tree
Showing 8 changed files with 57 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.sihenzhang.crockpot.CrockPot;
import com.sihenzhang.crockpot.base.FoodCategory;
import com.sihenzhang.crockpot.recipe.FoodValuesDefinition;
import com.sihenzhang.crockpot.util.I18nUtils;
import com.sihenzhang.crockpot.util.RLUtils;
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder;
Expand All @@ -13,11 +12,13 @@
import mezz.jei.api.recipe.RecipeType;
import mezz.jei.api.recipe.category.IRecipeCategory;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;

import java.util.List;
import java.util.Set;

public class FoodValuesCategory implements IRecipeCategory<FoodValuesDefinition.FoodCategoryMatchedItems> {
public static final RecipeType<FoodValuesDefinition.FoodCategoryMatchedItems> RECIPE_TYPE = RecipeType.create(CrockPot.MOD_ID, "food_values", FoodValuesDefinition.FoodCategoryMatchedItems.class);
public class FoodValuesCategory implements IRecipeCategory<FoodValuesCategory.FoodCategoryMatchedItems> {
public static final RecipeType<FoodValuesCategory.FoodCategoryMatchedItems> RECIPE_TYPE = RecipeType.create(CrockPot.MOD_ID, "food_values", FoodValuesCategory.FoodCategoryMatchedItems.class);
private final IDrawable background;
private final IDrawable icon;

Expand All @@ -27,7 +28,7 @@ public FoodValuesCategory(IGuiHelper guiHelper) {
}

@Override
public RecipeType<FoodValuesDefinition.FoodCategoryMatchedItems> getRecipeType() {
public RecipeType<FoodValuesCategory.FoodCategoryMatchedItems> getRecipeType() {
return RECIPE_TYPE;
}

Expand All @@ -47,11 +48,14 @@ public IDrawable getIcon() {
}

@Override
public void setRecipe(IRecipeLayoutBuilder builder, FoodValuesDefinition.FoodCategoryMatchedItems recipe, IFocusGroup focuses) {
public void setRecipe(IRecipeLayoutBuilder builder, FoodValuesCategory.FoodCategoryMatchedItems recipe, IFocusGroup focuses) {
var pagedItemStacks = JeiUtils.getPagedItemStacks(List.copyOf(recipe.items()), focuses, RecipeIngredientRole.INPUT, 45);
for (var i = 0; i < pagedItemStacks.size(); i++) {
builder.addSlot(RecipeIngredientRole.INPUT, 3 + i % 9 * 18, 26 + i / 9 * 18).addItemStacks(pagedItemStacks.get(i));
}
builder.addSlot(RecipeIngredientRole.OUTPUT, 75, 3).addItemStack(FoodCategory.getItemStack(recipe.category()));
}

public record FoodCategoryMatchedItems(FoodCategory category, Set<ItemStack> items) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.sihenzhang.crockpot.integration.jei;

import com.sihenzhang.crockpot.base.FoodCategory;
import com.sihenzhang.crockpot.recipe.FoodValuesDefinition;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;

import java.util.EnumMap;
import java.util.Map;
import java.util.Set;

public class FoodValuesDefinitionCache {
private static Map<FoodCategory, Set<ItemStack>> CACHE;

private FoodValuesDefinitionCache() {
}

public static void regenerate(Level level) {
var map = new EnumMap<FoodCategory, Set<ItemStack>>(FoodCategory.class);
for (var category : FoodCategory.values()) {
map.put(category, FoodValuesDefinition.getMatchedItems(category, level));
}
CACHE = Map.copyOf(map);
}

public static Set<ItemStack> getMatchedItems(FoodCategory category) {
var result = CACHE.get(category);
if (result.isEmpty()) {
return Set.of();
}
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraftforge.registries.ForgeRegistries;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -47,8 +48,9 @@ public void registerCategories(IRecipeCategoryRegistration registration) {
public void registerRecipes(IRecipeRegistration registration) {
var level = Minecraft.getInstance().level;
var recipeManager = level.getRecipeManager();
FoodValuesDefinitionCache.regenerate(level);
registration.addRecipes(CrockPotCookingRecipeCategory.RECIPE_TYPE, recipeManager.getAllRecipesFor(CrockPotRecipes.CROCK_POT_COOKING_RECIPE_TYPE.get()).stream().filter(r -> r.getResult().getItem() != CrockPotItems.AVAJ.get()).toList());
registration.addRecipes(FoodValuesCategory.RECIPE_TYPE, FoodValuesDefinition.getFoodCategoryMatchedItemsList(level));
registration.addRecipes(FoodValuesCategory.RECIPE_TYPE, Arrays.stream(FoodCategory.values()).map(category -> new FoodValuesCategory.FoodCategoryMatchedItems(category, FoodValuesDefinitionCache.getMatchedItems(category))).toList());
registration.addRecipes(ExplosionCraftingRecipeCategory.RECIPE_TYPE, recipeManager.getAllRecipesFor(CrockPotRecipes.EXPLOSION_CRAFTING_RECIPE_TYPE.get()));
var meatsGroupByMonster = FoodValuesDefinition.getMatchedItems(FoodCategory.MEAT, level).stream()
.collect(Collectors.groupingBy(item -> FoodValuesDefinition.getFoodValues(item, Minecraft.getInstance().level).has(FoodCategory.MONSTER)));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.sihenzhang.crockpot.integration.jei.gui.requirement;

import com.sihenzhang.crockpot.base.FoodCategory;
import com.sihenzhang.crockpot.recipe.FoodValuesDefinition;
import com.sihenzhang.crockpot.integration.jei.FoodValuesDefinitionCache;
import com.sihenzhang.crockpot.recipe.cooking.requirement.RequirementCategoryMax;
import com.sihenzhang.crockpot.util.MathUtils;
import net.minecraft.client.Minecraft;
Expand Down Expand Up @@ -34,7 +34,7 @@ public void draw(GuiGraphics guiGraphics, int xOffset, int yOffset) {

@Override
public List<ItemStack> getInvisibleInputs() {
return MathUtils.fuzzyIsZero(requirement.getMax()) ? List.of() : List.copyOf(FoodValuesDefinition.getMatchedItems(requirement.getCategory(), Minecraft.getInstance().level));
return MathUtils.fuzzyIsZero(requirement.getMax()) ? List.of() : List.copyOf(FoodValuesDefinitionCache.getMatchedItems(requirement.getCategory()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.sihenzhang.crockpot.integration.jei.gui.requirement;

import com.sihenzhang.crockpot.base.FoodCategory;
import com.sihenzhang.crockpot.recipe.FoodValuesDefinition;
import com.sihenzhang.crockpot.integration.jei.FoodValuesDefinitionCache;
import com.sihenzhang.crockpot.recipe.cooking.requirement.RequirementCategoryMaxExclusive;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
Expand Down Expand Up @@ -33,7 +33,7 @@ public void draw(GuiGraphics guiGraphics, int xOffset, int yOffset) {

@Override
public List<ItemStack> getInvisibleInputs() {
return List.copyOf(FoodValuesDefinition.getMatchedItems(requirement.getCategory(), Minecraft.getInstance().level));
return List.copyOf(FoodValuesDefinitionCache.getMatchedItems(requirement.getCategory()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.sihenzhang.crockpot.integration.jei.gui.requirement;

import com.sihenzhang.crockpot.base.FoodCategory;
import com.sihenzhang.crockpot.recipe.FoodValuesDefinition;
import com.sihenzhang.crockpot.integration.jei.FoodValuesDefinitionCache;
import com.sihenzhang.crockpot.recipe.cooking.requirement.RequirementCategoryMin;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
Expand Down Expand Up @@ -33,7 +33,7 @@ public void draw(GuiGraphics guiGraphics, int xOffset, int yOffset) {

@Override
public List<ItemStack> getInvisibleInputs() {
return List.copyOf(FoodValuesDefinition.getMatchedItems(requirement.getCategory(), Minecraft.getInstance().level));
return List.copyOf(FoodValuesDefinitionCache.getMatchedItems(requirement.getCategory()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.sihenzhang.crockpot.integration.jei.gui.requirement;

import com.sihenzhang.crockpot.base.FoodCategory;
import com.sihenzhang.crockpot.recipe.FoodValuesDefinition;
import com.sihenzhang.crockpot.integration.jei.FoodValuesDefinitionCache;
import com.sihenzhang.crockpot.recipe.cooking.requirement.RequirementCategoryMinExclusive;
import com.sihenzhang.crockpot.util.MathUtils;
import net.minecraft.client.Minecraft;
Expand Down Expand Up @@ -34,7 +34,7 @@ public void draw(GuiGraphics guiGraphics, int xOffset, int yOffset) {

@Override
public List<ItemStack> getInvisibleInputs() {
return List.copyOf(FoodValuesDefinition.getMatchedItems(requirement.getCategory(), Minecraft.getInstance().level));
return List.copyOf(FoodValuesDefinitionCache.getMatchedItems(requirement.getCategory()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.sihenzhang.crockpot.recipe;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.gson.JsonObject;
Expand All @@ -26,7 +25,10 @@

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class FoodValuesDefinition extends AbstractRecipe<Container> {
private final Set<ResourceLocation> names;
Expand Down Expand Up @@ -129,15 +131,6 @@ public static Set<ItemStack> getMatchedItems(FoodCategory category, Level level)
return builder.build();
}

@Nonnull
public static List<FoodCategoryMatchedItems> getFoodCategoryMatchedItemsList(Level level) {
var builder = ImmutableList.<FoodCategoryMatchedItems>builder();
for (var category : FoodCategory.values()) {
builder.add(new FoodCategoryMatchedItems(category, getMatchedItems(category, level)));
}
return builder.build();
}

@Override
@Nonnull
public RecipeSerializer<?> getSerializer() {
Expand All @@ -150,9 +143,6 @@ public RecipeType<?> getType() {
return CrockPotRecipes.FOOD_VALUES_RECIPE_TYPE.get();
}

public record FoodCategoryMatchedItems(FoodCategory category, Set<ItemStack> items) {
}

public static class Serializer implements RecipeSerializer<FoodValuesDefinition> {
@Override
public FoodValuesDefinition fromJson(ResourceLocation recipeId, JsonObject serializedRecipe) {
Expand Down

0 comments on commit dd6c872

Please sign in to comment.