package gtPlusPlus.xmod.gregtech.api.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import gregtech.api.GregTech_API;
import gregtech.api.enums.*;
import gregtech.api.objects.GT_HashSet;
import gregtech.api.objects.GT_ItemStack;
import gregtech.api.util.*;
import gregtech.common.GT_Proxy.OreDictEventContainer;
import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
import gtPlusPlus.xmod.gregtech.api.objects.GregtechItemData;
import gtPlusPlus.xmod.gregtech.api.objects.GregtechMaterialStack;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
/**
* NEVER INCLUDE THIS FILE IN YOUR MOD!!!
*
* This is the Core of my OreDict Unification Code
*
* If you just want to use this to unificate your Items, then use the Function
* in the GregTech_API File
*
* P.S. It is intended to be named "Unificator" and not "Unifier", because that
* sounds more awesome.
*/
public class GregtechOreDictUnificator {
private static final HashMap sName2StackMap = new HashMap();
private static final HashMap sItemStack2DataMap = new HashMap();
private static final GT_HashSet sNoUnificationList = new GT_HashSet();
public static volatile int VERSION = 508;
private static int isRegisteringOre = 0, isAddingOre = 0;
private static boolean mRunThroughTheList = true;
static {
GregTech_API.sItemStackMappings.add(GregtechOreDictUnificator.sItemStack2DataMap);
}
public static void add(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, final ItemStack aStack) {
GregtechOreDictUnificator.set(aPrefix, aMaterial, aStack, false, false);
}
public static void addAssociation(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial,
final ItemStack aStack, final boolean aBlackListed) {
if (aPrefix == null || aMaterial == null || GT_Utility.isStackInvalid(aStack)) {
return;
}
if (Items.feather.getDamage(aStack) == GT_Values.W) {
for (byte i = 0; i < 16; i++) {
GregtechOreDictUnificator.setItemData(GT_Utility.copyAmountAndMetaData(1, i, aStack),
new GregtechItemData(aPrefix, aMaterial, aBlackListed));
}
}
GregtechOreDictUnificator.setItemData(aStack, new GregtechItemData(aPrefix, aMaterial, aBlackListed));
}
public static void addItemData(final ItemStack aStack, final GregtechItemData aData) {
if (GT_Utility.isStackValid(aStack) && GregtechOreDictUnificator.getItemData(aStack) == null && aData != null) {
GregtechOreDictUnificator.setItemData(aStack, aData);
}
}
/**
* The Blacklist just prevents the Item from being unificated into something
* else. Useful if you have things like the Industrial Diamond, which is
* better than regular Diamond, but also usable in absolutely all Diamond
* Recipes.
*/
public static void addToBlacklist(final ItemStack aStack) {
if (GT_Utility.isStackValid(aStack)
&& !GT_Utility.isStackInList(aStack, GregtechOreDictUnificator.sNoUnificationList)) {
GregtechOreDictUnificator.sNoUnificationList.add(aStack);
}
}
public static ItemStack get(final boolean aUseBlackList, final ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) {
return null;
}
final GregtechItemData tPrefixMaterial = GregtechOreDictUnificator.getAssociation(aStack);
ItemStack rStack = null;
if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData()
|| aUseBlackList && tPrefixMaterial.mBlackListed) {
return GT_Utility.copy(aStack);
}
if (aUseBlackList && !GregTech_API.sUnificationEntriesRegistered
&& GregtechOreDictUnificator.isBlacklisted(aStack)) {
tPrefixMaterial.mBlackListed = true;
return GT_Utility.copy(aStack);
}
if (tPrefixMaterial.mUnificationTarget == null) {
tPrefixMaterial.mUnificationTarget = GregtechOreDictUnificator.sName2StackMap
.get(tPrefixMaterial.toString());
}
rStack = tPrefixMaterial.mUnificationTarget;
if (GT_Utility.isStackInvalid(rStack)) {
return GT_Utility.copy(aStack);
}
assert rStack != null;
rStack.setTagCompound(aStack.getTagCompound());
return GT_Utility.copyAmount(aStack.stackSize, rStack);
}
public static ItemStack get(final GregtechOrePrefixes aPrefix, final Object aMaterial, final ItemStack aReplacement,
final long aAmount) {
return GregtechOreDictUnificator.get(aPrefix.get(aMaterial), aReplacement, aAmount, false, true);
}
public static ItemStack get(final GregtechOrePrefixes aPrefix, final Object aMaterial, final long aAmount) {
return GregtechOreDictUnificator.get(aPrefix, aMaterial, null, aAmount);
}
public static ItemStack get(final ItemStack aStack) {
return GregtechOreDictUnificator.get(true, aStack);
}
public static ItemStack get(final Object aName, final ItemStack aReplacement, final long aAmount) {
return GregtechOreDictUnificator.get(aName, aReplacement, aAmount, true, true);
}
public static ItemStack get(final Object aName, final ItemStack aReplacement, final long aAmount,
final boolean aMentionPossibleTypos, final boolean aNoInvalidAmounts) {
if (aNoInvalidAmounts && aAmount < 1) {
return null;
}
if (!GregtechOreDictUnificator.sName2StackMap.containsKey(aName.toString()) && aMentionPossibleTypos) {
GT_Log.err.println("Unknown Key for Unification, Typo? " + aName);
}
return GT_Utility.copyAmount(aAmount, GregtechOreDictUnificator.sName2StackMap.get(aName.toString()),
GregtechOreDictUnificator.getFirstOre(aName, aAmount), aReplacement);
}
public static ItemStack get(final Object aName, final long aAmount) {
return GregtechOreDictUnificator.get(aName, null, aAmount, true, true);
}
public static GregtechItemData getAssociation(final ItemStack aStack) {
final GregtechItemData rData = GregtechOreDictUnificator.getItemData(aStack);
return rData != null && rData.hasValidPrefixMaterialData() ? rData : null;
}
public static ItemStack getDust(final GregtechMaterialStack aMaterial) {
return aMaterial == null ? null : GregtechOreDictUnificator.getDust(aMaterial.mMaterial, aMaterial.mAmount);
}
public static ItemStack getDust(final GT_Materials aMaterial, final long aMaterialAmount) {
if (aMaterialAmount <= 0) {
return null;
}
ItemStack rStack = null;
if (aMaterialAmount % GT_Values.M == 0 || aMaterialAmount >= GT_Values.M * 16) {
rStack = GregtechOreDictUnificator.get(GregtechOrePrefixes.dust, aMaterial, aMaterialAmount / GT_Values.M);
}
if (rStack == null && (aMaterialAmount * 4 % GT_Values.M == 0 || aMaterialAmount >= GT_Values.M * 8)) {
rStack = GregtechOreDictUnificator.get(GregtechOrePrefixes.dustSmall, aMaterial,
aMaterialAmount * 4 / GT_Values.M);
}
if (rStack == null && aMaterialAmount * 9 >= GT_Values.M) {
rStack = GregtechOreDictUnificator.get(GregtechOrePrefixes.dustTiny, aMaterial,
aMaterialAmount * 9 / GT_Values.M);
}
return rStack;
}
public static ItemStack getDust(final GT_Materials aMaterial, final OrePrefixes aPrefix) {
return aMaterial == null ? null : GregtechOreDictUnificator.getDust(aMaterial, aPrefix.mMaterialAmount);
}
public static ItemStack getDustOrIngot(final GregtechMaterialStack aMaterial) {
ItemStack rStack = GregtechOreDictUnificator.getDust(aMaterial);
if (rStack == null) {
rStack = GregtechOreDictUnificator.getIngot(aMaterial);
}
return rStack;
}
public static ItemStack getDustOrIngot(final GT_Materials aMaterial, final long aMaterialAmount) {
if (aMaterialAmount <= 0) {
return null;
}
ItemStack rStack = GregtechOreDictUnificator.getDust(aMaterial, aMaterialAmount);
if (rStack == null) {
rStack = GregtechOreDictUnificator.getIngot(aMaterial, aMaterialAmount);
}
return rStack;
}
public static ItemStack getFirstOre(final Object aName, final long aAmount) {
if (GT_Utility.isStringInvalid(aName)) {
return null;
}
final ItemStack tStack = GregtechOreDictUnificator.sName2StackMap.get(aName.toString());
if (GT_Utility.isStackValid(tStack)) {
return GT_Utility.copyAmount(aAmount, tStack);
}
return GT_Utility.copyAmount(aAmount, GregtechOreDictUnificator.getOres(aName).toArray());
}
public static ItemStack getGem(final GregtechMaterialStack aMaterial) {
return aMaterial == null ? null : GregtechOreDictUnificator.getGem(aMaterial.mMaterial, aMaterial.mAmount);
}
public static ItemStack getGem(final GT_Materials aMaterial, final long aMaterialAmount) {
ItemStack rStack = null;
if (aMaterialAmount >= GT_Values.M || aMaterialAmount >= GT_Values.M * 32) {
rStack = GregtechOreDictUnificator.get(GregtechOrePrefixes.gem, aMaterial, aMaterialAmount / GT_Values.M);
}
if (rStack == null && (aMaterialAmount * 2 % GT_Values.M == 0 || aMaterialAmount >= GT_Values.M * 16)) {
rStack = GregtechOreDictUnificator.get(GregtechOrePrefixes.gemFlawed, aMaterial,
aMaterialAmount * 2 / GT_Values.M);
}
if (rStack == null && aMaterialAmount * 4 >= GT_Values.M) {
rStack = GregtechOreDictUnificator.get(GregtechOrePrefixes.gemChipped, aMaterial,
aMaterialAmount * 4 / GT_Values.M);
}
return rStack;
}
public static ItemStack getGem(final GT_Materials aMaterial, final OrePrefixes aPrefix) {
return aMaterial == null ? null : GregtechOreDictUnificator.getGem(aMaterial, aPrefix.mMaterialAmount);
}
public static ItemStack getIngot(final GregtechMaterialStack aMaterial) {
return aMaterial == null ? null : GregtechOreDictUnificator.getIngot(aMaterial.mMaterial, aMaterial.mAmount);
}
public static ItemStack getIngot(final GT_Materials aMaterial, final long aMaterialAmount) {
if (aMaterialAmount <= 0) {
return null;
}
ItemStack rStack = null;
if (aMaterialAmount % (GT_Values.M * 9) == 0 && aMaterialAmount / (GT_Values.M * 9) > 1
|| aMaterialAmount >= GT_Values.M * 72) {
rStack = GregtechOreDictUnificator.get(GregtechOrePrefixes.block, aMaterial,
aMaterialAmount / (GT_Values.M * 9));
}
if (rStack == null && (aMaterialAmount % GT_Values.M == 0 || aMaterialAmount >= GT_Values.M * 8)) {
rStack = GregtechOreDictUnificator.get(GregtechOrePrefixes.ingot, aMaterial, aMaterialAmount / GT_Values.M);
}
if (rStack == null && aMaterialAmount * 9 >= GT_Values.M) {
rStack = GregtechOreDictUnificator.get(GregtechOrePrefixes.nugget, aMaterial,
aMaterialAmount * 9 / GT_Values.M);
}
return rStack;
}
public static ItemStack getIngot(final GT_Materials aMaterial, final OrePrefixes aPrefix) {
return aMaterial == null ? null : GregtechOreDictUnificator.getIngot(aMaterial, aPrefix.mMaterialAmount);
}
public static ItemStack getIngotOrDust(final GregtechMaterialStack aMaterial) {
ItemStack rStack = GregtechOreDictUnificator.getIngot(aMaterial);
if (aMaterial != null && aMaterial.mMaterial != null) {
rStack = GregtechOreDictUnificator.getDust(aMaterial);
}
if (rStack == null) {
rStack = GregtechOreDictUnificator.getDust(aMaterial);
}
return rStack;
}
public static ItemStack getIngotOrDust(final GT_Materials aMaterial, final long aMaterialAmount) {
if (aMaterialAmount <= 0) {
return null;
}
ItemStack rStack = GregtechOreDictUnificator.getIngot(aMaterial, aMaterialAmount);
if (rStack == null) {
rStack = GregtechOreDictUnificator.getDust(aMaterial, aMaterialAmount);
}
return rStack;
}
public static GregtechItemData getItemData(final ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) {
return null;
}
GregtechItemData rData = GregtechOreDictUnificator.sItemStack2DataMap.get(new GT_ItemStack(aStack));
if (rData == null) {
rData = GregtechOreDictUnificator.sItemStack2DataMap
.get(new GT_ItemStack(GT_Utility.copyMetaData(GT_Values.W, aStack)));
}
return rData;
}
/**
* @return a Copy of the OreDictionary.getOres() List
*/
public static ArrayList getOres(final Object aOreName) {
final String aName = aOreName == null ? GT_Values.E : aOreName.toString();
final ArrayList rList = new ArrayList();
if (GT_Utility.isStringValid(aName)) {
rList.addAll(OreDictionary.getOres(aName));
}
return rList;
}
/**
* @return a Copy of the OreDictionary.getOres() List
*/
public static ArrayList getOres(final OrePrefixes aPrefix, final Object aMaterial) {
return GregtechOreDictUnificator.getOres(aPrefix.get(aMaterial));
}
public static ItemStack[] getStackArray(final boolean aUseBlackList, final Object... aStacks) {
final ItemStack[] rStacks = new ItemStack[aStacks.length];
for (int i = 0; i < aStacks.length; i++) {
rStacks[i] = GregtechOreDictUnificator.get(aUseBlackList, GT_Utility.copy(aStacks[i]));
}
return rStacks;
}
public static boolean isAddingOres() {
return GregtechOreDictUnificator.isAddingOre > 0;
}
public static boolean isBlacklisted(final ItemStack aStack) {
return GT_Utility.isStackInList(aStack, GregtechOreDictUnificator.sNoUnificationList);
}
public static boolean isItemStackDye(final ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) {
return false;
}
for (final Dyes tDye : Dyes.VALUES) {
if (GregtechOreDictUnificator.isItemStackInstanceOf(aStack, tDye.toString())) {
return true;
}
}
return false;
}
public static boolean isItemStackInstanceOf(final ItemStack aStack, final Object aName) {
if (GT_Utility.isStringInvalid(aName) || GT_Utility.isStackInvalid(aStack)) {
return false;
}
for (final ItemStack tOreStack : GregtechOreDictUnificator.getOres(aName.toString())) {
if (GT_Utility.areStacksEqual(tOreStack, aStack, true)) {
return true;
}
}
return false;
}
public static boolean isRegisteringOres() {
return GregtechOreDictUnificator.isRegisteringOre > 0;
}
public static boolean registerOre(final GregtechOrePrefixes aPrefix, final Object aMaterial,
final ItemStack aStack) {
return GregtechOreDictUnificator.registerOre(aPrefix.get(aMaterial), aStack);
}
public static boolean registerOre(final Object aName, final ItemStack aStack) {
if (aName == null || GT_Utility.isStackInvalid(aStack)) {
return false;
}
final String tName = aName.toString();
if (GT_Utility.isStringInvalid(tName)) {
return false;
}
final ArrayList tList = GregtechOreDictUnificator.getOres(tName);
for (int i = 0; i < tList.size(); i++) {
if (GT_Utility.areStacksEqual(tList.get(i), aStack, true)) {
return false;
}
}
GregtechOreDictUnificator.isRegisteringOre++;
OreDictionary.registerOre(tName, GT_Utility.copyAmount(1, aStack));
GregtechOreDictUnificator.isRegisteringOre--;
return true;
}
public static void registerRecipes(final OreDictEventContainer tOre) {
// TODO Auto-generated method stub
}
public static void resetUnificationEntries() {
for (final GregtechItemData tPrefixMaterial : GregtechOreDictUnificator.sItemStack2DataMap.values()) {
tPrefixMaterial.mUnificationTarget = null;
}
}
public static void set(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, final ItemStack aStack) {
GregtechOreDictUnificator.set(aPrefix, aMaterial, aStack, true, false);
}
public static void set(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, ItemStack aStack,
final boolean aOverwrite, final boolean aAlreadyRegistered) {
if (aMaterial == null || aPrefix == null || GT_Utility.isStackInvalid(aStack)
|| Items.feather.getDamage(aStack) == GT_Values.W) {
return;
}
GregtechOreDictUnificator.isAddingOre++;
aStack = GT_Utility.copyAmount(1, aStack);
if (!aAlreadyRegistered) {
GregtechOreDictUnificator.registerOre(aPrefix.get(aMaterial), aStack);
}
GregtechOreDictUnificator.addAssociation(aPrefix, aMaterial, aStack,
GregtechOreDictUnificator.isBlacklisted(aStack));
if (aOverwrite || GT_Utility
.isStackInvalid(GregtechOreDictUnificator.sName2StackMap.get(aPrefix.get(aMaterial).toString()))) {
GregtechOreDictUnificator.sName2StackMap.put(aPrefix.get(aMaterial).toString(), aStack);
}
GregtechOreDictUnificator.isAddingOre--;
}
public static void setItemData(ItemStack aStack, final GregtechItemData aData) {
if (GT_Utility.isStackInvalid(aStack) || aData == null) {
return;
}
final GregtechItemData tData = GregtechOreDictUnificator.getItemData(aStack);
if (tData == null || !tData.hasValidPrefixMaterialData()) {
if (tData != null) {
for (final Object tObject : tData.mExtraData) {
if (!aData.mExtraData.contains(tObject)) {
aData.mExtraData.add(tObject);
}
}
}
if (aStack.stackSize > 1) {
if (aData.mMaterial != null) {
aData.mMaterial.mAmount /= aStack.stackSize;
}
for (final GregtechMaterialStack tMaterial : aData.mByProducts) {
tMaterial.mAmount /= aStack.stackSize;
}
aStack = GT_Utility.copyAmount(1, aStack);
}
GregtechOreDictUnificator.sItemStack2DataMap.put(new GT_ItemStack(aStack), aData);
if (aData.hasValidMaterialData()) {
long tValidMaterialAmount = aData.mMaterial.mMaterial.contains(SubTag.NO_RECYCLING) ? 0
: aData.mMaterial.mAmount >= 0 ? aData.mMaterial.mAmount : GT_Values.M;
for (final GregtechMaterialStack tMaterial : aData.mByProducts) {
tValidMaterialAmount += tMaterial.mMaterial.contains(SubTag.NO_RECYCLING) ? 0
: tMaterial.mAmount >= 0 ? tMaterial.mAmount : GT_Values.M;
}
if (tValidMaterialAmount < GT_Values.M) {
GT_ModHandler.addToRecyclerBlackList(aStack);
}
}
if (GregtechOreDictUnificator.mRunThroughTheList) {
if (GregTech_API.sLoadStarted) {
GregtechOreDictUnificator.mRunThroughTheList = false;
for (final Entry tEntry : GregtechOreDictUnificator.sItemStack2DataMap
.entrySet()) {
if (!tEntry.getValue().hasValidPrefixData()
|| tEntry.getValue().mPrefix.mAllowNormalRecycling) {
GregtechRecipeRegistrator.registerMaterialRecycling(tEntry.getKey().toStack(),
tEntry.getValue());
}
}
}
}
else {
if (!aData.hasValidPrefixData() || aData.mPrefix.mAllowNormalRecycling) {
GregtechRecipeRegistrator.registerMaterialRecycling(aStack, aData);
}
}
}
else {
for (final Object tObject : aData.mExtraData) {
if (!tData.mExtraData.contains(tObject)) {
tData.mExtraData.add(tObject);
}
}
}
}
public static ItemStack setStack(final boolean aUseBlackList, final ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) {
return aStack;
}
final ItemStack tStack = GregtechOreDictUnificator.get(aUseBlackList, aStack);
if (GT_Utility.areStacksEqual(aStack, tStack)) {
return aStack;
}
aStack.func_150996_a(tStack.getItem());
Items.feather.setDamage(aStack, Items.feather.getDamage(tStack));
return aStack;
}
public static ItemStack setStack(final ItemStack aStack) {
return GregtechOreDictUnificator.setStack(true, aStack);
}
public static ItemStack[] setStackArray(final boolean aUseBlackList, final ItemStack... aStacks) {
for (int i = 0; i < aStacks.length; i++) {
aStacks[i] = GregtechOreDictUnificator.get(aUseBlackList, GT_Utility.copy(aStacks[i]));
}
return aStacks;
}
}