package gregtech.api.util;
import static gregtech.api.enums.GT_Values.E;
import static gregtech.api.enums.GT_Values.RES_PATH_GUI;
import static gregtech.api.enums.GT_Values.W;
import java.util.*;
import codechicken.nei.PositionedStack;
import gregtech.api.GregTech_API;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
import gregtech.api.objects.GT_ItemStack;
import gtPlusPlus.api.interfaces.IComparableRecipe;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.api.objects.data.AutoMap;
import gtPlusPlus.api.objects.minecraft.NoConflictGTRecipeMap;
import gtPlusPlus.core.lib.CORE;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
/**
* Custom GT Recipe Class
* @author Alkalus
*
*/
public class GTPP_Recipe extends GT_Recipe implements IComparableRecipe {
private final String mRecipeHash;
private final AutoMap<Integer> mHashMap = new AutoMap<Integer>();
public GTPP_Recipe(final boolean aOptimize, final ItemStack[] aInputs, final ItemStack[] aOutputs, final Object aSpecialItems, final int[] aChances, final FluidStack[] aFluidInputs, final FluidStack[] aFluidOutputs, final int aDuration, final int aEUt, final int aSpecialValue) {
super(aOptimize, aInputs, aOutputs, aSpecialItems, aChances, aFluidInputs, aFluidOutputs, aDuration, aEUt, aSpecialValue);
//Logger.SPECIFIC_WARNING(this.getClass().getName()+" | [GregtechRecipe]", "Created new recipe instance for "+ItemUtils.getArrayStackNames(aInputs), 167);
mRecipeHash = getRecipeHash(this);
mHashMap.addAll(convertStringDataToInts(getEncodedRecipeData(this)));
}
public GTPP_Recipe(final ItemStack aInput1, final ItemStack aOutput1, final int aFuelValue, final int aType) {
this(aInput1, aOutput1, null, null, null, aFuelValue, aType);
}
private static AutoMap<Integer> convertStringDataToInts(AutoMap<String> aData){
AutoMap<Integer> aMap = new AutoMap<Integer>();
for (String string : aData) {
aMap.add(string.hashCode());
}
return aMap;
}
private static AutoMap<String> getEncodedRecipeData(GTPP_Recipe aRecipe){
AutoMap<String> aData = new AutoMap<String>();
aData.add(aRecipe.mRecipeHash);
aData.add(""+aRecipe.mCanBeBuffered);
aData.add(""+aRecipe.mHidden);
aData.add(""+aRecipe.mEnabled);
aData.add(""+aRecipe.mDuration);
aData.add(""+aRecipe.mEUt);
aData.add(""+aRecipe.mFakeRecipe);
aData.add(""+aRecipe.mSpecialItems);
aData.add(aRecipe.mChances.toString());
aData.add(aRecipe.mInputs.toString());
aData.add(aRecipe.mOutputs.toString());
aData.add(aRecipe.mFluidInputs.toString());
aData.add(aRecipe.mFluidOutputs.toString());
return aData;
}
public static String getRecipeHash(GT_Recipe aRecipe) {
String aEncoderString = aRecipe.toString();
return aEncoderString;
}
private final void checkModified() {
if (hasBeenModified()) {
CORE.crash("Someone has edited an internal GT++ recipe, which is no longer allowed. Please complain to whoever has done this, not Alkalus.");
}
}
private final boolean hasBeenModified() {
String aEncoderString = this.toString();
boolean aBasicHashCheck = mRecipeHash.equals(aEncoderString);
if (!aBasicHashCheck) {
Logger.INFO("This Recipe Hash: "+aEncoderString);
Logger.INFO("Expected Hash Code: "+mRecipeHash);
return true;
}
AutoMap<Integer> aData = new AutoMap<Integer>();
aData.addAll(convertStringDataToInts(getEncodedRecipeData(this)));
long aHashTotal = 0;
long aExpectedHashTotal = 0;
for (int a : aData) {
aHashTotal += a;
}
for (int a :