diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index 0a9741114..cb71fd80f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory; +import com.raoulvdberge.refinedstorage.apiimpl.util.OneSixMigrationHelper; import com.raoulvdberge.refinedstorage.item.ItemPattern; import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.entity.player.EntityPlayer; @@ -31,6 +32,12 @@ public class CraftingPattern implements ICraftingPattern { private NonNullList byproducts = NonNullList.create(); public CraftingPattern(World world, ICraftingPatternContainer container, ItemStack stack) { + if (!OneSixMigrationHelper.isValidOneSixPattern(stack)) { + this.valid = false; + + return; + } + this.container = container; this.stack = stack; this.processing = ItemPattern.isProcessing(stack); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafter.java index a6a522a4a..874854605 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafter.java @@ -7,6 +7,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternProvider import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.apiimpl.util.OneSixMigrationHelper; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerUpgrade; @@ -132,6 +133,11 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC super.read(tag); StackUtils.readItems(patterns, 0, tag); + + if (OneSixMigrationHelper.migratePatternInventory(patterns)) { + markDirty(); + } + StackUtils.readItems(upgrades, 1, tag); if (tag.hasKey(NBT_DISPLAY_NAME)) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/storage/NetworkNodeFluidStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/storage/NetworkNodeFluidStorage.java index 303cd6277..0ae4df931 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/storage/NetworkNodeFluidStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/storage/NetworkNodeFluidStorage.java @@ -76,7 +76,8 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, @Override public void addFluidStorages(List> storages) { - storages.add(storage); + if (storage != null) + storages.add(storage); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/storage/NetworkNodeStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/storage/NetworkNodeStorage.java index 199c7c22d..f4c358df4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/storage/NetworkNodeStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/storage/NetworkNodeStorage.java @@ -71,7 +71,7 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto @Override public void addItemStorages(List> storages) { - storages.add(storage); + if (storage != null) storages.add(storage); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java index 90e10cdc0..c46a93aa7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java @@ -4,12 +4,15 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider; import com.raoulvdberge.refinedstorage.api.util.IOneSixMigrationHelper; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.item.ItemPattern; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import java.util.UUID; @@ -112,4 +115,71 @@ public class OneSixMigrationHelper implements IOneSixMigrationHelper { return migrated; } + + private static final String NBT_OUTPUTS = "Outputs"; + private static final String NBT_SLOT = "Slot_%d"; + + public static boolean migratePattern(ItemStack pattern) { + NBTTagCompound tag = pattern.getTagCompound(); + + if (pattern.hasTagCompound() && !tag.hasKey(ItemPattern.NBT_PROCESSING)) { + boolean isProcessing = tag.hasKey(NBT_OUTPUTS); + + // Add "processing" tag + tag.setBoolean(ItemPattern.NBT_PROCESSING, isProcessing); + + // Convert "slot_%d" to "input_%d" + for (int i = 0; i < 9; ++i) { + String id = String.format(NBT_SLOT, i); + + if (tag.hasKey(id)) { + ItemStack slot = new ItemStack(pattern.getTagCompound().getCompoundTag(id)); + + if (!slot.isEmpty()) { + tag.setTag(String.format(ItemPattern.NBT_INPUT_SLOT, i), slot.serializeNBT()); + } + + tag.removeTag(id); + } + } + + // Convert "outputs" to "output_%d" + if (isProcessing) { + NBTTagList list = tag.getTagList(NBT_OUTPUTS, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < list.tagCount(); ++i) { + ItemStack output = new ItemStack(list.getCompoundTagAt(i)); + + if (!output.isEmpty()) { + tag.setTag(String.format(ItemPattern.NBT_OUTPUT_SLOT, i), output.serializeNBT()); + } + } + + tag.removeTag(NBT_OUTPUTS); + } + + return true; + } + + return false; + } + + public static boolean migratePatternInventory(IItemHandler handler) { + boolean migrated = false; + + for (int i = 0; i < handler.getSlots(); ++i) { + ItemStack pattern = handler.getStackInSlot(i); + + if (!pattern.isEmpty() && migratePattern(pattern)) { + migrated = true; + } + } + + return migrated; + } + + // We check on NBT_PROCESSING, so it needs to be there for sure to be a valid pattern. + public static boolean isValidOneSixPattern(ItemStack stack) { + return stack.hasTagCompound() && stack.getTagCompound().hasKey(ItemPattern.NBT_PROCESSING); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java index 66dfbb5a5..4eb67a39b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java @@ -5,10 +5,12 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternProvider; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.CraftingPattern; +import com.raoulvdberge.refinedstorage.apiimpl.util.OneSixMigrationHelper; import com.raoulvdberge.refinedstorage.util.RenderUtils; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -28,10 +30,10 @@ import java.util.stream.Collectors; public class ItemPattern extends ItemBase implements ICraftingPatternProvider { private static Map PATTERN_CACHE = new HashMap<>(); - private static final String NBT_INPUT_SLOT = "Input_%d"; - private static final String NBT_OUTPUT_SLOT = "Output_%d"; + public static final String NBT_INPUT_SLOT = "Input_%d"; + public static final String NBT_OUTPUT_SLOT = "Output_%d"; private static final String NBT_OREDICT = "Oredict"; - private static final String NBT_PROCESSING = "Processing"; + public static final String NBT_PROCESSING = "Processing"; public ItemPattern() { super("pattern"); @@ -164,4 +166,13 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider { public ICraftingPattern create(World world, ItemStack stack, ICraftingPatternContainer container) { return new CraftingPattern(world, container, stack); } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isSelected) { + super.onUpdate(stack, world, entity, slot, isSelected); + + if (!world.isRemote) { + OneSixMigrationHelper.migratePattern(stack); + } + } }