Skip to content

Commit 4fa7b98

Browse files
committed
Fix #3770 Add an ItemStack cache for creating ItemStack from typed ingredients
1 parent 4639a3f commit 4fa7b98

File tree

5 files changed

+103
-78
lines changed

5 files changed

+103
-78
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: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package mezz.jei.library.ingredients.itemStacks;
2+
3+
import net.minecraft.core.Holder;
4+
import net.minecraft.nbt.CompoundTag;
5+
import net.minecraft.world.item.Item;
6+
import net.minecraft.world.item.ItemStack;
7+
import org.jetbrains.annotations.Nullable;
8+
9+
final class FullTypedItemStack extends TypedItemStack {
10+
private final Holder<Item> itemHolder;
11+
private final @Nullable CompoundTag tag;
12+
private final int count;
13+
14+
public FullTypedItemStack(
15+
Holder<Item> itemHolder,
16+
@Nullable CompoundTag tag,
17+
int count
18+
) {
19+
this.itemHolder = itemHolder;
20+
this.tag = tag;
21+
this.count = count;
22+
}
23+
24+
@Override
25+
protected ItemStack createItemStackUncached() {
26+
ItemStack itemStack = new ItemStack(itemHolder, count);
27+
itemStack.setTag(tag);
28+
return itemStack;
29+
}
30+
31+
@Override
32+
protected TypedItemStack getNormalized() {
33+
return NormalizedTypedItemStack.create(itemHolder, tag);
34+
}
35+
36+
@Override
37+
public String toString() {
38+
return "TypedItemStack{" +
39+
"itemHolder=" + itemHolder +
40+
", tag=" + tag +
41+
", count=" + count +
42+
'}';
43+
}
44+
}

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: 16 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,40 @@
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.nbt.CompoundTag;
85
import net.minecraft.world.item.Item;
96
import net.minecraft.world.item.ItemStack;
10-
11-
import javax.annotation.Nullable;
12-
import java.util.Optional;
13-
14-
public record NormalizedTypedItemStack(
15-
Holder<Item> itemHolder,
16-
CompoundTag tag
17-
) implements ITypedIngredient<ItemStack> {
18-
public static ITypedIngredient<ItemStack> normalize(ITypedIngredient<ItemStack> typedIngredient) {
19-
if (typedIngredient instanceof NormalizedTypedItemStack normalized) {
20-
return normalized;
21-
} else if (typedIngredient instanceof NormalizedTypedItem normalized) {
22-
return normalized;
23-
} else if (typedIngredient instanceof TypedItemStack typedItemStack) {
24-
return create(typedItemStack.itemHolder(), typedItemStack.tag());
25-
}
26-
ItemStack itemStack = typedIngredient.getIngredient();
27-
return create(itemStack.getItemHolder(), itemStack.getTag());
7+
import org.jetbrains.annotations.Nullable;
8+
9+
final class NormalizedTypedItemStack extends TypedItemStack {
10+
private final Holder<Item> itemHolder;
11+
private final CompoundTag tag;
12+
13+
public NormalizedTypedItemStack(
14+
Holder<Item> itemHolder,
15+
CompoundTag tag
16+
) {
17+
this.itemHolder = itemHolder;
18+
this.tag = tag;
2819
}
2920

30-
public static ITypedIngredient<ItemStack> create(Holder<Item> itemHolder, @Nullable CompoundTag tag) {
21+
static TypedItemStack create(Holder<Item> itemHolder, @Nullable CompoundTag tag) {
3122
if (tag == null) {
3223
return new NormalizedTypedItem(itemHolder);
3324
}
3425
return new NormalizedTypedItemStack(itemHolder, tag);
3526
}
3627

37-
public static ITypedIngredient<ItemStack> create(ItemStack itemStack) {
38-
return create(
39-
itemStack.getItemHolder(),
40-
itemStack.getTag()
41-
);
42-
}
43-
4428
@Override
45-
public ItemStack getIngredient() {
29+
public ItemStack createItemStackUncached() {
4630
ItemStack itemStack = new ItemStack(itemHolder, 1);
4731
itemStack.setTag(tag);
4832
return itemStack;
4933
}
5034

5135
@Override
52-
public Optional<ItemStack> getItemStack() {
53-
return Optional.of(getIngredient());
54-
}
55-
56-
@Override
57-
public IIngredientType<ItemStack> getType() {
58-
return VanillaTypes.ITEM_STACK;
36+
public TypedItemStack getNormalized() {
37+
return this;
5938
}
6039

6140
@Override
Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +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.nbt.CompoundTag;
8-
import net.minecraft.world.item.Item;
99
import net.minecraft.world.item.ItemStack;
1010

11-
import javax.annotation.Nullable;
11+
import java.time.Duration;
1212
import java.util.Optional;
1313

14-
public record TypedItemStack(
15-
Holder<Item> itemHolder,
16-
@Nullable CompoundTag tag,
17-
int count
18-
) 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+
1924
public static ITypedIngredient<ItemStack> create(ItemStack ingredient) {
2025
if (ingredient.getCount() == 1) {
21-
return NormalizedTypedItemStack.create(ingredient.getItemHolder(), ingredient.getTag());
26+
return NormalizedTypedItemStack.create(
27+
ingredient.getItemHolder(),
28+
ingredient.getTag()
29+
);
2230
}
23-
return new TypedItemStack(
31+
return new FullTypedItemStack(
2432
ingredient.getItemHolder(),
2533
ingredient.getTag(),
2634
ingredient.getCount()
2735
);
2836
}
2937

30-
@Override
31-
public ItemStack getIngredient() {
32-
ItemStack itemStack = new ItemStack(itemHolder, count);
33-
if (tag != null) {
34-
itemStack.setTag(tag);
38+
public static ITypedIngredient<ItemStack> normalize(ITypedIngredient<ItemStack> typedIngredient) {
39+
if (typedIngredient instanceof TypedItemStack typedItemStack) {
40+
return typedItemStack.getNormalized();
3541
}
36-
return itemStack;
42+
ItemStack itemStack = typedIngredient.getIngredient();
43+
return NormalizedTypedItemStack.create(itemStack.getItemHolder(), itemStack.getTag());
3744
}
3845

3946
@Override
40-
public Optional<ItemStack> getItemStack() {
41-
return Optional.of(getIngredient());
47+
public final ItemStack getIngredient() {
48+
return CACHE.getUnchecked(this);
4249
}
4350

4451
@Override
45-
public IIngredientType<ItemStack> getType() {
46-
return VanillaTypes.ITEM_STACK;
52+
public final Optional<ItemStack> getItemStack() {
53+
return Optional.of(getIngredient());
4754
}
4855

4956
@Override
50-
public String toString() {
51-
return "TypedItemStack{" +
52-
"itemHolder=" + itemHolder +
53-
", tag=" + tag +
54-
", count=" + count +
55-
'}';
57+
public final IIngredientType<ItemStack> getType() {
58+
return VanillaTypes.ITEM_STACK;
5659
}
60+
61+
protected abstract TypedItemStack getNormalized();
62+
63+
protected abstract ItemStack createItemStackUncached();
5764
}

0 commit comments

Comments
 (0)