Skip to content

Commit 9c0b1f6

Browse files
committed
So much work to get serialization started.
1 parent 517e699 commit 9c0b1f6

13 files changed

+233
-20
lines changed

src/main/java/com/robotgryphon/compactcrafting/compat/jei/JeiMiniaturizationCraftingCategory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ public void setRecipe(IRecipeLayout recipeLayout, MiniaturizationRecipe recipe,
152152
addOutputSlots(recipe, GUTTER_X, OFFSET_Y, guiItemStacks, numComponentSlots);
153153
} catch (Exception ex) {
154154
CompactCrafting.LOGGER.error(recipe.getId());
155-
CompactCrafting.LOGGER.error(ex);
155+
CompactCrafting.LOGGER.error("Error displaying recipe", ex);
156156
}
157157

158158
int finalCatalystSlot = catalystSlot;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.robotgryphon.compactcrafting.core;
2+
3+
import com.robotgryphon.compactcrafting.recipes.data.serialization.layers.FilledLayerSerializer;
4+
import com.robotgryphon.compactcrafting.recipes.data.serialization.layers.RecipeLayerSerializer;
5+
import net.minecraftforge.fml.RegistryObject;
6+
7+
public class LayerSerializationRegistration {
8+
9+
// ================================================================================================================
10+
// CORE RECIPE LAYER SERIALIZERS
11+
// ================================================================================================================
12+
public static final RegistryObject<RecipeLayerSerializer<?>> FILLED_LAYER_SERIALIZER = Registration.RECIPE_LAYERS.register("filled", FilledLayerSerializer::new);
13+
14+
public static void init() {}
15+
}

src/main/java/com/robotgryphon/compactcrafting/core/Registration.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import com.robotgryphon.compactcrafting.recipes.MiniaturizationRecipe;
1010
import com.robotgryphon.compactcrafting.recipes.data.MiniaturizationRecipeSerializer;
1111
import com.robotgryphon.compactcrafting.recipes.data.base.BaseRecipeType;
12+
import com.robotgryphon.compactcrafting.recipes.data.serialization.layers.FilledLayerSerializer;
13+
import com.robotgryphon.compactcrafting.recipes.data.serialization.layers.RecipeLayerSerializer;
1214
import net.minecraft.block.AbstractBlock;
1315
import net.minecraft.block.Block;
1416
import net.minecraft.block.Blocks;
@@ -18,26 +20,42 @@
1820
import net.minecraft.tileentity.TileEntityType;
1921
import net.minecraft.util.ResourceLocation;
2022
import net.minecraftforge.common.ToolType;
23+
import net.minecraftforge.event.RegistryEvent;
2124
import net.minecraftforge.eventbus.api.IEventBus;
25+
import net.minecraftforge.eventbus.api.SubscribeEvent;
2226
import net.minecraftforge.fml.RegistryObject;
27+
import net.minecraftforge.fml.common.Mod;
2328
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
24-
import net.minecraftforge.registries.DeferredRegister;
25-
import net.minecraftforge.registries.ForgeRegistries;
29+
import net.minecraftforge.registries.*;
2630

2731
import java.util.function.Supplier;
2832

2933
import static com.robotgryphon.compactcrafting.CompactCrafting.MOD_ID;
3034

35+
@SuppressWarnings("unchecked")
36+
@Mod.EventBusSubscriber(modid = MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
3137
public class Registration {
3238

3339
// ================================================================================================================
3440
// REGISTRIES
3541
// ================================================================================================================
42+
43+
3644
private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MOD_ID);
3745
private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID);
3846
private static final DeferredRegister<TileEntityType<?>> TILE_ENTITIES = DeferredRegister.create(ForgeRegistries.TILE_ENTITIES, MOD_ID);
3947
private static final DeferredRegister<IRecipeSerializer<?>> RECIPES = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, MOD_ID);
4048

