package crazypants.enderio.machine.painter;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import com.enderio.core.common.util.ItemUtil;
import com.enderio.core.common.util.Util;
import crazypants.enderio.config.Config;
import crazypants.enderio.machine.recipe.RecipeInput;
public class PaintSourceValidator {
public static PaintSourceValidator instance = new PaintSourceValidator();
private boolean listsPopulated = false;
private final List<RecipeInput> whitelist = new ArrayList<RecipeInput>();
private final List<RecipeInput> blacklist = new ArrayList<RecipeInput>();
public boolean isValidSourceDefault(ItemStack paintSource) {
if(paintSource == null) {
return false;
}
Block block = Util.getBlockFromItemId(paintSource);
if(block == null || block instanceof IPaintedBlock) {
return false;
}
if(isBlacklisted(paintSource)) {
return false;
}
if(isWhitelisted(paintSource)) {
return true;
}
if(!Config.allowTileEntitiesAsPaintSource && block instanceof ITileEntityProvider) {
return false;
}
return block.isOpaqueCube() || (block.getMaterial().isOpaque() && block.renderAsNormalBlock()) || block == Blocks.glass;
}
public boolean isWhitelisted(ItemStack paintSource) {
return isInList(paintSource, whitelist);
}
public boolean isBlacklisted(ItemStack paintSource) {
return isInList(paintSource, blacklist);
}
public void addToWhitelist(ItemStack input) {
addToWhitelist(new RecipeInput(input, true));
}
public void addToWhitelist(RecipeInput input) {
whitelist.add(input);
}
public void addToBlacklist(ItemStack input) {
addToBlacklist(new RecipeInput(input, true));
}
public void addToBlacklist(RecipeInput input) {
blacklist.add(input);
}
public void removeFromWhitelist(RecipeInput input) {
removeFromList(input, whitelist);
}
public void removeFromBlackList(RecipeInput input) {
removeFromList(input, blacklist);
}
protected boolean isInList(ItemStack paintSource, List<RecipeInput> list) {
if(paintSource == null) {
return false;
}
for (RecipeInput ri : list) {
if(ri != null && ri.isInput(paintSource)) {
return true;
}
}
return false;
}
protected void removeFromList(RecipeInput input, List<RecipeInput> list) {
ItemStack inStack = input.getInput();
if(inStack == null) {
return;
}
RecipeInput toRemove = null;
for (RecipeInput in : list) {
if(ItemUtil.areStacksEqual(inStack, in.getInput())) {
toRemove = in;
break;
}
}
if(toRemove != null) {
list.remove(toRemove);
}
}
public void loadConfig() {
PaintSourceParser.loadConfig();
}
}