package gtPlusPlus.xmod.gregtech.api.util;
import static gregtech.api.enums.GT_Values.*;
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(sItemStack2DataMap);
}
/**
* 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, sNoUnificationList)) {
sNoUnificationList.add(aStack);
}
}
public static boolean isBlacklisted(final ItemStack aStack) {
return GT_Utility.isStackInList(aStack, sNoUnificationList);
}
public static void add(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, final ItemStack aStack) {
set(aPrefix, aMaterial, aStack, false, false);
}
public static void set(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, final ItemStack aStack) {
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) == W)) {
return;
}
isAddingOre++;
aStack = GT_Utility.copyAmount(1, aStack);
if (!aAlreadyRegistered) {
registerOre(aPrefix.get(aMaterial), aStack);
}
addAssociation(aPrefix, aMaterial, aStack, isBlacklisted(aStack));
if (aOverwrite || GT_Utility.isStackInvalid(sName2StackMap.get(aPrefix.get(aMaterial).toString()))) {
sName2StackMap.put(aPrefix.get(aMaterial).toString(), aStack);
}
isAddingOre--;
}
public static ItemStack getFirstOre(final Object aName, final long aAmount) {
if (GT_Utility.isStringInvalid(aName)) {
return null;
}
final ItemStack tStack = sName2StackMap.get(aName.toString());
if (GT_Utility.isStackValid(tStack)) {
return GT_Utility.copyAmount(aAmount, tStack);
}
return GT_Utility.copyAmount(aAmount, getOres(aName).toArray());
}
public static ItemStack get(final Object aName, final long aAmount) {
return get(aName, null, aAmount, true, true);
}
public static ItemStack get(final Object aName, final ItemStack aReplacement, final long aAmount) {
return get(aName, aReplacement, aAmount, true, true);
}
public static ItemStack get(final GregtechOrePrefixes aPrefix, final Object aMaterial, final long aAmount) {
return get(aPrefix, aMaterial, null, aAmount);
}
public static ItemStack get(final GregtechOrePrefixes aPrefix, final Object aMaterial, final ItemStack aReplacement, final long aAmount) {
return get(aPrefix.get(aMaterial), aReplacement, aAmount, false, 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 (!sName2StackMap.containsKey(aName.toString()) && aMentionPossibleTypos) {
GT_Log.err.println("Unknown Key for Unification, Typo? " + aName);
}
return GT_Utility.copyAmount(aAmount, sName2StackMap.get(aName.toString()), getFirstOre(aName, aAmount), aReplacement);
}
public static ItemStack[] setStackArray(final boolean aUseBlackList, final ItemStack... aStacks) {
for (int i = 0; i < aStacks.length; i++) {
aStacks[i] = get(aUseBlackList, GT_Utility.copy(aStacks[i]));
}
return aStacks;
}
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] = get(aUseBlackList, GT_Utility.copy(aStacks[i]));
}
return rStacks;
}
public static ItemStack setStack(final ItemStack aStack) {
return setStack(true, aStack);
}
public static ItemStack setStack(final boolean aUseBlackList, final ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) {
return aStack;
}
final ItemStack tStack = 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 get(final ItemStack aStack) {
return get(true, aStack);
}
public static ItemStack get(final boolean aUseBlackList, final ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) {
return null;
}
final GregtechItemData tPrefixMaterial = getAssociation(aStack);
ItemStack rStack = null;
if ((tPrefixMaterial == null) || !tPrefixMaterial.hasValidPrefixMaterialData() || (aUseBlackList && tPrefixMaterial.mBlackListed)) {
return GT_Utility.copy(aStack);
}
if (aUseBlackList && !GregTech_API.sUnificationEntriesRegistered && isBlacklisted(aStack)) {
tPrefixMaterial.mBlackListed = true;
return GT_Utility.copy(aStack);
}
if (tPrefixMaterial.mUnificationTarget == null) {
tPrefixMaterial.mUnificationTarget = 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 void addItemData(final ItemStack aStack, final GregtechItemData aData) {
if (GT_Utility.isStackValid(aStack) && (getItemData(aStack) == null) && (aData != null)) {
setItemData(aStack, aData);
}
}
public static void setItemData(ItemStack aStack, final GregtechItemData aData) {
if (GT_Utility.isStackInvalid(aStack) || (aData == null)) {
return;
}
final GregtechItemData tData = 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);
}
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 : M;
for (final GregtechMaterialStack tMaterial : aData.mByProducts) {
tValidMaterialAmount += tMaterial.mMaterial.contains(SubTag.NO_RECYCLING) ? 0 : tMaterial.mAmount >= 0 ? tMaterial.mAmount : M;
}
if (tValidMaterialAmount < M) {
GT_ModHandler.addToRecyclerBlackList(aStack);
}
}
if (mRunThroughTheList) {
if (GregTech_API.sLoadStarted) {
mRunThroughTheList = false;
for (final Entry tEntry : 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 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) == W) {
for (byte i = 0; i < 16; i++) {
setItemData(GT_Utility.copyAmountAndMetaData(1, i, aStack), new GregtechItemData(aPrefix, aMaterial, aBlackListed));
}
}
setItemData(aStack, new GregtechItemData(aPrefix, aMaterial, aBlackListed));
}
public static GregtechItemData getItemData(final ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) {
return null;
}
GregtechItemData rData = sItemStack2DataMap.get(new GT_ItemStack(aStack));
if (rData == null) {
rData = sItemStack2DataMap.get(new GT_ItemStack(GT_Utility.copyMetaData(W, aStack)));
}
return rData;
}
public static GregtechItemData getAssociation(final ItemStack aStack) {
final GregtechItemData rData = getItemData(aStack);
return (rData != null) && rData.hasValidPrefixMaterialData() ? rData : null;
}
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 : getOres(aName.toString())) {
if (GT_Utility.areStacksEqual(tOreStack, aStack, true)) {
return true;
}
}
return false;
}
public static boolean isItemStackDye(final ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) {
return false;
}
for (final Dyes tDye : Dyes.VALUES) {
if (isItemStackInstanceOf(aStack, tDye.toString())) {
return true;
}
}
return false;
}
public static boolean registerOre(final GregtechOrePrefixes aPrefix, final Object aMaterial, final ItemStack aStack) {
return 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 = getOres(tName);
for (int i = 0; i < tList.size(); i++) {
if (GT_Utility.areStacksEqual(tList.get(i), aStack, true)) {
return false;
}
}
isRegisteringOre++;
OreDictionary.registerOre(tName, GT_Utility.copyAmount(1, aStack));
isRegisteringOre--;
return true;
}
public static boolean isRegisteringOres() {
return isRegisteringOre > 0;
}
public static boolean isAddingOres() {
return isAddingOre > 0;
}
public static void resetUnificationEntries() {
for (final GregtechItemData tPrefixMaterial : sItemStack2DataMap.values()) {
tPrefixMaterial.mUnificationTarget = null;
}
}
public static ItemStack getGem(final GregtechMaterialStack aMaterial) {
return aMaterial == null ? null : getGem(aMaterial.mMaterial, aMaterial.mAmount);
}
public static ItemStack getGem(final GT_Materials aMaterial, final OrePrefixes aPrefix) {
return aMaterial == null ? null : getGem(aMaterial, aPrefix.mMaterialAmount);
}
public static ItemStack getGem(final GT_Materials aMaterial, final long aMaterialAmount) {
ItemStack rStack = null;
if (((aMaterialAmount >= M) || (aMaterialAmount >= (M * 32)))) {
rStack = get(GregtechOrePrefixes.gem, aMaterial, aMaterialAmount / M);
}
if ((rStack == null) && ((((aMaterialAmount * 2) % M) == 0) || (aMaterialAmount >= (M * 16)))) {
rStack = get(GregtechOrePrefixes.gemFlawed, aMaterial, (aMaterialAmount * 2) / M);
}
if ((rStack == null) && (((aMaterialAmount * 4) >= M))) {
rStack = get(GregtechOrePrefixes.gemChipped, aMaterial, (aMaterialAmount * 4) / M);
}
return rStack;
}
public static ItemStack getDust(final GregtechMaterialStack aMaterial) {
return aMaterial == null ? null : getDust(aMaterial.mMaterial, aMaterial.mAmount);
}
public static ItemStack getDust(final GT_Materials aMaterial, final OrePrefixes aPrefix) {
return aMaterial == null ? null : getDust(aMaterial, aPrefix.mMaterialAmount);
}
public static ItemStack getDust(final GT_Materials aMaterial, final long aMaterialAmount) {
if (aMaterialAmount <= 0) {
return null;
}
ItemStack rStack = null;
if ((((aMaterialAmount % M) == 0) || (aMaterialAmount >= (M * 16)))) {
rStack = get(GregtechOrePrefixes.dust, aMaterial, aMaterialAmount / M);
}
if ((rStack == null) && ((((aMaterialAmount * 4) % M) == 0) || (aMaterialAmount >= (M * 8)))) {
rStack = get(GregtechOrePrefixes.dustSmall, aMaterial, (aMaterialAmount * 4) / M);
}
if ((rStack == null) && (((aMaterialAmount * 9) >= M))) {
rStack = get(GregtechOrePrefixes.dustTiny, aMaterial, (aMaterialAmount * 9) / M);
}
return rStack;
}
public static ItemStack getIngot(final GregtechMaterialStack aMaterial) {
return aMaterial == null ? null : getIngot(aMaterial.mMaterial, aMaterial.mAmount);
}
public static ItemStack getIngot(final GT_Materials aMaterial, final OrePrefixes aPrefix) {
return aMaterial == null ? null : getIngot(aMaterial, aPrefix.mMaterialAmount);
}
public static ItemStack getIngot(final GT_Materials aMaterial, final long aMaterialAmount) {
if (aMaterialAmount <= 0) {
return null;
}
ItemStack rStack = null;
if (((((aMaterialAmount % (M * 9)) == 0) && ((aMaterialAmount / (M * 9)) > 1)) || (aMaterialAmount >= (M * 72)))) {
rStack = get(GregtechOrePrefixes.block, aMaterial, aMaterialAmount / (M * 9));
}
if ((rStack == null) && (((aMaterialAmount % M) == 0) || (aMaterialAmount >= (M * 8)))) {
rStack = get(GregtechOrePrefixes.ingot, aMaterial, aMaterialAmount / M);
}
if ((rStack == null) && (((aMaterialAmount * 9) >= M))) {
rStack = get(GregtechOrePrefixes.nugget, aMaterial, (aMaterialAmount * 9) / M);
}
return rStack;
}
public static ItemStack getIngotOrDust(final GT_Materials aMaterial, final long aMaterialAmount) {
if (aMaterialAmount <= 0) {
return null;
}
ItemStack rStack = getIngot(aMaterial, aMaterialAmount);
if (rStack == null) {
rStack = getDust(aMaterial, aMaterialAmount);
}
return rStack;
}
public static ItemStack getIngotOrDust(final GregtechMaterialStack aMaterial) {
ItemStack rStack = getIngot(aMaterial);
if((aMaterial!=null)&&(aMaterial.mMaterial!=null)) {
rStack = getDust(aMaterial);
}
if (rStack == null) {
rStack = getDust(aMaterial);
}
return rStack;
}
public static ItemStack getDustOrIngot(final GT_Materials aMaterial, final long aMaterialAmount) {
if (aMaterialAmount <= 0) {
return null;
}
ItemStack rStack = getDust(aMaterial, aMaterialAmount);
if (rStack == null) {
rStack = getIngot(aMaterial, aMaterialAmount);
}
return rStack;
}
public static ItemStack getDustOrIngot(final GregtechMaterialStack aMaterial) {
ItemStack rStack = getDust(aMaterial);
if (rStack == null) {
rStack = getIngot(aMaterial);
}
return rStack;
}
/**
* @return a Copy of the OreDictionary.getOres() List
*/
public static ArrayList getOres(final OrePrefixes aPrefix, final Object aMaterial) {
return getOres(aPrefix.get(aMaterial));
}
/**
* @return a Copy of the OreDictionary.getOres() List
*/
public static ArrayList getOres(final Object aOreName) {
final String aName = aOreName == null ? E : aOreName.toString();
final ArrayList rList = new ArrayList<>();
if (GT_Utility.isStringValid(aName)) {
rList.addAll(OreDictionary.getOres(aName));
}
return rList;
}
public static void registerRecipes(final OreDictEventContainer tOre) {
// TODO Auto-generated method stub
}
}