package mekanism.common.recipe.outputs; import java.util.Random; import mekanism.api.util.StackUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; public class ChanceOutput extends MachineOutput<ChanceOutput> { private static Random rand = new Random(); public ItemStack primaryOutput; public ItemStack secondaryOutput; public double secondaryChance; public ChanceOutput(ItemStack primary, ItemStack secondary, double chance) { primaryOutput = primary; secondaryOutput = secondary; secondaryChance = chance; } public ChanceOutput() {} @Override public void load(NBTTagCompound nbtTags) { primaryOutput = ItemStack.loadItemStackFromNBT(nbtTags.getCompoundTag("primaryOutput")); secondaryOutput = ItemStack.loadItemStackFromNBT(nbtTags.getCompoundTag("secondaryOutput")); secondaryChance = nbtTags.getDouble("secondaryChance"); } public ChanceOutput(ItemStack primary) { primaryOutput = primary; } public boolean checkSecondary() { return rand.nextDouble() <= secondaryChance; } public boolean hasPrimary() { return primaryOutput != null; } public boolean hasSecondary() { return secondaryOutput != null; } public boolean applyOutputs(ItemStack[] inventory, int primaryIndex, int secondaryIndex, boolean doEmit) { if(hasPrimary()) { if(inventory[primaryIndex] == null) { if(doEmit) { inventory[primaryIndex] = primaryOutput.copy(); } } else if(inventory[primaryIndex].isItemEqual(primaryOutput) && inventory[primaryIndex].stackSize + primaryOutput.stackSize <= inventory[primaryIndex].getMaxStackSize()) { if(doEmit) { inventory[primaryIndex].stackSize += primaryOutput.stackSize; } } else { return false; } } if(hasSecondary() && (!doEmit || checkSecondary())) { if(inventory[secondaryIndex] == null) { if(doEmit) { inventory[secondaryIndex] = secondaryOutput.copy(); } return true; } else if(inventory[secondaryIndex].isItemEqual(secondaryOutput) && inventory[secondaryIndex].stackSize + primaryOutput.stackSize <= inventory[secondaryIndex].getMaxStackSize()) { if(doEmit) { inventory[secondaryIndex].stackSize += secondaryOutput.stackSize; } return true; } else { return false; } } return true; } @Override public ChanceOutput copy() { return new ChanceOutput(StackUtils.copy(primaryOutput), StackUtils.copy(secondaryOutput), secondaryChance); } }