package wayoftime.bloodmagic.api.recipe; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.annotation.Nonnull; import org.apache.commons.lang3.tuple.Pair; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; import net.minecraft.network.PacketBuffer; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidStack; import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient; public abstract class RecipeARC extends BloodMagicRecipe { public static final int MAX_RANDOM_OUTPUTS = 3; @Nonnull private final Ingredient input; @Nonnull private final Ingredient arc_tool; private final FluidStackIngredient inputFluid; @Nonnull private final ItemStack output; private final FluidStack outputFluid; private final boolean consumeIngredient; private final List> addedItems; protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, FluidStack outputFluid, boolean consumeIngredient) { this(id, input, arc_tool, inputFluid, output, new ArrayList>(), outputFluid, consumeIngredient); } protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, List> addedItems, FluidStack outputFluid, boolean consumeIngredient) { super(id); this.input = input; this.arc_tool = arc_tool; this.inputFluid = inputFluid; this.output = output; this.addedItems = addedItems; this.outputFluid = outputFluid; this.consumeIngredient = consumeIngredient; } public RecipeARC addRandomOutput(ItemStack stack, double chance) { if (addedItems.size() >= MAX_RANDOM_OUTPUTS) { return this; } addedItems.add(Pair.of(stack, chance)); return this; } @Nonnull public final Ingredient getInput() { return input; } @Nonnull public final Ingredient getTool() { return arc_tool; } public final FluidStackIngredient getFluidIngredient() { return inputFluid; } public final FluidStack getFluidOutput() { return outputFluid; } @Override public final NonNullList getIngredients() { NonNullList list = NonNullList.create(); list.add(getInput()); list.add(getTool()); return list; } public List getAllListedOutputs() { List list = new ArrayList(); list.add(output.copy()); for (Pair pair : addedItems) { list.add(pair.getLeft().copy()); } return list; } public List getAllOutputs(Random rand) { List list = new ArrayList(); list.add(output.copy()); for (Pair pair : addedItems) { if (rand.nextDouble() < pair.getRight()) list.add(pair.getLeft().copy()); } return list; } public double[] getAllOutputChances() { int size = addedItems.size(); double[] chanceArray = new double[size]; for (int i = 0; i < size; i++) { chanceArray[i] = addedItems.get(i).getRight(); } return chanceArray; } public boolean getConsumeIngredient() { return consumeIngredient; } @Override public void write(PacketBuffer buffer) { input.write(buffer); arc_tool.write(buffer); buffer.writeItemStack(output); buffer.writeInt(addedItems.size()); for (Pair pair : addedItems) { buffer.writeItemStack(pair.getLeft()); buffer.writeDouble(pair.getValue()); } buffer.writeBoolean(inputFluid != null); if (inputFluid != null) { inputFluid.write(buffer); } buffer.writeBoolean(outputFluid != null); if (outputFluid != null) { outputFluid.writeToPacket(buffer); } buffer.writeBoolean(consumeIngredient); } }