Skip to content

Commit 047a2ff

Browse files
committed
Catalyst loading; support ItemStacks instead of an item itself, for NBT
1 parent 0bf51ce commit 047a2ff

File tree

3 files changed

+102
-20
lines changed

3 files changed

+102
-20
lines changed

src/main/java/com/robotgryphon/compactcrafting/blocks/FieldProjectorTile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private void tickCrafting() {
241241
if (world == null || world.isRemote())
242242
return;
243243

244-
List<ItemEntity> catalystEntities = getCatalystsInField(fieldBounds, currentRecipe.catalyst);
244+
List<ItemEntity> catalystEntities = getCatalystsInField(fieldBounds, currentRecipe.catalyst.getItem());
245245
if (catalystEntities.size() > 0) {
246246
// We dropped a catalyst item in
247247
// At this point, we had a valid recipe and a valid catalyst entity

src/main/java/com/robotgryphon/compactcrafting/recipes/MiniaturizationRecipe.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,26 @@
66
import com.robotgryphon.compactcrafting.recipes.layers.IRecipeLayer;
77
import com.robotgryphon.compactcrafting.util.BlockSpaceUtil;
88
import net.minecraft.block.BlockState;
9-
import net.minecraft.item.Item;
109
import net.minecraft.item.ItemStack;
1110
import net.minecraft.util.Direction;
11+
import net.minecraft.util.ResourceLocation;
1212
import net.minecraft.util.Rotation;
1313
import net.minecraft.util.math.AxisAlignedBB;
1414
import net.minecraft.util.math.BlockPos;
1515
import net.minecraft.util.math.vector.Vector3d;
1616
import net.minecraft.world.IWorldReader;
17-
import net.minecraftforge.registries.ForgeRegistryEntry;
1817

1918
import java.util.Arrays;
2019
import java.util.HashMap;
2120
import java.util.Map;
2221
import java.util.Optional;
2322
import java.util.stream.Stream;
2423

25-
public class MiniaturizationRecipe extends ForgeRegistryEntry<MiniaturizationRecipe> {
24+
public class MiniaturizationRecipe {
2625

26+
private ResourceLocation registryName;
2727
private IRecipeLayer[] layers;
28-
public Item catalyst;
28+
public ItemStack catalyst;
2929
public ItemStack[] outputs;
3030
private AxisAlignedBB dimensions;
3131

@@ -35,7 +35,8 @@ public class MiniaturizationRecipe extends ForgeRegistryEntry<MiniaturizationRec
3535
*/
3636
private final Map<String, BlockState> components;
3737

38-
public MiniaturizationRecipe() {
38+
public MiniaturizationRecipe(ResourceLocation rl) {
39+
this.registryName = rl;
3940
this.layers = new IRecipeLayer[0];
4041
this.outputs = new ItemStack[0];
4142
this.components = new HashMap<>();
@@ -234,4 +235,12 @@ public Optional<IRecipeLayer> getLayer(int y) {
234235

235236
return Optional.of(this.layers[y]);
236237
}
238+
239+
public ResourceLocation getRegistryName() {
240+
return registryName;
241+
}
242+
243+
public void setRegistryName(ResourceLocation registryName) {
244+
this.registryName = registryName;
245+
}
237246
}
Lines changed: 87 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package com.robotgryphon.compactcrafting.recipes.json;
22

33
import com.google.gson.*;
4+
import com.mojang.datafixers.util.Pair;
5+
import com.mojang.serialization.JsonOps;
46
import com.robotgryphon.compactcrafting.CompactCrafting;
57
import com.robotgryphon.compactcrafting.recipes.MiniaturizationRecipe;
68
import com.robotgryphon.compactcrafting.recipes.MiniaturizationRecipeManager;
79
import com.robotgryphon.compactcrafting.recipes.layers.IRecipeLayer;
10+
import net.minecraft.block.BlockState;
811
import net.minecraft.client.resources.JsonReloadListener;
12+
import net.minecraft.item.ItemStack;
913
import net.minecraft.profiler.IProfiler;
1014
import net.minecraft.resources.IResourceManager;
1115
import net.minecraft.util.ResourceLocation;
1216

1317
import java.util.Arrays;
1418
import java.util.Collections;
1519
import java.util.Map;
20+
import java.util.Optional;
1621

1722
public class MiniaturizationPatternLoader extends JsonReloadListener {
1823
public MiniaturizationPatternLoader() {
@@ -33,32 +38,100 @@ protected void apply(Map<ResourceLocation, JsonElement> objectIn, IResourceManag
3338
continue;
3439
}
3540

41+
// TODO: Eventually we want to have a version spec here, but for now we're just going to require it for future updates
3642
int version = root.get("version").getAsInt();
3743
if(version <= 0) {
3844
CompactCrafting.LOGGER.debug("Skipping pattern loading for recipe " + rl.toString() + "; version must be at least 1.");
3945
continue;
4046
}
4147

42-
// TODO: Eventually we want to have a version spec here, but for now we're just going to require it for future updates
48+
MiniaturizationRecipe recipe = new MiniaturizationRecipe(rl);
4349

44-
if(!root.has("layers")) {
45-
CompactCrafting.LOGGER.debug("Skipping pattern loading for recipe " + rl.toString() + "; no layers defined.");
50+
boolean layersLoaded = loadLayers(recipe, root);
51+
if(!layersLoaded)
4652
continue;
47-
}
48-
49-
JsonArray layers = root.get("layers").getAsJsonArray();
50-
LayerDeserializer layerJsonSerializer = new LayerDeserializer();
51-
Gson g = new GsonBuilder()
52-
.registerTypeAdapter(IRecipeLayer.class, layerJsonSerializer)
53-
.create();
5453

55-
IRecipeLayer[] iRecipeLayers = g.fromJson(layers, IRecipeLayer[].class);
56-
Collections.reverse(Arrays.asList(iRecipeLayers));
54+
loadComponents(root, recipe);
5755

58-
MiniaturizationRecipe recipe = new MiniaturizationRecipe();
59-
recipe.setLayers(iRecipeLayers);
56+
loadCatalyst(recipe, root);
6057

6158
MiniaturizationRecipeManager.add(rl, recipe);
6259
}
6360
}
61+
62+
private boolean loadCatalyst(MiniaturizationRecipe recipe, JsonObject root) {
63+
if(!root.has("catalyst")) {
64+
CompactCrafting.LOGGER.warn("Catalyst entry not found for recipe {}; skipping rest of recipe loading.", recipe.getRegistryName());
65+
return false;
66+
}
67+
68+
JsonObject catalyst = root.getAsJsonObject("catalyst");
69+
70+
Optional<ItemStack> stack = ItemStack.CODEC.decode(JsonOps.INSTANCE, catalyst)
71+
.get()
72+
.ifRight(err -> CompactCrafting.LOGGER.warn("Failed to load itemstack for catalyst: {}", err.message()))
73+
.mapLeft(Pair::getFirst)
74+
.left();
75+
76+
if(!stack.isPresent())
77+
return false;
78+
79+
ItemStack c = stack.get();
80+
81+
if(c.getCount() != 1) {
82+
CompactCrafting.LOGGER.warn("Catalyst definition called for a non-1 count; this is not yet supported.");
83+
c.setCount(1);
84+
}
85+
86+
recipe.catalyst = c;
87+
88+
return true;
89+
}
90+
91+
private boolean loadLayers(MiniaturizationRecipe recipe, JsonObject root) {
92+
if(!root.has("layers")) {
93+
CompactCrafting.LOGGER.debug("Skipping pattern loading for recipe " + recipe.getRegistryName().toString() + "; no layers defined.");
94+
return false;
95+
}
96+
97+
JsonArray layers = root.get("layers").getAsJsonArray();
98+
LayerDeserializer layerJsonSerializer = new LayerDeserializer();
99+
Gson g = new GsonBuilder()
100+
.registerTypeAdapter(IRecipeLayer.class, layerJsonSerializer)
101+
.create();
102+
103+
IRecipeLayer[] iRecipeLayers = g.fromJson(layers, IRecipeLayer[].class);
104+
Collections.reverse(Arrays.asList(iRecipeLayers));
105+
106+
107+
recipe.setLayers(iRecipeLayers);
108+
return true;
109+
}
110+
111+
private void loadComponents(JsonObject root, MiniaturizationRecipe recipe) {
112+
JsonObject components = root.get("components").getAsJsonObject();
113+
if(components.size() == 0) {
114+
throw new JsonParseException("Error: No components defined.");
115+
}
116+
117+
components.entrySet().forEach(component -> {
118+
String key = component.getKey();
119+
Optional<BlockState> state = extractComponentDefinition(key, component.getValue());
120+
121+
if(key.isEmpty() || !state.isPresent()) {
122+
CompactCrafting.LOGGER.warn("Failed to process blockstate for component {}; definition not found.", key);
123+
return;
124+
}
125+
126+
recipe.addComponent(key, state.get());
127+
});
128+
}
129+
130+
private Optional<BlockState> extractComponentDefinition(String key, JsonElement definition) {
131+
JsonObject comp = definition.getAsJsonObject();
132+
return BlockState.CODEC.decode(JsonOps.INSTANCE, comp)
133+
.get().ifRight(error -> {
134+
CompactCrafting.LOGGER.warn("Failed to process blockstate for component {}: {}", key, error.message());
135+
}).mapLeft(Pair::getFirst).left();
136+
}
64137
}

0 commit comments

Comments
 (0)