More recipe Serializer changes

- added Interface IExtendedProcessingRecipe supporting requiredHeat, fluid inputs and fluid outputs
- set Mixing recipes to use the extended serializer in AllRecipeTypes
- removed constructor parameters specifying fluid usage in recipes that do not support fluids (and changed the ConversionRecipe JEI support class back)
- cleaned up annotations, ordered AllRecipeType enum values and imports, reformatted recipe code
This commit is contained in:
LordGrimmauld 2020-07-11 16:18:17 +02:00
parent a73919357b
commit 02450bd2f7
11 changed files with 174 additions and 185 deletions

View file

@ -1,7 +1,5 @@
package com.simibubi.create;
import java.util.function.Supplier;
import com.simibubi.create.compat.jei.ConversionRecipe;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCraftingRecipe;
import com.simibubi.create.content.contraptions.components.crusher.CrushingRecipe;
@ -12,11 +10,11 @@ import com.simibubi.create.content.contraptions.components.press.PressingRecipe;
import com.simibubi.create.content.contraptions.components.saw.CuttingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer.IExtendedRecipeFactory;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer.IRecipeFactory;
import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe;
import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperUpgradeRecipe;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.IRecipeSerializer;
@ -26,18 +24,20 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.Registry;
import net.minecraftforge.event.RegistryEvent;
import java.util.function.Supplier;
public enum AllRecipeTypes {
BLOCKZAPPER_UPGRADE(BlockzapperUpgradeRecipe.Serializer::new, IRecipeType.CRAFTING),
MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new),
CRUSHING(processingSerializer(CrushingRecipe::new)),
MILLING(processingSerializer(MillingRecipe::new)),
SPLASHING(processingSerializer(SplashingRecipe::new)),
PRESSING(processingSerializer(PressingRecipe::new)),
CUTTING(processingSerializer(CuttingRecipe::new)),
MIXING(processingSerializer(MixingRecipe::new)),
SANDPAPER_POLISHING(processingSerializer(SandPaperPolishingRecipe::new)),
CONVERSION(processingSerializer(ConversionRecipe::new)),
CRUSHING(processingSerializer(CrushingRecipe::new)),
CUTTING(processingSerializer(CuttingRecipe::new)),
MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new),
MILLING(processingSerializer(MillingRecipe::new)),
MIXING(extendedProcessingSerializer(MixingRecipe::new)),
PRESSING(processingSerializer(PressingRecipe::new)),
SANDPAPER_POLISHING(processingSerializer(SandPaperPolishingRecipe::new)),
SPLASHING(processingSerializer(SplashingRecipe::new)),
;
@ -45,11 +45,6 @@ public enum AllRecipeTypes {
public Supplier<IRecipeSerializer<?>> supplier;
public IRecipeType<? extends IRecipe<? extends IInventory>> type;
@SuppressWarnings("unchecked")
public <T extends IRecipeType<?>> T getType() {
return (T) type;
}
AllRecipeTypes(Supplier<IRecipeSerializer<?>> supplier) {
this(supplier, null);
}
@ -87,4 +82,13 @@ public enum AllRecipeTypes {
return () -> new ProcessingRecipeSerializer<>(factory);
}
private static Supplier<IRecipeSerializer<?>> extendedProcessingSerializer(
IExtendedRecipeFactory<? extends ProcessingRecipe<?>> factory) {
return () -> new ProcessingRecipeSerializer<>(factory);
}
@SuppressWarnings("unchecked")
public <T extends IRecipeType<?>> T getType() {
return (T) type;
}
}

View file

