package mods.recipear.modules;
import ic2.api.recipe.IRecipeInput;
import ic2.api.recipe.RecipeOutput;
import ic2.api.recipe.Recipes;
import java.text.DecimalFormat;
import java.util.Iterator;
import java.util.Map;
import mods.recipear.BannedRecipes;
import mods.recipear.Recipear;
import mods.recipear.RecipearLogger;
import mods.recipear.RecipearOutput;
import mods.recipear.RecipearUtil;
import mods.recipear.api.IRecipear;
import mods.recipear.api.RecipearEvent;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
@Mod(modid = "Recipear2|IC2", name = "IC2", version = "2.3.1", dependencies="required-after:Recipear2@[2.3,)")
public class RecipearIC2 implements IRecipear{
String prefix = "[" + getName() + "] ";
@EventHandler
public void postInit(FMLPostInitializationEvent event)
{
Recipear.events.add(this);
}
public void trigger(RecipearEvent event) {
if(Loader.isModLoaded(getModID()))
{
if(event.isOutput())
{
RemoveFromMachines(Recipes.centrifuge.getRecipes(), "CENTRIFUGE", event);
RemoveFromMachines(Recipes.compressor.getRecipes(), "COMPRESSOR", event);
RemoveFromMachines(Recipes.extractor.getRecipes(), "EXTRACTOR", event);
RemoveFromMachines(Recipes.macerator.getRecipes(), "MACERATOR", event);
RemoveFromMachines(Recipes.oreWashing.getRecipes(), "OREWASHING", event);
RemoveFromMachines(Recipes.metalformerCutting.getRecipes(), "METALFORMER_CUTTING", event);
RemoveFromMachines(Recipes.metalformerExtruding.getRecipes(), "METALFORMER_EXTRUDING", event);
RemoveFromMachines(Recipes.metalformerRolling.getRecipes(), "METALFORMER_ROLLING", event);
ScrapBox(Recipes.scrapboxDrops.getDrops(), "SCRAPBOX", event);
}
else if(BannedRecipes.GetBannedRecipeAmount() > 0)
{
RecipearLogger.info(RemoveFromMachines(Recipes.centrifuge.getRecipes(), "CENTRIFUGE", event));
RecipearLogger.info(RemoveFromMachines(Recipes.compressor.getRecipes(), "COMPRESSOR", event));
RecipearLogger.info(RemoveFromMachines(Recipes.extractor.getRecipes(), "EXTRACTOR", event));
RecipearLogger.info(RemoveFromMachines(Recipes.macerator.getRecipes(), "MACERATOR", event));
RecipearLogger.info(RemoveFromMachines(Recipes.oreWashing.getRecipes(), "OREWASHING", event));
RecipearLogger.info(RemoveFromMachines(Recipes.metalformerCutting.getRecipes(), "METALFORMER_CUTTING", event));
RecipearLogger.info(RemoveFromMachines(Recipes.metalformerExtruding.getRecipes(), "METALFORMER_EXTRUDING", event));
RecipearLogger.info(RemoveFromMachines(Recipes.metalformerRolling.getRecipes(), "METALFORMER_ROLLING", event));
RecipearLogger.info(ScrapBox(Recipes.scrapboxDrops.getDrops(), "SCRAPBOX", event));
}
}
else
{
RecipearLogger.info(prefix + "Could not find " + getModID());
}
}
public String ScrapBox(Map<ItemStack, Float> drops, String machine, RecipearEvent event) {
DecimalFormat liquidAmountFormat = new DecimalFormat("0.##%");
if(event.isOutput()) {
RecipearOutput.add("-- " + machine + " --");
} else {
RecipearLogger.info(prefix + "Scanning through " + drops.size() + " recipe(s) for " + machine);
}
int countRemoved = 0, index = 0;
for (Iterator itr = drops.entrySet().iterator(); itr.hasNext();) {
try {
Map.Entry entry = (Map.Entry) itr.next();
ItemStack itemstack = (ItemStack) entry.getKey();
Float chance = (Float) entry.getValue();
if((itemstack == null) || (chance == null)) {
index++;
continue;
}
boolean found = false;
String recipe_output = RecipearUtil.getFancyItemStackInfo(itemstack) + ", CHANCE: " + liquidAmountFormat.format(chance);
if(BannedRecipes.Check(itemstack.itemID, itemstack.getItemDamage(), machine) ||
BannedRecipes.Check(RecipearUtil.getLanguageRegistryEntry(itemstack), machine)) {
found = true;
}
if(event.isOutput()) {
RecipearOutput.add("i(" + index + ") OUTPUT[" + recipe_output + "]");
} else if (found) {
RecipearOutput.add("i(" + index + ") OUTPUT[" + recipe_output + "]");
}
if(found) {
itr.remove();
countRemoved++;
}
index++;
} catch (Exception ex) {
ex.printStackTrace();
}
}
return prefix + "Removed " + countRemoved + " " + machine + " recipe(s)";
}
public String RemoveFromMachines(Map recipes, String machine, RecipearEvent event)
{
if(event.isOutput()) {
RecipearOutput.add("-- " + machine + " --");
} else {
RecipearLogger.info(prefix + "Scanning through " + recipes.size() + " recipe(s) for " + machine);
}
int countRemoved = 0, index = 0;
for (Iterator itr = recipes.entrySet().iterator(); itr.hasNext();) {
try {
Map.Entry entry = (Map.Entry) itr.next();
IRecipeInput recipe_input = (IRecipeInput) entry.getKey();
RecipeOutput recipe_output = (RecipeOutput) entry.getValue();
if((recipe_input == null) || (recipe_output == null)) {
index++;
continue;
}
String recipe_inputs = "N/A";
for(ItemStack itemstack : recipe_input.getInputs()) {
if(itemstack == null) {
continue;
}
String temp = RecipearUtil.getLanguageRegistryEntry(itemstack) + "@" + itemstack.itemID + ":" + itemstack.getItemDamage() + " x " + recipe_input.getAmount();
String oreName = RecipearUtil.getOreName(itemstack);
if(!oreName.equals("Unknown")) {
temp = oreName + " x " + recipe_input.getAmount();
}
if(recipe_inputs.equals("N/A")) {
recipe_inputs = temp;
} else {
recipe_inputs += ", " + temp;
}
}
boolean found = false;
String recipe_outputs = "N/A";
for(Iterator<ItemStack> items_itr = recipe_output.items.iterator(); items_itr.hasNext();) {
ItemStack itemstack = items_itr.next();
if (itemstack == null) {
continue;
}
String temp = RecipearUtil.getFancyItemStackInfo(itemstack);
if(recipe_outputs.equals("N/A")) {
recipe_outputs = temp;
} else {
recipe_outputs += ", " + temp;
}
if(BannedRecipes.Check(itemstack.itemID, itemstack.getItemDamage(), machine) ||
BannedRecipes.Check(RecipearUtil.getLanguageRegistryEntry(itemstack), machine)) {
found = true;
}
}
if(event.isOutput()) {
RecipearOutput.add("i(" + index + ") " + machine + " Recipe");
RecipearOutput.add("INPUT[" + recipe_inputs + "]");
RecipearOutput.add("OUTPUT[" + recipe_outputs + "]");
} else if (found) {
RecipearLogger.info("i(" + index + ") " + machine + " Recipe");
RecipearLogger.info("INPUT[" + recipe_inputs + "]");
RecipearLogger.info("OUTPUT[" + recipe_outputs + "]");
}
if(found) {
itr.remove();
countRemoved++;
}
index++;
} catch (Exception ex) {
ex.printStackTrace();
}
}
return prefix + "Removed " + countRemoved + " " + machine + " recipe(s)";
}
@Override
public String[] getTypes() {
return new String[] {"CENTRIFUGE", "COMPRESSOR", "EXTRACTOR", "MACERATOR", "OREWASHING", "METALFORMER_CUTTING", "METALFORMER_EXTRUDING", "METALFORMER_ROLLING", "SCRAPBOX"};
}
@Override
public String getName() {
return getModID();
}
@Override
public String getFullName() {
return "IndustrialCraft2";
}
@Override
public String getModID() {
return "IC2";
}
}