package eiteam.esteemedinnovation.tools.steam.upgrades.drillhead;
import eiteam.esteemedinnovation.commons.util.OreDictHelper;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.ShapedOreRecipe;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class DrillHeadRecipe extends ShapedOreRecipe {
public DrillHeadRecipe(Item result, Object... recipe) {
super(result, recipe);
}
@Override
public ItemStack getCraftingResult(InventoryCrafting inv) {
ItemStack result = super.getCraftingResult(inv);
ItemDrillHeadUpgrade upgrade = (ItemDrillHeadUpgrade) result.getItem();
int numIronPlates = 0;
int numNuggets = 0;
int numIngots = 0;
int numOthers = 0;
ArrayList<String> materialSafetyNet = new ArrayList<>();
for (int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack stack = inv.getStackInSlot(i);
if (stack == null || stack.getItem() == null) {
continue;
}
Item item = stack.getItem();
int meta = stack.getItemDamage();
if (OreDictHelper.thinIronPlates.contains(Pair.of(stack.getItem(), stack.getItemDamage()))) {
numIronPlates += 1;
continue;
}
for (Map.Entry<String, Pair<List<ItemStack>, List<ItemStack>>> entry : DrillHeadMaterial.materialOres.entrySet()) {
String material = entry.getKey();
List<ItemStack> ingots = entry.getValue().getLeft();
List<ItemStack> nuggets = entry.getValue().getRight();
for (ItemStack ingot : ingots) {
if (ingot.getItem() == item && ingot.getItemDamage() == meta) {
numIngots += 1;
materialSafetyNet.add(material);
}
}
for (ItemStack nugget : nuggets) {
if (nugget.getItem() == item && nugget.getItemDamage() == meta) {
numNuggets += 1;
materialSafetyNet.add(material);
}
}
}
for (Map.Entry<String, List<ItemStack>> entry : DrillHeadMaterial.nonStandardMaterials.entrySet()) {
String material = entry.getKey();
List<ItemStack> list = entry.getValue();
for (ItemStack other : list) {
if (other.getItem() == item && other.getItemDamage() == meta) {
numOthers += 1;
materialSafetyNet.add(material);
}
}
}
}
if (!isNetSafe(materialSafetyNet) || numIronPlates != 3) {
return null;
}
String mat = materialSafetyNet.get(0);
if ((numOthers == 4 && numNuggets == 0 && numIngots == 0) ||
(numOthers == 0 && numNuggets == 1 && numIngots == 3)) {
upgrade.setMyMaterial(result, mat);
return result;
}
return null;
}
/**
* Checks whether every value in the safety net is equal to the first one.
* @param ary The ArrayList safety net.
* @return Whether it is all equal strings or not.
*/
private boolean isNetSafe(ArrayList<String> ary) {
for (String s : ary) {
if (!s.equals(ary.get(0))) {
return false;
}
}
return true;
}
}