@ -3,7 +3,6 @@ package com.simibubi.create.compat.jei;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllRecipeTypes;
@ -16,7 +15,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.wrapper.RecipeWrapper;
/**
@ -29,8 +27,7 @@ import net.minecraftforge.items.wrapper.RecipeWrapper;
public class ConversionRecipe extends ProcessingRecipe<RecipeWrapper> {
public ConversionRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration, @Nullable List<FluidStack> fluidIngredients,
@Nullable List<FluidStack> fluidResults) {
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.CONVERSION, id, group, ingredients, results, processingDuration);
}
@ -45,7 +42,7 @@ public class ConversionRecipe extends ProcessingRecipe<RecipeWrapper> {
public ConversionRecipe(ResourceLocation id, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results) {
this(id, "conversions", ingredients, results, -1, null, null);
this(id, "conversions", ingredients, results, -1);
}
@Override

View file

@ -1,21 +1,20 @@
package com.simibubi.create.content.contraptions.components.crusher;
import java.util.List;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class CrushingRecipe extends AbstractCrushingRecipe {
public CrushingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
List<FluidStack> fluidResults) {
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.CRUSHING, id, group, ingredients, results, processingDuration);
}

View file

@ -1,26 +1,22 @@
package com.simibubi.create.content.contraptions.components.fan;
import java.util.List;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.content.logistics.InWorldProcessing.SplashingInv;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class SplashingRecipe extends ProcessingRecipe<InWorldProcessing.SplashingInv> {
public SplashingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
List<FluidStack> fluidResults) {
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.SPLASHING, id, group, ingredients, results, processingDuration);
}

View file

@ -1,25 +1,21 @@
package com.simibubi.create.content.contraptions.components.millstone;
import java.util.List;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.components.crusher.AbstractCrushingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class MillingRecipe extends AbstractCrushingRecipe {
public MillingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
List<FluidStack> fluidResults) {
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.MILLING, id, group, ingredients, results, processingDuration);
}
@ -35,5 +31,4 @@ public class MillingRecipe extends AbstractCrushingRecipe {
protected int getMaxOutputCount() {
return 4;
}
}

View file

@ -1,20 +1,11 @@
package com.simibubi.create.content.contraptions.components.mixer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.Nonnull;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInputInventory;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient;
@ -23,82 +14,86 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull;
import java.util.*;
public class MixingRecipe extends ProcessingRecipe<BasinInputInventory> {
public MixingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.MIXING, id, group, ingredients, results, processingDuration);
}
public MixingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
List<FluidStack> fluidResults, int requiredHeat) {
super(AllRecipeTypes.MIXING, id, group, ingredients, results, processingDuration, fluidIngredients,
fluidResults, requiredHeat);
}
public MixingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
List<FluidStack> fluidResults) {
super(AllRecipeTypes.MIXING, id, group, ingredients, results, processingDuration, fluidIngredients,
fluidResults);
}
public static MixingRecipe of(IRecipe<?> recipe) {
return new MixingRecipe(recipe.getId(), recipe.getGroup(), ProcessingIngredient.list(recipe.getIngredients()),
Collections.singletonList(new ProcessingOutput(recipe.getRecipeOutput(), 1)), -1, null, null, 0);
}
@Override
protected int getMaxInputCount() {
return 9;
}
@Override
protected int getMaxInputCount() {
return 9;
}
@Override
protected int getMaxOutputCount() {
return 1;
}
@Override
protected int getMaxOutputCount() {
return 1;
}
@Override
protected boolean canHaveCatalysts() {
return true;
}
@Override
protected boolean canHaveCatalysts() {
return true;
}
@Override
public boolean matches(BasinInputInventory inv, @Nonnull World worldIn) {
if (inv.isEmpty())
return false;
@Override
public boolean matches(BasinInputInventory inv, @Nonnull World worldIn) {
if (inv.isEmpty())
return false;
NonNullList<Ingredient> ingredients = this.getIngredients();
if (!ingredients.stream()
.allMatch(Ingredient::isSimple))
return false;
NonNullList<Ingredient> ingredients = this.getIngredients();
if (!ingredients.stream()
.allMatch(Ingredient::isSimple))
return false;
List<ItemStack> remaining = new ArrayList<>();
for (int slot = 0; slot < inv.getSizeInventory(); ++slot) {
ItemStack itemstack = inv.getStackInSlot(slot);
if (!itemstack.isEmpty()) {
remaining.add(itemstack.copy());
}
}
List<ItemStack> remaining = new ArrayList<>();
for (int slot = 0; slot < inv.getSizeInventory(); ++slot) {
ItemStack itemstack = inv.getStackInSlot(slot);
if (!itemstack.isEmpty()) {
remaining.add(itemstack.copy());
}
}
// sort by leniency
List<Ingredient> sortedIngredients = new LinkedList<>(ingredients);
sortedIngredients.sort(Comparator.comparingInt(i -> i.getMatchingStacks().length));
Ingredients: for (Ingredient ingredient : sortedIngredients) {
for (ItemStack stack : remaining) {
if (stack.isEmpty())
continue;
if (ingredient.test(stack)) {
stack.shrink(1);
continue Ingredients;
}
}
return false;
}
return true;
}
// sort by leniency
List<Ingredient> sortedIngredients = new LinkedList<>(ingredients);
sortedIngredients.sort(Comparator.comparingInt(i -> i.getMatchingStacks().length));
Ingredients:
for (Ingredient ingredient : sortedIngredients) {
for (ItemStack stack : remaining) {
if (stack.isEmpty())
continue;
if (ingredient.test(stack)) {
stack.shrink(1);
continue Ingredients;
}
}
return false;
}
return true;
}
public static MixingRecipe of(IRecipe<?> recipe) {
return new MixingRecipe(recipe.getId(), recipe.getGroup(), ProcessingIngredient.list(recipe.getIngredients()),
Collections.singletonList(new ProcessingOutput(recipe.getRecipeOutput(), 1)), -1);
}
@Override
protected boolean canHaveFluidIngredient() {
return true;
}
@Override
protected boolean canHaveFluidIngredient() {
return true;
}
@Override
protected boolean canHaveFluidOutput() {
return true;
}
@Override
protected boolean canHaveFluidOutput() {
return true;
}
@Override
protected boolean requiresHeating() {
return this.requiredHeat > 0;
}
}

View file

@ -1,25 +1,21 @@
package com.simibubi.create.content.contraptions.components.press;
import java.util.List;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.PressingInv;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class PressingRecipe extends ProcessingRecipe<MechanicalPressTileEntity.PressingInv> {
public PressingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
List<FluidStack> fluidResults) {
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.PRESSING, id, group, ingredients, results, processingDuration);
}

View file

@ -1,25 +1,21 @@
package com.simibubi.create.content.contraptions.components.saw;
import java.util.List;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class CuttingRecipe extends ProcessingRecipe<RecipeWrapper> {
public CuttingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
List<FluidStack> fluidResults) {
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.CUTTING, id, group, ingredients, results, processingDuration);
}

View file

@ -1,11 +1,7 @@
package com.simibubi.create.content.contraptions.processing;
import java.util.List;
import java.util.stream.Collectors;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.Create;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
@ -19,37 +15,31 @@ import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
import java.util.stream.Collectors;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<T> {
protected final List<ProcessingIngredient> ingredients;
private final List<ProcessingOutput> results;
private final IRecipeType<?> type;
private final IRecipeSerializer<?> serializer;
protected final ResourceLocation id;
protected final String group;
protected final int processingDuration;
protected final List<FluidStack> fluidIngredients;
protected final List<FluidStack> fluidResults;
protected final int requiredHeat;
private final List<ProcessingOutput> results;
private final IRecipeType<?> type;
private final IRecipeSerializer<?> serializer;
public ProcessingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group,
List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, int processingDuration) {
this.type = recipeType.type;
this.serializer = recipeType.serializer;
this.id = id;
this.group = group;
this.ingredients = ingredients;
this.results = results;
this.processingDuration = processingDuration;
this.fluidIngredients = null;
this.fluidResults = null;
validate(recipeType);
this(recipeType, id, group, ingredients, results, processingDuration, null, null, 0);
}
public ProcessingRecipe(AllRecipeTypes recipeType, ResourceLocation id, String group,
List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, int processingDuration,
@Nullable List<FluidStack> fluidIngredients, @Nullable List<FluidStack> fluidResults) {
@Nullable List<FluidStack> fluidIngredients, @Nullable List<FluidStack> fluidResults, int requiredHeat) {
this.type = recipeType.type;
this.serializer = recipeType.serializer;
this.id = id;
@ -59,6 +49,7 @@ public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<
this.processingDuration = processingDuration;
this.fluidIngredients = fluidIngredients;
this.fluidResults = fluidResults;
this.requiredHeat = requiredHeat;
validate(recipeType);
}
@ -167,4 +158,8 @@ public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<
protected boolean canHaveFluidOutput() {
return false;
}
protected boolean requiresHeating() {
return false;
}
}

View file

@ -1,11 +1,7 @@
package com.simibubi.create.content.contraptions.processing;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.fluid.Fluid;
import net.minecraft.item.ItemStack;
@ -17,7 +13,10 @@ import net.minecraft.util.registry.Registry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.registries.ForgeRegistries;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.List;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
@ -39,18 +38,11 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
for (JsonElement e : JSONUtils.getJsonArray(json, "ingredients")) {
JsonObject entry = e.getAsJsonObject();
if (JSONUtils.hasField(entry, "fluid")) {
Fluid fluid = ForgeRegistries.FLUIDS
.getValue(ResourceLocation.tryCreate(JSONUtils.getString(entry.get("fluid"), "fluid")));
int amount = 1;
if (JSONUtils.hasField((JsonObject) e, "amount")) {
amount = JSONUtils.getInt(entry.get("amount"), "amount");
}
if (fluid != null && amount > 0)
fluidIngredients.add(new FluidStack(fluid, amount));
addFluidToList(fluidIngredients, entry);
} else {
int count = 1;
if (JSONUtils.hasField((JsonObject) e, "count")) {
count = JSONUtils.getInt(entry.get("count"), "count");
if (JSONUtils.hasField(entry, "count")) {
count = JSONUtils.getInt(entry, "count");
}
for (int i = 0; i < count; i++) {
ingredients.add(ProcessingIngredient.parse(entry));
@ -63,20 +55,13 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
for (JsonElement e : JSONUtils.getJsonArray(json, "results")) {
JsonObject entry = e.getAsJsonObject();
if (JSONUtils.hasField(entry, "fluid")) {
Fluid fluid = ForgeRegistries.FLUIDS
.getValue(ResourceLocation.tryCreate(JSONUtils.getString(entry.get("fluid"), "fluid")));
int amount = 1;
if (JSONUtils.hasField((JsonObject) e, "amount")) {
amount = JSONUtils.getInt(entry.get("amount"), "amount");
}
if (fluid != null && amount > 0)
fluidResults.add(new FluidStack(fluid, amount));
addFluidToList(fluidResults, entry);
} else {
String s1 = JSONUtils.getString(entry.get("item"), "item");
int i = JSONUtils.getInt(entry.get("count"), "count");
String s1 = JSONUtils.getString(entry, "item");
int i = JSONUtils.getInt(entry, "count");
float chance = 1;
if (JSONUtils.hasField((JsonObject) e, "chance"))
chance = JSONUtils.getFloat(entry.get("chance"), "chance");
if (JSONUtils.hasField(entry, "chance"))
chance = JSONUtils.getFloat(entry, "chance");
ItemStack itemstack = new ItemStack(Registry.ITEM.getOrDefault(new ResourceLocation(s1)), i);
results.add(new ProcessingOutput(itemstack, chance));
}
@ -86,7 +71,22 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
if (JSONUtils.hasField(json, "processingTime"))
duration = JSONUtils.getInt(json, "processingTime");
return this.factory.create(recipeId, s, ingredients, results, duration, fluidIngredients, fluidResults);
int requiredHeat = 0;
if (JSONUtils.hasField(json, "requiredHeat"))
requiredHeat = JSONUtils.getInt(json, "requiredHeat");
return this.factory.create(recipeId, s, ingredients, results, duration, fluidIngredients, fluidResults,
requiredHeat);
}
private void addFluidToList(List<FluidStack> fluidStacks, JsonObject entry) {
Fluid fluid = ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryCreate(JSONUtils.getString(entry, "fluid")));
int amount = 1;
if (JSONUtils.hasField(entry, "amount")) {
amount = JSONUtils.getInt(entry, "amount");
}
if (fluid != null && amount > 0)
fluidStacks.add(new FluidStack(fluid, amount));
}
public T read(ResourceLocation recipeId, PacketBuffer buffer) {
@ -113,8 +113,10 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
fluidResults.add(FluidStack.readFromPacket(buffer));
int duration = buffer.readInt();
int requiredHeat = buffer.readInt();
return this.factory.create(recipeId, s, ingredients, results, duration, fluidIngredients, fluidResults);
return this.factory.create(recipeId, s, ingredients, results, duration, fluidIngredients, fluidResults,
requiredHeat);
}
public void write(PacketBuffer buffer, T recipe) {
@ -141,12 +143,30 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
}
buffer.writeInt(recipe.processingDuration);
buffer.writeInt(recipe.requiredHeat);
}
public interface IRecipeFactory<T extends ProcessingRecipe<?>> {
default T create(ResourceLocation recipeId, String s, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int duration, @Nullable List<FluidStack> fluidIngredients,
@Nullable List<FluidStack> fluidResults, int requiredHeat) {
return create(recipeId, s, ingredients, results, duration);
}
T create(ResourceLocation recipeId, String s, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int duration, List<FluidStack> fluidIngredients,
List<FluidStack> fluidResults);
List<ProcessingOutput> results, int duration);
}
public interface IExtendedRecipeFactory<T extends ProcessingRecipe<?>> extends IRecipeFactory<T> {
@Override
T create(ResourceLocation recipeId, String s, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int duration, @Nullable List<FluidStack> fluidIngredients,
@Nullable List<FluidStack> fluidResults, int requiredHeat);
@Override
default T create(ResourceLocation recipeId, String s, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int duration) {
throw new IllegalStateException("Incorrect recipe creation function used: " + recipeId);
}
}
}

View file

@ -1,30 +1,26 @@
package com.simibubi.create.content.curiosities.tools;
import java.util.List;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe.SandPaperInv;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@ParametersAreNonnullByDefault
public class SandPaperPolishingRecipe extends ProcessingRecipe<SandPaperInv> {
public SandPaperPolishingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration, List<FluidStack> fluidIngredients,
List<FluidStack> fluidResults) {
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipeTypes.SANDPAPER_POLISHING, id, group, ingredients, results, processingDuration);
}
@ -41,17 +37,17 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe<SandPaperInv> {
return stack;
}
public static List<IRecipe<SandPaperInv>> getMatchingRecipes(World world, ItemStack stack) {
return world.getRecipeManager()
.getRecipes(AllRecipeTypes.SANDPAPER_POLISHING.getType(), new SandPaperInv(stack), world);
}
@Override
public boolean matches(SandPaperInv inv, World worldIn) {
return ingredients.get(0)
.test(inv.getStackInSlot(0));
}
public static List<IRecipe<SandPaperInv>> getMatchingRecipes(World world, ItemStack stack) {
return world.getRecipeManager()
.getRecipes(AllRecipeTypes.SANDPAPER_POLISHING.getType(), new SandPaperInv(stack), world);
}
@Override
protected int getMaxOutputCount() {
return 1;