49+
public static DeferredRegister<RecipeLayerSerializer<?>> RECIPE_LAYERS = DeferredRegister.create((Class) RecipeLayerSerializer.class, MOD_ID);
50+
public static IForgeRegistry<RecipeLayerSerializer<?>> RECIPE_SERIALIZERS;
51+
52+
static {
53+
RECIPE_LAYERS.makeRegistry("recipe_layer_serializers", () -> new RegistryBuilder<RecipeLayerSerializer<?>>()
54+
.setName(new ResourceLocation(MOD_ID, "recipe_layer_serializers"))
55+
.setType(c(RecipeLayerSerializer.class))
56+
.tagFolder("recipe_layer_serializers"));
57+
}
58+
4159
// ================================================================================================================
4260
// PROPERTIES
4361
// ================================================================================================================
@@ -91,9 +109,15 @@ public class Registration {
91109

92110
public static final BaseRecipeType<MiniaturizationRecipe> MINIATURIZATION_RECIPE_TYPE = new BaseRecipeType<>(MINIATURIZATION_RECIPE_TYPE_ID);
93111

112+
113+
public static final RegistryObject<RecipeLayerSerializer<?>> FILLED_LAYER_SERIALIZER =
114+
RECIPE_LAYERS.register("filled", FilledLayerSerializer::new);
115+
94116
// ================================================================================================================
95117
// INITIALIZATION
96118
// ================================================================================================================
119+
private static <T> Class<T> c(Class<?> cls) { return (Class<T>)cls; }
120+
97121
public static void init() {
98122
IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus();
99123

@@ -104,5 +128,14 @@ public static void init() {
104128

105129
// Recipe Types (Forge Registry setup does not call this yet)
106130
MINIATURIZATION_RECIPE_TYPE.register();
131+
132+
RECIPE_LAYERS.register(eventBus);
133+
}
134+
135+
@SubscribeEvent
136+
public static void onRegistration(RegistryEvent.Register<RecipeLayerSerializer<?>> evt) {
137+
RECIPE_SERIALIZERS = evt.getRegistry();
107138
}
139+
140+
108141
}

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

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ public MiniaturizationRecipe(ResourceLocation rl) {
4949

5050
public void setLayers(IRecipeLayer[] layers) {
5151
this.layers = layers;
52+
this.postLayerChange();
53+
}
54+
55+
private void postLayerChange() {
5256
this.cachedComponentTotals = null;
5357
this.recalculateDimensions();
5458
}
@@ -72,6 +76,10 @@ private void recalculateDimensions() {
7276

7377
this.dimensions = new AxisAlignedBB(Vector3d.ZERO, new Vector3d(x, height, z));
7478

79+
updateFluidLayerDimensions();
80+
}
81+
82+
private void updateFluidLayerDimensions() {
7583
// Update all the dynamic recipe layers
7684
Arrays.stream(this.layers)
7785
.filter(layer -> layer instanceof IDynamicRecipeLayer)
@@ -208,6 +216,9 @@ public int getComponentRequiredCount(String i) {
208216

209217
int required = 0;
210218
for (IRecipeLayer layer : this.layers) {
219+
if(layer == null)
220+
continue;
221+
211222
Map<String, Integer> layerTotals = layer.getComponentTotals();
212223

213224
if (layerTotals.containsKey(i))
@@ -273,7 +284,23 @@ public Optional<IRecipeLayer> getLayer(int y) {
273284
if (y < 0 || y > this.layers.length - 1)
274285
return Optional.empty();
275286

276-
return Optional.of(this.layers[y]);
287+
return Optional.ofNullable(this.layers[y]);
288+
}
289+
290+
public Stream<IRecipeLayer> getLayers() {
291+
return Arrays.stream(layers.clone());
292+
}
293+
294+
public int getNumberLayers() {
295+
return layers.length;
296+
}
297+
298+
public void setLayer(int num, IRecipeLayer layer) {
299+
if(num < 0 || num > layers.length - 1)
300+
return;
301+
302+
this.layers[num] = layer;
303+
this.postLayerChange();
277304
}
278305

279306
public Set<String> getComponentKeys() {
@@ -304,16 +331,11 @@ public void setCatalyst(ItemStack c) {
304331
}
305332

306333
public void setFluidDimensions(AxisAlignedBB dimensions) throws MiniaturizationRecipeException {
307-
if(Arrays.stream(this.layers).anyMatch(layer -> !(layer instanceof IDynamicRecipeLayer)))
334+
if(Arrays.stream(this.layers).filter(Objects::nonNull).anyMatch(layer -> !(layer instanceof IDynamicRecipeLayer)))
308335
throw new MiniaturizationRecipeException("Tried to set fluid dimensions when a non-fluid layer exists.");
309336

310337
this.dimensions = dimensions;
311-
Arrays.stream(this.layers)
312-
.filter(l -> l instanceof IDynamicRecipeLayer)
313-
.forEach(layer -> {
314-
IDynamicRecipeLayer dynamic = (IDynamicRecipeLayer) layer;
315-
dynamic.setRecipeDimensions(dimensions);
316-
});
338+
updateFluidLayerDimensions();
317339
}
318340

319341
public int getTicks() {

src/main/java/com/robotgryphon/compactcrafting/recipes/data/MiniaturizationRecipeSerializer.java

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,19 @@
22

33
import com.google.gson.JsonObject;
44
import com.robotgryphon.compactcrafting.CompactCrafting;
5+
import com.robotgryphon.compactcrafting.core.Registration;
56
import com.robotgryphon.compactcrafting.recipes.MiniaturizationRecipe;
67
import com.robotgryphon.compactcrafting.recipes.data.json.MiniaturizationRecipeJsonSerializer;
7-
import com.robotgryphon.compactcrafting.recipes.data.util.RecipeBufferDataUtil;
8+
import com.robotgryphon.compactcrafting.recipes.data.serialization.RecipeBufferData;
9+
import com.robotgryphon.compactcrafting.recipes.data.serialization.layers.RecipeLayerSerializer;
10+
import com.robotgryphon.compactcrafting.recipes.exceptions.MiniaturizationRecipeException;
11+
import com.robotgryphon.compactcrafting.recipes.layers.IRecipeLayer;
12+
import com.robotgryphon.compactcrafting.recipes.layers.dim.IDynamicRecipeLayer;
813
import net.minecraft.item.crafting.IRecipeSerializer;
14+
import net.minecraft.nbt.CompoundNBT;
915
import net.minecraft.network.PacketBuffer;
1016
import net.minecraft.util.ResourceLocation;
17+
import net.minecraft.util.math.AxisAlignedBB;
1118
import net.minecraftforge.registries.ForgeRegistryEntry;
1219

1320
import javax.annotation.Nullable;
@@ -27,22 +34,68 @@ public MiniaturizationRecipe read(ResourceLocation recipeId, JsonObject json) {
2734
public MiniaturizationRecipe read(ResourceLocation recipeId, PacketBuffer buffer) {
2835
MiniaturizationRecipe recipe = new MiniaturizationRecipe(recipeId);
2936

37+
CompoundNBT dim = buffer.readCompoundTag();
38+
AxisAlignedBB dims = new AxisAlignedBB(
39+
0, 0, 0,
40+
dim.getDouble("x"),
41+
dim.getDouble("y"),
42+
dim.getDouble("z")
43+
);
44+
3045
try {
31-
RecipeBufferDataUtil.readRecipeCatalysts(recipe, buffer);
32-
RecipeBufferDataUtil.readRecipeOutputs(recipe, buffer);
33-
RecipeBufferDataUtil.readComponentInfo(recipe, buffer);
46+
RecipeBufferData.readRecipeCatalysts(recipe, buffer);
47+
RecipeBufferData.readRecipeOutputs(recipe, buffer);
48+
RecipeBufferData.readComponentInfo(recipe, buffer);
3449
} catch (Exception e) {
3550
CompactCrafting.LOGGER.error(e);
3651
}
3752

53+
int numLayers = buffer.readInt();
54+
recipe.setLayers(new IRecipeLayer[numLayers]);
55+
for(int i = 0; i < numLayers; i++) {
56+
ResourceLocation layerType = buffer.readResourceLocation();
57+
if(Registration.RECIPE_SERIALIZERS.containsKey(layerType)) {
58+
RecipeLayerSerializer<?> serializer = Registration.RECIPE_SERIALIZERS.getValue(layerType);
59+
IRecipeLayer layer = serializer.readLayerData(buffer);
60+
if(layer instanceof IDynamicRecipeLayer)
61+
((IDynamicRecipeLayer) layer).setRecipeDimensions(dims);
62+
63+
recipe.setLayer(i, layer);
64+
}
65+
}
66+
67+
try {
68+
recipe.setFluidDimensions(dims);
69+
} catch (MiniaturizationRecipeException e) {
70+
CompactCrafting.LOGGER.error("Unable to set fluid recipe dimensions.", e);
71+
}
72+
3873
return recipe;
3974
}
4075

4176
@Override
4277
public void write(PacketBuffer buffer, MiniaturizationRecipe recipe) {
43-
RecipeBufferDataUtil.writeRecipeCatalysts(recipe, buffer);
44-
RecipeBufferDataUtil.writeRecipeOutputs(recipe, buffer);
45-
RecipeBufferDataUtil.writeComponentInfo(recipe, buffer);
78+
AxisAlignedBB dimensions = recipe.getDimensions();
79+
CompoundNBT dim = new CompoundNBT();
80+
dim.putDouble("x", dimensions.getXSize());
81+
dim.putDouble("y", dimensions.getYSize());
82+
dim.putDouble("z", dimensions.getZSize());
83+
buffer.writeCompoundTag(dim);
84+
85+
RecipeBufferData.writeRecipeCatalysts(recipe, buffer);
86+
RecipeBufferData.writeRecipeOutputs(recipe, buffer);
87+
RecipeBufferData.writeComponentInfo(recipe, buffer);
88+
89+
int numLayers = recipe.getNumberLayers();
90+
buffer.writeInt(numLayers);
91+
92+
recipe.getLayers().forEach(layer -> {
93+
RecipeLayerSerializer serializer = layer.getSerializer(layer);
94+
if(serializer != null)
95+
serializer.writeLayerData(layer, buffer);
96+
else
97+
buffer.writeResourceLocation(new ResourceLocation(CompactCrafting.MOD_ID, "blank"));
98+
});
4699
}
47100

48101
}

src/main/java/com/robotgryphon/compactcrafting/recipes/data/util/RecipeBufferDataUtil.java renamed to src/main/java/com/robotgryphon/compactcrafting/recipes/data/serialization/RecipeBufferData.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.robotgryphon.compactcrafting.recipes.data.util;
1+
package com.robotgryphon.compactcrafting.recipes.data.serialization;
22

33
import com.mojang.serialization.DataResult;
44
import com.robotgryphon.compactcrafting.CompactCrafting;
@@ -15,7 +15,7 @@
1515

1616
import javax.annotation.Nonnull;
1717

18-
public abstract class RecipeBufferDataUtil {
18+
public abstract class RecipeBufferData {
1919

2020
public static final ResourceLocation TYPE_CATALYSTS = new ResourceLocation(CompactCrafting.MOD_ID, "catalysts");
2121

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.robotgryphon.compactcrafting.recipes.data.serialization.layers;
2+
3+
import com.robotgryphon.compactcrafting.core.Registration;
4+
import com.robotgryphon.compactcrafting.recipes.layers.impl.FilledComponentRecipeLayer;
5+
import net.minecraft.network.PacketBuffer;
6+
7+
public class FilledLayerSerializer extends RecipeLayerSerializer<FilledComponentRecipeLayer> {
8+
9+
/**
10+
* Reads a layer's data from a packet buffer.
11+
*
12+
* @param buffer The buffer to pull data from.
13+
*/
14+
@Override
15+
public FilledComponentRecipeLayer readLayerData(PacketBuffer buffer) {
16+
String component = buffer.readString();
17+
FilledComponentRecipeLayer layer = new FilledComponentRecipeLayer(component);
18+
return layer;
19+
}
20+
21+
/**
22+
* Writes a layer's data to a packet buffer.
23+
*
24+
* @param layer The layer to write data for.
25+
* @param buffer The buffer to write data to.
26+
*/
27+
@Override
28+
public void writeLayerData(FilledComponentRecipeLayer layer, PacketBuffer buffer) {
29+
String comp = layer.getComponent();
30+
buffer.writeResourceLocation(Registration.FILLED_LAYER_SERIALIZER.getId());
31+
buffer.writeString(comp);
32+
}
33+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.robotgryphon.compactcrafting.recipes.data.serialization.layers;
2+
3+
import com.robotgryphon.compactcrafting.recipes.layers.IRecipeLayer;
4+
import net.minecraft.network.PacketBuffer;
5+
import net.minecraftforge.registries.ForgeRegistryEntry;
6+
7+
public class RecipeLayerSerializer<T extends IRecipeLayer> extends ForgeRegistryEntry<RecipeLayerSerializer<?>> {
8+
/**
9+
* Reads a layer's data from a packet buffer.
10+
*
11+
* @param buffer The buffer to pull data from.
12+
*/
13+
public T readLayerData(PacketBuffer buffer) { return null; }
14+
15+
/**
16+
* Writes a layer's data to a packet buffer.
17+
*
18+
* @param layer The layer to write data for.
19+
* @param buffer The buffer to write data to.
20+
*/
21+
public void writeLayerData(T layer, PacketBuffer buffer) {}
22+
}

src/main/java/com/robotgryphon/compactcrafting/recipes/layers/IRecipeLayer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.robotgryphon.compactcrafting.recipes.layers;
22

3+
import com.robotgryphon.compactcrafting.recipes.data.serialization.layers.RecipeLayerSerializer;
4+
import com.robotgryphon.compactcrafting.recipes.layers.impl.FilledComponentRecipeLayer;
35
import net.minecraft.util.math.BlockPos;
46

57
import java.util.Collection;
@@ -11,6 +13,7 @@ public interface IRecipeLayer {
1113

1214
/**
1315
* Gets a component key for the given (normalized) position.
16+
*
1417
* @param pos
1518
* @return
1619
*/
@@ -28,4 +31,6 @@ public interface IRecipeLayer {
2831
boolean isPositionRequired(BlockPos pos);
2932

3033
int getNumberFilledPositions();
34+
35+
<T extends IRecipeLayer> RecipeLayerSerializer<FilledComponentRecipeLayer> getSerializer(T layer);
3136
}

0 commit comments

Comments
 (0)