Skip to content

Commit 0f7bde7

Browse files
committed
Add an ItemStack cache for creating itemstack from typed ingredients
1 parent f3d92bd commit 0f7bde7

File tree

5 files changed

+97
-76
lines changed

5 files changed

+97
-76
lines changed

Library/src/main/java/mezz/jei/library/ingredients/TypedIngredient.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import mezz.jei.api.ingredients.IIngredientType;
88
import mezz.jei.api.ingredients.ITypedIngredient;
99
import mezz.jei.api.runtime.IIngredientManager;
10-
import mezz.jei.library.ingredients.itemStacks.NormalizedTypedItemStack;
1110
import mezz.jei.library.ingredients.itemStacks.TypedItemStack;
1211
import net.minecraft.world.item.ItemStack;
1312
import org.apache.logging.log4j.LogManager;
@@ -38,7 +37,7 @@ public static <T> ITypedIngredient<T> normalize(ITypedIngredient<T> typedIngredi
3837
if (type == VanillaTypes.ITEM_STACK) {
3938
@SuppressWarnings("unchecked")
4039
ITypedIngredient<ItemStack> cast = (ITypedIngredient<ItemStack>) typedIngredient;
41-
ITypedIngredient<ItemStack> normalized = NormalizedTypedItemStack.normalize(cast);
40+
ITypedIngredient<ItemStack> normalized = TypedItemStack.normalize(cast);
4241
@SuppressWarnings("unchecked")
4342
ITypedIngredient<T> castNormalized = (ITypedIngredient<T>) normalized;
4443
return castNormalized;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package mezz.jei.library.ingredients.itemStacks;
2+
3+
import net.minecraft.core.Holder;
4+
import net.minecraft.core.component.DataComponentPatch;
5+
import net.minecraft.world.item.Item;
6+
import net.minecraft.world.item.ItemStack;
7+
8+
final class FullTypedItemStack extends TypedItemStack {
9+
private final Holder<Item> itemHolder;
10+
private final DataComponentPatch dataComponentPatch;
11+
private final int count;
12+
13+
public FullTypedItemStack(
14+
Holder<Item> itemHolder,
15+
DataComponentPatch dataComponentPatch,
16+
int count
17+
) {
18+
this.itemHolder = itemHolder;
19+
this.dataComponentPatch = dataComponentPatch;
20+
this.count = count;
21+
}
22+
23+
@Override
24+
protected ItemStack createItemStackUncached() {
25+
return new ItemStack(itemHolder, count, dataComponentPatch);
26+
}
27+
28+
@Override
29+
protected TypedItemStack getNormalized() {
30+
return NormalizedTypedItemStack.create(itemHolder, dataComponentPatch);
31+
}
32+
33+
@Override
34+
public String toString() {
35+
return "TypedItemStack{" +
36+
"itemHolder=" + itemHolder +
37+
", dataComponentPatch=" + dataComponentPatch +
38+
", count=" + count +
39+
'}';
40+
}
41+
}

Library/src/main/java/mezz/jei/library/ingredients/itemStacks/NormalizedTypedItem.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
11
package mezz.jei.library.ingredients.itemStacks;
22

3-
import mezz.jei.api.constants.VanillaTypes;
4-
import mezz.jei.api.ingredients.IIngredientType;
5-
import mezz.jei.api.ingredients.ITypedIngredient;
63
import net.minecraft.core.Holder;
74
import net.minecraft.world.item.Item;
85
import net.minecraft.world.item.ItemStack;
96

10-
import java.util.Optional;
7+
final class NormalizedTypedItem extends TypedItemStack {
8+
private final Holder<Item> itemHolder;
119

12-
record NormalizedTypedItem(Holder<Item> itemHolder) implements ITypedIngredient<ItemStack> {
13-
@Override
14-
public ItemStack getIngredient() {
15-
return new ItemStack(itemHolder);
10+
NormalizedTypedItem(Holder<Item> itemHolder) {
11+
this.itemHolder = itemHolder;
1612
}
1713

1814
@Override
19-
public Optional<ItemStack> getItemStack() {
20-
return Optional.of(getIngredient());
15+
protected ItemStack createItemStackUncached() {
16+
return new ItemStack(itemHolder);
2117
}
2218

2319
@Override
24-
public IIngredientType<ItemStack> getType() {
25-
return VanillaTypes.ITEM_STACK;
20+
public TypedItemStack getNormalized() {
21+
return this;
2622
}
2723

2824
@Override

Library/src/main/java/mezz/jei/library/ingredients/itemStacks/NormalizedTypedItemStack.java

Lines changed: 13 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,37 @@
11
package mezz.jei.library.ingredients.itemStacks;
22

3-
import mezz.jei.api.constants.VanillaTypes;
4-
import mezz.jei.api.ingredients.IIngredientType;
5-
import mezz.jei.api.ingredients.ITypedIngredient;
63
import net.minecraft.core.Holder;
74
import net.minecraft.core.component.DataComponentPatch;
85
import net.minecraft.world.item.Item;
96
import net.minecraft.world.item.ItemStack;
107

11-
import java.util.Optional;
8+
final class NormalizedTypedItemStack extends TypedItemStack {
9+
private final Holder<Item> itemHolder;
10+
private final DataComponentPatch dataComponentPatch;
1211

13-
public record NormalizedTypedItemStack(
14-
Holder<Item> itemHolder,
15-
DataComponentPatch dataComponentPatch
16-
) implements ITypedIngredient<ItemStack> {
17-
public static ITypedIngredient<ItemStack> normalize(ITypedIngredient<ItemStack> typedIngredient) {
18-
switch (typedIngredient) {
19-
case NormalizedTypedItemStack normalized -> {
20-
return normalized;
21-
}
22-
case NormalizedTypedItem normalized -> {
23-
return normalized;
24-
}
25-
case TypedItemStack typedItemStack -> {
26-
return create(typedItemStack.itemHolder(), typedItemStack.dataComponentPatch());
27-
}
28-
default -> {
29-
ItemStack itemStack = typedIngredient.getIngredient();
30-
return create(itemStack.getItemHolder(), itemStack.getComponentsPatch());
31-
}
32-
}
12+
public NormalizedTypedItemStack(
13+
Holder<Item> itemHolder,
14+
DataComponentPatch dataComponentPatch
15+
) {
16+
this.itemHolder = itemHolder;
17+
this.dataComponentPatch = dataComponentPatch;
3318
}
3419

35-
public static ITypedIngredient<ItemStack> create(Holder<Item> itemHolder, DataComponentPatch dataComponentPatch) {
20+
static TypedItemStack create(Holder<Item> itemHolder, DataComponentPatch dataComponentPatch) {
3621
if (dataComponentPatch.isEmpty()) {
3722
return new NormalizedTypedItem(itemHolder);
3823
}
3924
return new NormalizedTypedItemStack(itemHolder, dataComponentPatch);
4025
}
4126

42-
public static ITypedIngredient<ItemStack> create(ItemStack itemStack) {
43-
return create(
44-
itemStack.getItemHolder(),
45-
itemStack.getComponentsPatch()
46-
);
47-
}
48-
4927
@Override
50-
public ItemStack getIngredient() {
28+
protected ItemStack createItemStackUncached() {
5129
return new ItemStack(itemHolder, 1, dataComponentPatch);
5230
}
5331

5432
@Override
55-
public Optional<ItemStack> getItemStack() {
56-
return Optional.of(getIngredient());
57-
}
58-
59-
@Override
60-
public IIngredientType<ItemStack> getType() {
61-
return VanillaTypes.ITEM_STACK;
33+
public TypedItemStack getNormalized() {
34+
return this;
6235
}
6336

6437
@Override
Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,64 @@
11
package mezz.jei.library.ingredients.itemStacks;
22

3+
import com.google.common.cache.CacheBuilder;
4+
import com.google.common.cache.CacheLoader;
5+
import com.google.common.cache.LoadingCache;
36
import mezz.jei.api.constants.VanillaTypes;
47
import mezz.jei.api.ingredients.IIngredientType;
58
import mezz.jei.api.ingredients.ITypedIngredient;
6-
import net.minecraft.core.Holder;
7-
import net.minecraft.core.component.DataComponentPatch;
8-
import net.minecraft.world.item.Item;
99
import net.minecraft.world.item.ItemStack;
1010

11+
import java.time.Duration;
1112
import java.util.Optional;
1213

13-
public record TypedItemStack(
14-
Holder<Item> itemHolder,
15-
DataComponentPatch dataComponentPatch,
16-
int count
17-
) implements ITypedIngredient<ItemStack> {
14+
public abstract class TypedItemStack implements ITypedIngredient<ItemStack> {
15+
private static final LoadingCache<TypedItemStack, ItemStack> CACHE = CacheBuilder.newBuilder()
16+
.expireAfterAccess(Duration.ofSeconds(1))
17+
.build(new CacheLoader<>() {
18+
@Override
19+
public ItemStack load(TypedItemStack key) {
20+
return key.createItemStackUncached();
21+
}
22+
});
23+
1824
public static ITypedIngredient<ItemStack> create(ItemStack ingredient) {
1925
if (ingredient.getCount() == 1) {
20-
return NormalizedTypedItemStack.create(ingredient);
26+
return NormalizedTypedItemStack.create(
27+
ingredient.getItemHolder(),
28+
ingredient.getComponentsPatch()
29+
);
2130
}
22-
return new TypedItemStack(
31+
return new FullTypedItemStack(
2332
ingredient.getItemHolder(),
2433
ingredient.getComponentsPatch(),
2534
ingredient.getCount()
2635
);
2736
}
2837

38+
public static ITypedIngredient<ItemStack> normalize(ITypedIngredient<ItemStack> typedIngredient) {
39+
if (typedIngredient instanceof TypedItemStack typedItemStack) {
40+
return typedItemStack.getNormalized();
41+
}
42+
ItemStack itemStack = typedIngredient.getIngredient();
43+
return NormalizedTypedItemStack.create(itemStack.getItemHolder(), itemStack.getComponentsPatch());
44+
}
45+
2946
@Override
30-
public ItemStack getIngredient() {
31-
return new ItemStack(itemHolder, count, dataComponentPatch);
47+
public final ItemStack getIngredient() {
48+
return CACHE.getUnchecked(this);
3249
}
3350

3451
@Override
35-
public Optional<ItemStack> getItemStack() {
52+
public final Optional<ItemStack> getItemStack() {
3653
return Optional.of(getIngredient());
3754
}
3855

3956
@Override
40-
public IIngredientType<ItemStack> getType() {
57+
public final IIngredientType<ItemStack> getType() {
4158
return VanillaTypes.ITEM_STACK;
4259
}
4360

44-
@Override
45-
public String toString() {
46-
return "TypedItemStack{" +
47-
"itemHolder=" + itemHolder +
48-
", dataComponentPatch=" + dataComponentPatch +
49-
", count=" + count +
50-
'}';
51-
}
61+
protected abstract TypedItemStack getNormalized();
62+
63+
protected abstract ItemStack createItemStackUncached();
5264
}

0 commit comments

Comments
 (0)