diff options
Diffstat (limited to 'src/main/java/gregtech')
-rw-r--r-- | src/main/java/gregtech/api/util/GTModHandler.java | 14 | ||||
-rw-r--r-- | src/main/java/gregtech/api/util/GTShapelessRecipe.java | 29 |
2 files changed, 38 insertions, 5 deletions
diff --git a/src/main/java/gregtech/api/util/GTModHandler.java b/src/main/java/gregtech/api/util/GTModHandler.java index af7ddb82ea..009cde6476 100644 --- a/src/main/java/gregtech/api/util/GTModHandler.java +++ b/src/main/java/gregtech/api/util/GTModHandler.java @@ -1288,6 +1288,7 @@ public class GTModHandler { false, false, false, + false, aRecipe); } @@ -1313,6 +1314,7 @@ public class GTModHandler { (aBitMask & RecipeBits.KEEPNBT) != 0, (aBitMask & RecipeBits.DISMANTLEABLE) != 0, (aBitMask & RecipeBits.NOT_REMOVABLE) == 0, + (aBitMask & RecipeBits.OVERWRITE_NBT) != 0, aRecipe); } @@ -1321,7 +1323,7 @@ public class GTModHandler { */ private static boolean addShapelessCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded, int[] aEnchantmentLevelsAdded, boolean aBuffered, boolean aKeepNBT, boolean aDismantleable, boolean aRemovable, - Object[] aRecipe) { + boolean overwriteNBT, Object[] aRecipe) { aResult = GTOreDictUnificator.get(true, aResult); if (aRecipe == null || aRecipe.length == 0) return false; for (byte i = 0; i < aRecipe.length; i++) { @@ -1366,18 +1368,18 @@ public class GTModHandler { if (sBufferCraftingRecipes && aBuffered) sBufferRecipeList.add( new GTShapelessRecipe( GTUtility.copyOrNull(aResult), - aDismantleable, aRemovable, aKeepNBT, + overwriteNBT, aEnchantmentsAdded, aEnchantmentLevelsAdded, aRecipe)); else GameRegistry.addRecipe( new GTShapelessRecipe( GTUtility.copyOrNull(aResult), - aDismantleable, aRemovable, aKeepNBT, + overwriteNBT, aEnchantmentsAdded, aEnchantmentLevelsAdded, aRecipe)); @@ -2338,6 +2340,7 @@ public class GTModHandler { public static long BUFFERED = B[1]; /** * This is a special Tag I used for crafting Coins up and down. + * If all the input items have the same NBT, keep it in the output item. */ public static long KEEPNBT = B[2]; /** @@ -2385,5 +2388,10 @@ public class GTModHandler { * Don't remove shapeless recipes with this output */ public static long DONT_REMOVE_SHAPELESS = B[13]; + /** + * Keep input item's NBT if the input item is the same as output item, and try to overwrite input item's NBT + * tags with output item's NBT tags if exists + */ + public static long OVERWRITE_NBT = B[14]; } } diff --git a/src/main/java/gregtech/api/util/GTShapelessRecipe.java b/src/main/java/gregtech/api/util/GTShapelessRecipe.java index 20c1d361be..dbb8deb171 100644 --- a/src/main/java/gregtech/api/util/GTShapelessRecipe.java +++ b/src/main/java/gregtech/api/util/GTShapelessRecipe.java @@ -1,9 +1,13 @@ package gregtech.api.util; +import java.util.Map; +import java.util.Set; + import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.oredict.ShapelessOreRecipe; @@ -12,15 +16,16 @@ import gregtech.api.interfaces.internal.IGTCraftingRecipe; public class GTShapelessRecipe extends ShapelessOreRecipe implements IGTCraftingRecipe { - public final boolean mRemovableByGT, mKeepingNBT; + public final boolean mRemovableByGT, mKeepingNBT, overwriteNBT; private final Enchantment[] mEnchantmentsAdded; private final int[] mEnchantmentLevelsAdded; - public GTShapelessRecipe(ItemStack aResult, boolean aDismantleAble, boolean aRemovableByGT, boolean aKeepingNBT, + public GTShapelessRecipe(ItemStack aResult, boolean aRemovableByGT, boolean aKeepingNBT, boolean overwriteNBT, Enchantment[] aEnchantmentsAdded, int[] aEnchantmentLevelsAdded, Object... aRecipe) { super(aResult, aRecipe); mEnchantmentsAdded = aEnchantmentsAdded; mEnchantmentLevelsAdded = aEnchantmentLevelsAdded; + this.overwriteNBT = overwriteNBT; mRemovableByGT = aRemovableByGT; mKeepingNBT = aKeepingNBT; } @@ -66,6 +71,26 @@ public class GTShapelessRecipe extends ShapelessOreRecipe implements IGTCrafting } } + // Overwrite NBT + if (overwriteNBT) { + for (int i = 0; i < aGrid.getSizeInventory(); i++) { + ItemStack item = aGrid.getStackInSlot(i); + if (GTUtility.areStacksEqual(item, rStack, true) && item.hasTagCompound()) { + NBTTagCompound inputNBT = (NBTTagCompound) item.getTagCompound() + .copy(); + if (rStack.hasTagCompound()) { + @SuppressWarnings("unchecked") + Set<Map.Entry<String, NBTBase>> set = rStack.getTagCompound().tagMap.entrySet(); + for (Map.Entry<String, NBTBase> e : set) { + inputNBT.setTag(e.getKey(), e.getValue()); + } + } + rStack.setTagCompound(inputNBT); + break; + } + } + } + // Charge Values if (GTModHandler.isElectricItem(rStack)) { GTModHandler.dischargeElectricItem(rStack, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false, true); |