package crazypants.enderio.machine.soul;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.entity.EntityList;
import net.minecraft.item.ItemStack;
import crazypants.enderio.EnderIO;
import crazypants.enderio.ModObject;
import crazypants.enderio.machine.IMachineRecipe;
import crazypants.enderio.machine.MachineRecipeInput;
import crazypants.enderio.machine.recipe.RecipeBonusType;
import crazypants.enderio.xp.XpUtil;
import java.util.Arrays;
public abstract class AbstractSoulBinderRecipe implements IMachineRecipe, ISoulBinderRecipe {
private final int energyRequired;
private final String uid;
private final int xpLevelsRequired;
private final int xpRequired;
private final List<String> supportedEntities;
protected AbstractSoulBinderRecipe(int energyRequired, int xpLevelsRequired, String uid, Class<?> entityClass) {
this(energyRequired, xpLevelsRequired, uid, (String)EntityList.classToStringMapping.get(entityClass));
}
protected AbstractSoulBinderRecipe(int energyRequired, int xpLevelsRequired, String uid, String... entityNames) {
this.energyRequired = energyRequired;
this.xpLevelsRequired = xpLevelsRequired;
this.xpRequired = XpUtil.getExperienceForLevel(xpLevelsRequired);
this.uid = uid;
this.supportedEntities = Arrays.asList(entityNames);
}
@Override
public String getUid() {
return uid;
}
@Override
public int getExperienceLevelsRequired() {
return xpLevelsRequired;
}
@Override
public int getExperienceRequired() {
return xpRequired;
}
@Override
public int getEnergyRequired(MachineRecipeInput... inputs) {
return getEnergyRequired();
}
@Override
public RecipeBonusType getBonusType(MachineRecipeInput... inputs) {
return RecipeBonusType.NONE;
}
@Override
public boolean isRecipe(MachineRecipeInput... inputs) {
int validCount = 0;
for(MachineRecipeInput input : inputs) {
if(isValidInput(input)) {
validCount++;
} else {
return false;
}
}
return validCount == 2;
}
@Override
public ResultStack[] getCompletedResult(float randomChance, MachineRecipeInput... inputs) {
String mobType = null;
for(MachineRecipeInput input : inputs) {
if(input != null && EnderIO.itemSoulVessel.containsSoul(input.item)) {
mobType = EnderIO.itemSoulVessel.getMobTypeFromStack(input.item);
}
}
if(!getSupportedSouls().contains(mobType)) {
return new ResultStack[0];
}
ItemStack resultStack = getOutputStack(mobType);
ItemStack soulVessel = new ItemStack(EnderIO.itemSoulVessel);
return new ResultStack[] {new ResultStack(soulVessel), new ResultStack(resultStack)};
}
@Override
public float getExperienceForOutput(ItemStack output) {
return 0;
}
@Override
public boolean isValidInput(MachineRecipeInput input) {
if(input == null || input.item == null) {
return false;
}
int slot = input.slotNumber;
ItemStack item = input.item;
if(slot == 0) {
String type = EnderIO.itemSoulVessel.getMobTypeFromStack(item);
return getSupportedSouls().contains(type);
}
if(slot == 1) {
return item.isItemEqual(getInputStack());
}
return false;
}
@Override
public String getMachineName() {
return ModObject.blockSoulBinder.unlocalisedName;
}
@Override
public List<MachineRecipeInput> getQuantitiesConsumed(MachineRecipeInput[] inputs) {
List<MachineRecipeInput> result = new ArrayList<MachineRecipeInput>(inputs.length);
for(MachineRecipeInput input : inputs) {
if(input != null && input.item != null) {
ItemStack resStack = input.item.copy();
resStack.stackSize = 1;
MachineRecipeInput mri = new MachineRecipeInput(input.slotNumber, resStack);
result.add(mri);
}
}
return result;
}
protected ItemStack getOutputStack(String mobType) {
return getOutputStack();
}
@Override
public List<String> getSupportedSouls() {
return supportedEntities;
}
@Override
public int getEnergyRequired() {
return energyRequired;
}
}