Skip to content

Commit 8c0f8c8

Browse files
Two-Phase Recipe Addition System (#3981)
Co-authored-by: jurrejelle <jurre@jilles.com>
1 parent e3ce902 commit 8c0f8c8

29 files changed

+858
-853
lines changed

src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.jetbrains.annotations.NotNull;
4141
import org.jetbrains.annotations.Nullable;
4242
import org.jetbrains.annotations.UnknownNullability;
43+
import org.jetbrains.annotations.Unmodifiable;
4344

4445
import java.util.*;
4546
import java.util.stream.Collectors;
@@ -72,7 +73,7 @@ public FluidIngredient copyWithModifier(FluidIngredient content, ContentModifier
7273
}
7374

7475
@Override
75-
public List<Object> compressIngredients(Collection<Object> ingredients) {
76+
public List<Object> compressIngredients(@Unmodifiable Collection<Object> ingredients) {
7677
List<Object> list = new ObjectArrayList<>(ingredients.size());
7778
for (Object item : ingredients) {
7879
if (item instanceof FluidIngredient fluid) {

src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.jetbrains.annotations.NotNull;
4747
import org.jetbrains.annotations.Nullable;
4848
import org.jetbrains.annotations.UnknownNullability;
49+
import org.jetbrains.annotations.Unmodifiable;
4950

5051
import java.util.*;
5152
import java.util.stream.Collectors;
@@ -78,7 +79,7 @@ public Ingredient copyWithModifier(Ingredient content, ContentModifier modifier)
7879
}
7980

8081
@Override
81-
public List<Object> compressIngredients(Collection<Object> ingredients) {
82+
public List<Object> compressIngredients(@Unmodifiable Collection<Object> ingredients) {
8283
List<Object> list = new ObjectArrayList<>(ingredients.size());
8384
for (Object item : ingredients) {
8485
if (item instanceof Ingredient ingredient) {

src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.commons.lang3.mutable.MutableInt;
2626
import org.jetbrains.annotations.NotNull;
2727
import org.jetbrains.annotations.Nullable;
28+
import org.jetbrains.annotations.Unmodifiable;
2829

2930
import java.util.*;
3031

@@ -115,7 +116,7 @@ public boolean isRecipeSearchFilter() {
115116
return false;
116117
}
117118

118-
public List<Object> compressIngredients(Collection<Object> ingredients) {
119+
public List<Object> compressIngredients(@Unmodifiable Collection<Object> ingredients) {
119120
return new ArrayList<>(ingredients);
120121
}
121122

src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget;
55
import com.gregtechceu.gtceu.api.recipe.GTRecipeType;
66
import com.gregtechceu.gtceu.api.recipe.content.Content;
7-
import com.gregtechceu.gtceu.api.recipe.lookup.GTRecipeLookup;
8-
import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.MapIngredientTypeManager;
97
import com.gregtechceu.gtceu.common.data.GTRecipeTypes;
108
import com.gregtechceu.gtceu.utils.ItemStackHashStrategy;
119

@@ -19,7 +17,7 @@
1917

2018
import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap;
2119

22-
import java.util.List;
20+
import java.util.Collections;
2321
import java.util.function.Consumer;
2422

2523
public class SmartItemFilter implements ItemFilter {
@@ -90,10 +88,11 @@ public int testItemCount(ItemStack itemStack) {
9088

9189
private int lookup(ItemStack itemStack) {
9290
ItemStack copy = itemStack.copyWithCount(Integer.MAX_VALUE);
93-
var ingredients = MapIngredientTypeManager.getFrom(copy, ItemRecipeCapability.CAP);
94-
var recipe = filterMode.lookup.recurseIngredientTreeFindRecipe(List.of(ingredients),
95-
filterMode.lookup.getLookup(), r -> true);
96-
if (recipe == null) return 0;
91+
var recipe = filterMode.recipeType.db()
92+
.find(Collections.singletonMap(ItemRecipeCapability.CAP, Collections.singletonList(copy)), r -> true);
93+
if (recipe == null) {
94+
return 0;
95+
}
9796
for (Content content : recipe.getInputContents(ItemRecipeCapability.CAP)) {
9897
var stacks = ItemRecipeCapability.CAP.of(content.getContent()).getItems();
9998
for (var stack : stacks) {
@@ -121,13 +120,13 @@ private enum SmartFilteringMode implements EnumSelectorWidget.SelectableEnum {
121120

122121
private static final SmartFilteringMode[] VALUES = values();
123122
private final String localeName;
124-
private final GTRecipeLookup lookup;
123+
private final GTRecipeType recipeType;
125124
private final Object2IntOpenCustomHashMap<ItemStack> cache = new Object2IntOpenCustomHashMap<>(
126125
ItemStackHashStrategy.comparingAllButCount());
127126

128127
SmartFilteringMode(String localeName, GTRecipeType type) {
129128
this.localeName = localeName;
130-
this.lookup = type.getLookup();
129+
this.recipeType = type;
131130
}
132131

133132
@Override

src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import com.gregtechceu.gtceu.api.gui.SteamTexture;
66
import com.gregtechceu.gtceu.api.recipe.category.GTRecipeCategory;
77
import com.gregtechceu.gtceu.api.recipe.chance.boost.ChanceBoostFunction;
8-
import com.gregtechceu.gtceu.api.recipe.lookup.GTRecipeLookup;
8+
import com.gregtechceu.gtceu.api.recipe.lookup.RecipeAdditionHandler;
9+
import com.gregtechceu.gtceu.api.recipe.lookup.RecipeDB;
910
import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI;
1011
import com.gregtechceu.gtceu.api.sound.SoundEntry;
1112
import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder;
@@ -30,6 +31,7 @@
3031
import lombok.Getter;
3132
import lombok.Setter;
3233
import lombok.experimental.Accessors;
34+
import org.jetbrains.annotations.ApiStatus;
3335
import org.jetbrains.annotations.NotNull;
3436
import org.jetbrains.annotations.Nullable;
3537

@@ -79,8 +81,10 @@ public class GTRecipeType implements RecipeType<GTRecipe> {
7981
private final GTRecipeCategory category;
8082
@Getter
8183
private final Map<GTRecipeCategory, Set<GTRecipe>> categoryMap = new Object2ObjectOpenHashMap<>();
84+
private final RecipeDB db = new RecipeDB();
85+
@ApiStatus.Internal
8286
@Getter
83-
private final GTRecipeLookup lookup = new GTRecipeLookup(this);
87+
private final RecipeAdditionHandler additionHandler = new RecipeAdditionHandler(db);
8488
@Setter
8589
@Getter
8690
private boolean offsetVoltageText = false;
@@ -195,7 +199,10 @@ public String toString() {
195199

196200
public @NotNull Iterator<GTRecipe> searchRecipe(IRecipeCapabilityHolder holder, Predicate<GTRecipe> canHandle) {
197201
if (!holder.hasCapabilityProxies()) return Collections.emptyIterator();
198-
var iterator = getLookup().getRecipeIterator(holder, canHandle);
202+
var iterator = db.iterator(holder, canHandle);
203+
if (iterator == null) {
204+
return Collections.emptyIterator();
205+
}
199206
boolean any = false;
200207
while (iterator.hasNext()) {
201208
GTRecipe recipe = iterator.next();
@@ -321,6 +328,10 @@ public Set<GTRecipe> getRecipesInCategory(GTRecipeCategory category) {
321328
return Collections.unmodifiableSet(categoryMap.getOrDefault(category, Set.of()));
322329
}
323330

331+
public @NotNull RecipeDB db() {
332+
return db;
333+
}
334+
324335
public interface ICustomRecipeLogic {
325336

326337
/**

src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/Branch.java

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,19 @@
55

66
import com.mojang.datafixers.util.Either;
77
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
8+
import org.jetbrains.annotations.ApiStatus;
89
import org.jetbrains.annotations.NotNull;
910

1011
import java.util.Map;
11-
import java.util.stream.Stream;
1212

13-
public class Branch {
13+
@ApiStatus.Internal
14+
final class Branch {
1415

1516
// Keys on this have *(should)* have unique hashcodes.
1617
private Map<AbstractMapIngredient, Either<GTRecipe, Branch>> nodes;
1718
// Keys on this have collisions, and must be differentiated by equality.
1819
private Map<AbstractMapIngredient, Either<GTRecipe, Branch>> specialNodes;
1920

20-
public Stream<GTRecipe> getRecipes(boolean filterHidden) {
21-
Stream<GTRecipe> stream = null;
22-
if (nodes != null) {
23-
stream = nodes.values().stream()
24-
.flatMap(either -> either.map(Stream::of, right -> right.getRecipes(filterHidden)));
25-
}
26-
if (specialNodes != null) {
27-
if (stream == null) {
28-
stream = specialNodes.values().stream()
29-
.flatMap(either -> either.map(Stream::of, right -> right.getRecipes(filterHidden)));
30-
} else {
31-
stream = Stream.concat(stream, specialNodes.values().stream()
32-
.flatMap(either -> either.map(Stream::of, right -> right.getRecipes(filterHidden))));
33-
}
34-
}
35-
if (stream == null) {
36-
return Stream.empty();
37-
}
38-
if (filterHidden) {
39-
// stream = stream.filter(t -> !t.isHidden());
40-
}
41-
return stream;
42-
}
43-
4421
public boolean isEmptyBranch() {
4522
return (nodes == null || nodes.isEmpty()) && (specialNodes == null || specialNodes.isEmpty());
4623
}
@@ -60,4 +37,12 @@ public Map<AbstractMapIngredient, Either<GTRecipe, Branch>> getSpecialNodes() {
6037
}
6138
return specialNodes;
6239
}
40+
41+
/**
42+
* Removes all nodes in the branch
43+
*/
44+
public void clear() {
45+
this.specialNodes = null;
46+
this.nodes = null;
47+
}
6348
}

0 commit comments

Comments
 (0)