/
InternalRecipeRegistryPlugin.java
118 lines (103 loc) · 4.38 KB
/
InternalRecipeRegistryPlugin.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package mezz.jei;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ListMultimap;
import mezz.jei.api.ingredients.IIngredientHelper;
import mezz.jei.api.ingredients.IIngredientRegistry;
import mezz.jei.api.recipe.IFocus;
import mezz.jei.api.recipe.IRecipeCategory;
import mezz.jei.api.recipe.IRecipeRegistryPlugin;
import mezz.jei.api.recipe.IRecipeWrapper;
import mezz.jei.util.IngredientUtil;
import mezz.jei.util.RecipeMap;
public class InternalRecipeRegistryPlugin implements IRecipeRegistryPlugin {
private RecipeRegistry recipeRegistry;
private ImmutableMultimap<String, String> categoriesForCraftItemKeys;
private IIngredientRegistry ingredientRegistry;
private ImmutableMap<String, IRecipeCategory> recipeCategoriesMap;
private RecipeMap recipeInputMap;
private RecipeMap recipeOutputMap;
private ListMultimap<IRecipeCategory, IRecipeWrapper> recipeWrappersForCategories;
public InternalRecipeRegistryPlugin(RecipeRegistry recipeRegistry, ImmutableMultimap<String, String> categoriesForCraftItemKeys, IIngredientRegistry ingredientRegistry, ImmutableMap<String, IRecipeCategory> recipeCategoriesMap, RecipeMap recipeInputMap, RecipeMap recipeOutputMap, ListMultimap<IRecipeCategory, IRecipeWrapper> recipeWrappersForCategories) {
this.recipeRegistry = recipeRegistry;
this.categoriesForCraftItemKeys = categoriesForCraftItemKeys;
this.ingredientRegistry = ingredientRegistry;
this.recipeCategoriesMap = recipeCategoriesMap;
this.recipeInputMap = recipeInputMap;
this.recipeOutputMap = recipeOutputMap;
this.recipeWrappersForCategories = recipeWrappersForCategories;
}
@Override
public <V> List<String> getRecipeCategoryUids(IFocus<V> focus) {
if (focus.getMode() == IFocus.Mode.NONE) {
return getRecipeCategories();
}
V ingredient = focus.getValue();
if (ingredient == null) {
return getRecipeCategories();
}
switch (focus.getMode()) {
case INPUT:
return recipeInputMap.getRecipeCategories(ingredient);
case OUTPUT:
return recipeOutputMap.getRecipeCategories(ingredient);
default:
return getRecipeCategories();
}
}
private ImmutableList<String> getRecipeCategories() {
ImmutableList.Builder<String> builder = ImmutableList.builder();
for (Map.Entry<String, IRecipeCategory> entry : recipeCategoriesMap.entrySet()) {
IRecipeCategory recipeCategory = entry.getValue();
if (!recipeRegistry.getRecipeWrappers(recipeCategory).isEmpty()) {
builder.add(entry.getKey());
}
}
return builder.build();
}
@Override
public <T extends IRecipeWrapper, V> List<T> getRecipeWrappers(IRecipeCategory<T> recipeCategory, IFocus<V> focus) {
if (focus.getMode() == IFocus.Mode.NONE) {
return getRecipeWrappers(recipeCategory);
}
V ingredient = focus.getValue();
if (ingredient == null) {
return getRecipeWrappers(recipeCategory);
}
IIngredientHelper<V> ingredientHelper = ingredientRegistry.getIngredientHelper(ingredient);
if (focus.getMode() == IFocus.Mode.INPUT) {
final ImmutableList<T> recipes = recipeInputMap.getRecipeWrappers(recipeCategory, ingredient);
String recipeCategoryUid = recipeCategory.getUid();
for (String inputKey : IngredientUtil.getUniqueIdsWithWildcard(ingredientHelper, ingredient)) {
if (categoriesForCraftItemKeys.get(inputKey).contains(recipeCategoryUid)) {
ImmutableSet<T> specificRecipes = ImmutableSet.copyOf(recipes);
//noinspection unchecked
List<T> recipesForCategory = (List<T>) recipeWrappersForCategories.get(recipeCategory);
List<T> allRecipes = new ArrayList<T>(recipes);
for (T recipe : recipesForCategory) {
if (!specificRecipes.contains(recipe)) {
allRecipes.add(recipe);
}
}
return allRecipes;
}
}
return recipes;
} else if (focus.getMode() == IFocus.Mode.OUTPUT) {
return recipeOutputMap.getRecipeWrappers(recipeCategory, ingredient);
} else {
return getRecipeWrappers(recipeCategory);
}
}
private <T extends IRecipeWrapper> List<T> getRecipeWrappers(IRecipeCategory<T> recipeCategory) {
//noinspection unchecked
List<T> recipeWrappers = (List<T>) recipeWrappersForCategories.get(recipeCategory);
return Collections.unmodifiableList(recipeWrappers);
}
}