Skip to content

Commit 8ee9203

Browse files
committed
#shipit - Basic item + tag support for catalysts, w/ fallback
1 parent 2533db9 commit 8ee9203

10 files changed

Lines changed: 117 additions & 42 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package dev.compactmods.crafting.api.catalyst;
22

3+
import java.util.Set;
34
import net.minecraft.item.ItemStack;
45

56
public interface ICatalystMatcher {
67

78
boolean matches(ItemStack stack);
89

910
CatalystType<?> getType();
11+
12+
Set<ItemStack> getPossible();
1013
}

src/api/java/dev/compactmods/crafting/api/recipe/IMiniaturizationRecipe.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
import java.util.Collection;
44
import java.util.Optional;
55
import java.util.stream.Stream;
6+
import dev.compactmods.crafting.api.catalyst.ICatalystMatcher;
67
import dev.compactmods.crafting.api.components.IRecipeComponents;
78
import dev.compactmods.crafting.api.recipe.layers.IRecipeLayer;
89
import net.minecraft.item.ItemStack;
910
import net.minecraft.util.ResourceLocation;
1011
import net.minecraft.util.math.AxisAlignedBB;
1112

1213
public interface IMiniaturizationRecipe {
13-
ItemStack getCatalyst();
14+
ICatalystMatcher getCatalyst();
1415

1516
ItemStack[] getOutputs();
1617

src/main/java/dev/compactmods/crafting/compat/jei/JeiMiniaturizationCraftingCategory.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,26 +128,32 @@ public IDrawable getIcon() {
128128
//region Recipe Slots and Items
129129
@Override
130130
public void setIngredients(MiniaturizationRecipe recipe, IIngredients ing) {
131-
List<ItemStack> inputs = new ArrayList<>();
131+
List<List<ItemStack>> inputs = new ArrayList<>(1 + recipe.getComponents().size());
132+
133+
if (recipe.getCatalyst() != null && !recipe.getCatalyst().matches(ItemStack.EMPTY))
134+
inputs.add(0, new ArrayList<>(recipe.getCatalyst().getPossible()));
135+
else
136+
inputs.add(0, Collections.singletonList(new ItemStack(Items.REDSTONE)));
132137

133138
IRecipeComponents components = recipe.getComponents();
139+
int index = 1;
134140
for (String compKey : components.getBlockComponents().keySet()) {
135141
Optional<IRecipeBlockComponent> requiredBlock = components.getBlock(compKey);
142+
int finalIndex = index;
136143
requiredBlock.ifPresent(bs -> {
137144
// TODO - Abstract this better, need to be more flexible for other component types in the future
138145
if (bs instanceof BlockComponent) {
139146
BlockComponent bsc = (BlockComponent) bs;
140147
Item bi = bsc.getBlock().asItem();
141148
if (bi != Items.AIR)
142-
inputs.add(new ItemStack(bi));
149+
inputs.add(finalIndex, Collections.singletonList(new ItemStack(bi)));
143150
}
144151
});
145-
}
146152

147-
if(!recipe.getCatalyst().isEmpty())
148-
inputs.add(recipe.getCatalyst());
153+
index++;
154+
}
149155

150-
ing.setInputs(VanillaTypes.ITEM, inputs);
156+
ing.setInputLists(VanillaTypes.ITEM, inputs);
151157
ing.setOutputs(VanillaTypes.ITEM, Arrays.asList(recipe.getOutputs()));
152158
}
153159

@@ -167,7 +173,7 @@ public void setRecipe(IRecipeLayout recipeLayout, MiniaturizationRecipe recipe,
167173
try {
168174
addMaterialSlots(recipe, GUTTER_X, OFFSET_Y, guiItemStacks, numComponentSlots);
169175

170-
catalystSlot = addCatalystSlots(recipe, 0, 0, guiItemStacks, numComponentSlots);
176+
catalystSlot = addCatalystSlots(recipe, guiItemStacks, numComponentSlots);
171177
int fromRightEdge = this.background.getWidth() - (18 * 2) - GUTTER_X;
172178
addOutputSlots(recipe, fromRightEdge, 8, guiItemStacks, numComponentSlots);
173179
} catch (Exception ex) {
@@ -196,10 +202,12 @@ public void setRecipe(IRecipeLayout recipeLayout, MiniaturizationRecipe recipe,
196202
});
197203
}
198204

199-
private int addCatalystSlots(MiniaturizationRecipe recipe, int GUTTER_X, int OFFSET_Y, IGuiItemStackGroup guiItemStacks, int numComponentSlots) {
205+
private int addCatalystSlots(MiniaturizationRecipe recipe, IGuiItemStackGroup guiItemStacks, int numComponentSlots) {
200206
int catalystSlot = numComponentSlots + 5 + 1;
201-
guiItemStacks.init(catalystSlot, true, GUTTER_X, OFFSET_Y);
202-
guiItemStacks.set(catalystSlot, recipe.getCatalyst());
207+
guiItemStacks.init(catalystSlot, true, 0, 0);
208+
if(!recipe.getCatalyst().matches(ItemStack.EMPTY))
209+
guiItemStacks.set(catalystSlot, new ArrayList<>(recipe.getCatalyst().getPossible()));
210+
203211
guiItemStacks.setBackground(catalystSlot, slotDrawable);
204212
return catalystSlot;
205213
}
@@ -345,7 +353,7 @@ private void renderRecipe(MiniaturizationRecipe recipe, MatrixStack mx, AxisAlig
345353
try {
346354
AbstractGui.fill(
347355
mx,
348-
scissorBounds.x, scissorBounds.y,
356+
scissorBounds.x, scissorBounds.y,
349357
scissorBounds.x + scissorBounds.width,
350358
scissorBounds.height,
351359
0xFF404040

src/main/java/dev/compactmods/crafting/compat/theoneprobe/providers/FieldProjectorProvider.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.compactmods.crafting.compat.theoneprobe.providers;
22

3+
import java.util.Set;
34
import dev.compactmods.crafting.CompactCrafting;
45
import dev.compactmods.crafting.field.capability.CapabilityMiniaturizationField;
56
import dev.compactmods.crafting.projector.FieldProjectorBlock;
@@ -48,7 +49,9 @@ public void addProbeInfo(ProbeMode mode, IProbeInfo info, PlayerEntity player, W
4849
if(recipe != null) {
4950
int progress = field.getProgress();
5051

51-
group.item(recipe.getCatalyst());
52+
final Set<ItemStack> possible = recipe.getCatalyst().getPossible();
53+
group.item(possible.size() > 1 ? possible.stream().findAny().get() : possible.stream().findFirst().get());
54+
5255
group.icon(
5356
new ResourceLocation(CompactCrafting.MOD_ID, "textures/gui/jei-arrow-outputs.png"),
5457
0, 0, 24, 19, info.defaultIconStyle().textureHeight(19)

src/main/java/dev/compactmods/crafting/field/MiniaturizationField.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import dev.compactmods.crafting.CompactCrafting;
88
import dev.compactmods.crafting.Registration;
99
import dev.compactmods.crafting.api.EnumCraftingState;
10+
import dev.compactmods.crafting.api.catalyst.ICatalystMatcher;
1011
import dev.compactmods.crafting.api.field.IFieldListener;
1112
import dev.compactmods.crafting.api.field.IMiniaturizationField;
1213
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
@@ -58,6 +59,7 @@ public class MiniaturizationField implements IMiniaturizationField {
5859
@Nullable
5960
private MiniaturizationRecipe currentRecipe = null;
6061
private Template matchedBlocks;
62+
private Set<Item> matchedCatalysts;
6163

6264
@Nullable
6365
private ResourceLocation recipeId = null;
@@ -273,10 +275,13 @@ private void tickCrafting() {
273275
case MATCHED:
274276

275277
// We grow the bounds check here a little to support patterns that are exactly the size of the field
276-
// TODO - #35 - Support NBT filters in catalyst items
277-
List<ItemEntity> catalystEntities = getCatalystsInField(level, fieldBounds.inflate(0.25), currentRecipe.getCatalyst().getItem());
278+
List<ItemEntity> catalystEntities = getCatalystsInField(level, fieldBounds.inflate(0.25), currentRecipe.getCatalyst());
278279
if (catalystEntities.size() > 0) {
279280

281+
matchedCatalysts = catalystEntities.stream()
282+
.map((ItemEntity t) -> t.getItem().getItem())
283+
.collect(Collectors.toSet());
284+
280285
// Only remove items and clear the field on servers
281286
if (!level.isClientSide) {
282287
CraftingHelper.consumeCatalystItem(catalystEntities.get(0), 1);
@@ -406,10 +411,10 @@ public void setCraftingState(EnumCraftingState state) {
406411
this.craftingState = state;
407412
}
408413

409-
private List<ItemEntity> getCatalystsInField(IWorld level, AxisAlignedBB fieldBounds, Item itemFilter) {
414+
private List<ItemEntity> getCatalystsInField(IWorld level, AxisAlignedBB fieldBounds, ICatalystMatcher itemFilter) {
410415
List<ItemEntity> itemsInRange = level.getEntitiesOfClass(ItemEntity.class, fieldBounds);
411416
return itemsInRange.stream()
412-
.filter(ise -> ise.getItem().getItem() == itemFilter)
417+
.filter(ise -> itemFilter.matches(ise.getItem()))
413418
.collect(Collectors.toList());
414419
}
415420

@@ -445,8 +450,6 @@ public void registerListener(LazyOptional<IFieldListener> listener) {
445450
});
446451
}
447452

448-
// TODO - Basic data class codec for necessary info ?
449-
450453
@Override
451454
public CompoundNBT serverData() {
452455
CompoundNBT nbt = new CompoundNBT();
@@ -487,6 +490,7 @@ public void handleDestabilize() {
487490

488491
if (level.isClientSide) return;
489492

493+
// TODO - Look at dumping items into an inventory if it's attached to a projector, helps automation (in the weird cases)
490494
boolean restoreBlocks = false;
491495
boolean restoreCatalyst = false;
492496
switch (ServerConfig.DESTABILIZE_HANDLING) {
@@ -515,13 +519,21 @@ public void handleDestabilize() {
515519
new PlacementSettings(), level.random);
516520
}
517521

518-
final ItemStack catalyst = currentRecipe.getCatalyst();
519-
if (restoreCatalyst && !catalyst.isEmpty()) {
520-
final BlockPos northLoc = size.getProjectorLocationForDirection(center, Direction.NORTH);
521-
final ItemEntity ie = new ItemEntity(level, northLoc.getX(), center.getY() + 1.5f, northLoc.getZ(), catalyst);
522-
// ie.setNoGravity(true);
522+
if(currentRecipe != null) {
523+
final ICatalystMatcher catalyst = currentRecipe.getCatalyst();
524+
if (restoreCatalyst) {
525+
final BlockPos northLoc = size.getProjectorLocationForDirection(center, Direction.NORTH);
526+
527+
for(Item cat : matchedCatalysts) {
528+
final ItemEntity ie = new ItemEntity(level,
529+
northLoc.getX(), center.getY() + 1.5f, northLoc.getZ(),
530+
new ItemStack(cat));
523531

524-
level.addFreshEntity(ie);
532+
// ie.setNoGravity(true);
533+
534+
level.addFreshEntity(ie);
535+
}
536+
}
525537
}
526538
}
527539

src/main/java/dev/compactmods/crafting/recipes/MiniaturizationRecipe.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.stream.Stream;
66
import dev.compactmods.crafting.CompactCrafting;
77
import dev.compactmods.crafting.Registration;
8+
import dev.compactmods.crafting.api.catalyst.ICatalystMatcher;
89
import dev.compactmods.crafting.api.components.IRecipeBlockComponent;
910
import dev.compactmods.crafting.api.components.IRecipeComponent;
1011
import dev.compactmods.crafting.api.components.IRecipeComponents;
@@ -15,6 +16,7 @@
1516
import dev.compactmods.crafting.api.recipe.layers.ISymmetricalLayer;
1617
import dev.compactmods.crafting.api.recipe.layers.dim.IDynamicSizedRecipeLayer;
1718
import dev.compactmods.crafting.api.recipe.layers.dim.IFixedSizedRecipeLayer;
19+
import dev.compactmods.crafting.recipes.catalyst.ItemStackCatalystMatcher;
1820
import dev.compactmods.crafting.recipes.components.EmptyBlockComponent;
1921
import dev.compactmods.crafting.recipes.components.MiniaturizationRecipeComponents;
2022
import dev.compactmods.crafting.recipes.layers.RecipeLayerUtil;
@@ -38,7 +40,7 @@ public class MiniaturizationRecipe extends RecipeBase implements IMiniaturizatio
3840
private int recipeSize;
3941
private ResourceLocation id;
4042
private TreeMap<Integer, IRecipeLayer> layers;
41-
private ItemStack catalyst;
43+
private ICatalystMatcher catalyst;
4244
private ItemStack[] outputs;
4345
private AxisAlignedBB dimensions;
4446

@@ -50,7 +52,7 @@ public class MiniaturizationRecipe extends RecipeBase implements IMiniaturizatio
5052
public MiniaturizationRecipe() {
5153
this.recipeSize = -1;
5254
this.layers = new TreeMap<>();
53-
this.catalyst = ItemStack.EMPTY;
55+
this.catalyst = new ItemStackCatalystMatcher(ItemStack.EMPTY);
5456
this.outputs = new ItemStack[0];
5557
this.dimensions = AxisAlignedBB.ofSize(0, 0, 0);
5658
this.components = new MiniaturizationRecipeComponents();
@@ -271,7 +273,7 @@ public void setOutputs(Collection<ItemStack> outputs) {
271273
this.outputs = outputs.toArray(new ItemStack[0]);
272274
}
273275

274-
public ItemStack getCatalyst() {
276+
public ICatalystMatcher getCatalyst() {
275277
return this.catalyst;
276278
}
277279

@@ -321,7 +323,7 @@ public void setRecipeSize(int size) {
321323
this.recalculateDimensions();
322324
}
323325

324-
public void setCatalyst(ItemStack catalyst) {
325-
this.catalyst = catalyst.copy();
326+
public void setCatalyst(ICatalystMatcher catalyst) {
327+
this.catalyst = catalyst;
326328
}
327329
}

src/main/java/dev/compactmods/crafting/recipes/MiniaturizationRecipeCodec.java

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88
import com.mojang.datafixers.util.Pair;
99
import com.mojang.serialization.*;
1010
import dev.compactmods.crafting.CompactCrafting;
11+
import dev.compactmods.crafting.api.catalyst.ICatalystMatcher;
1112
import dev.compactmods.crafting.api.components.IRecipeComponent;
1213
import dev.compactmods.crafting.api.components.RecipeComponentType;
1314
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
1415
import dev.compactmods.crafting.api.recipe.layers.IRecipeLayer;
1516
import dev.compactmods.crafting.api.recipe.layers.RecipeLayerType;
1617
import dev.compactmods.crafting.api.recipe.layers.dim.IFixedSizedRecipeLayer;
18+
import dev.compactmods.crafting.recipes.catalyst.CatalystMatcherCodec;
19+
import dev.compactmods.crafting.recipes.catalyst.ItemStackCatalystMatcher;
1720
import dev.compactmods.crafting.recipes.components.RecipeComponentTypeCodec;
1821
import dev.compactmods.crafting.recipes.layers.RecipeLayerTypeCodec;
1922
import dev.compactmods.crafting.server.ServerConfig;
@@ -78,15 +81,31 @@ public <T> DataResult<Pair<MiniaturizationRecipe, T>> decode(DynamicOps<T> ops,
7881

7982
recipe.recalculateDimensions();
8083

81-
ItemStack catalyst = ItemStack.CODEC.fieldOf("catalyst").codec()
82-
.parse(ops, input)
83-
.resultOrPartial(errorBuilder::append)
84-
.orElse(ItemStack.EMPTY);
85-
86-
if (catalyst.isEmpty()) {
87-
CompactCrafting.LOGGER.warn("Warning: recipe has no catalyst; this may be unintentional.");
84+
final Optional<T> catalystNode = ops.get(input, "catalyst").result();
85+
if(!catalystNode.isPresent()) {
86+
if(debugOutput)
87+
CompactCrafting.LOGGER.warn("No catalyst node defined in recipe; this is likely a bad file!");
8888
} else {
89-
recipe.setCatalyst(catalyst);
89+
final Optional<T> catalystType = ops.get(catalystNode.get(), "type").result();
90+
if(!catalystType.isPresent()) {
91+
if(debugOutput)
92+
CompactCrafting.LOGGER.warn("Error: no catalyst type defined; falling back to the itemstack handler.");
93+
94+
final ItemStack stackData = ItemStack.CODEC.fieldOf("catalyst").codec()
95+
.parse(ops, input)
96+
.resultOrPartial(errorBuilder::append)
97+
.orElse(ItemStack.EMPTY);
98+
99+
recipe.setCatalyst(new ItemStackCatalystMatcher(stackData));
100+
} else {
101+
ICatalystMatcher catalyst = CatalystMatcherCodec.MATCHER_CODEC.fieldOf("catalyst").codec()
102+
.parse(ops, input)
103+
.resultOrPartial(errorBuilder::append)
104+
.orElse(new ItemStackCatalystMatcher(ItemStack.EMPTY));
105+
106+
// ICatalystMatcher catalyst = new ItemTagCatalystMatcher(ItemTags.PLANKS);
107+
recipe.setCatalyst(catalyst);
108+
}
90109
}
91110

92111
Optional<List<ItemStack>> outputs = ItemStack.CODEC.listOf().fieldOf("outputs").codec()
@@ -132,8 +151,9 @@ public <T> DataResult<T> encode(MiniaturizationRecipe recipe, DynamicOps<T> ops,
132151
DataResult<T> components = Codec.unboundedMap(Codec.STRING, COMPONENT_CODEC)
133152
.encodeStart(ops, recipe.getComponents().getAllComponents());
134153

135-
ItemStack catalystItem = recipe.getCatalyst();
136-
DataResult<T> catalyst = ItemStack.CODEC.encodeStart(ops, catalystItem == null ? ItemStack.EMPTY : catalystItem);
154+
ICatalystMatcher catalystItem = recipe.getCatalyst();
155+
156+
DataResult<T> catalyst = CatalystMatcherCodec.MATCHER_CODEC.encodeStart(ops, catalystItem);
137157

138158
DataResult<T> outputs = ItemStack.CODEC.listOf()
139159
.encodeStart(ops, ImmutableList.copyOf(recipe.getOutputs()));

src/main/java/dev/compactmods/crafting/recipes/catalyst/ItemStackCatalystMatcher.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package dev.compactmods.crafting.recipes.catalyst;
22

3+
import java.util.HashSet;
4+
import java.util.Set;
35
import com.mojang.serialization.Codec;
46
import com.mojang.serialization.codecs.RecordCodecBuilder;
57
import dev.compactmods.crafting.Registration;
@@ -28,6 +30,10 @@ public ItemStackCatalystMatcher(ResourceLocation item) {
2830
this.item = ForgeRegistries.ITEMS.getValue(item);
2931
}
3032

33+
public ItemStackCatalystMatcher(ItemStack stack) {
34+
this.item = stack.getItem();
35+
}
36+
3137
public ResourceLocation getItemId() {
3238
return item.getRegistryName();
3339
}
@@ -42,6 +48,13 @@ public CatalystType<?> getType() {
4248
return Registration.ITEM_STACK_CATALYST.get();
4349
}
4450

51+
@Override
52+
public Set<ItemStack> getPossible() {
53+
final HashSet<ItemStack> set = new HashSet<>();
54+
set.add(new ItemStack(item));
55+
return set;
56+
}
57+
4558
@Override
4659
public Codec<ItemStackCatalystMatcher> getCodec() {
4760
return CODEC;

src/main/java/dev/compactmods/crafting/recipes/catalyst/ItemTagCatalystMatcher.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package dev.compactmods.crafting.recipes.catalyst;
22

3+
import java.util.Collections;
4+
import java.util.Set;
5+
import java.util.stream.Collectors;
36
import com.mojang.serialization.Codec;
47
import com.mojang.serialization.codecs.RecordCodecBuilder;
58
import dev.compactmods.crafting.Registration;
@@ -43,6 +46,16 @@ public CatalystType<?> getType() {
4346
return Registration.TAGGED_ITEM_CATALYST.get();
4447
}
4548

49+
@Override
50+
public Set<ItemStack> getPossible() {
51+
if(tag == null)
52+
return Collections.emptySet();
53+
54+
return tag.getValues().stream()
55+
.map(ItemStack::new)
56+
.collect(Collectors.toSet());
57+
}
58+
4659
@Override
4760
public Codec<ItemTagCatalystMatcher> getCodec() {
4861
return CODEC;

0 commit comments

Comments
 (0)