diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d5d15313..0a3f6959f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Refined Storage Changelog ### 1.6 +NOTE: Worlds that used Refined Storage 1.5.x are fully compatible with Refined Storage 1.6.x and are getting converted upon loading the world. It is however not possible to revert back to Refined Storage 1.5.x when a world has already been converted to Refined Storage 1.6.x. + - Removed Regulator mode in the Exporter (raoulvdberge) - Removed MCMultiPart integration (raoulvdberge) - Removed Project E integration (raoulvdberge) 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 cda1b2c55..6d52dc18c 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 @@ -77,9 +77,7 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, @Override public void addFluidStorages(List> storages) { - if (storage != null) { - storages.add(storage); - } + storages.add(storage); } @Override @@ -91,9 +89,7 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - if (storageId != null) { - tag.setUniqueId(NBT_ID, storageId); - } + tag.setUniqueId(NBT_ID, storageId); return tag; } @@ -107,6 +103,8 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, loadStorage(); } + + OneSixMigrationHelper.migrateFluidStorageBlock(this, tag); } public void loadStorage() { @@ -173,7 +171,7 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, } accessType = AccessTypeUtils.readAccessType(tag); - + OneSixMigrationHelper.migrateEmptyWhitelistToEmptyBlacklist(version, this, null, filters); } 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 0c840a8bd..b7cc39d9d 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 @@ -72,9 +72,7 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto @Override public void addItemStorages(List> storages) { - if (storage != null) { - storages.add(storage); - } + storages.add(storage); } @Override @@ -91,9 +89,7 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - if (storageId != null) { - tag.setUniqueId(NBT_ID, storageId); - } + tag.setUniqueId(NBT_ID, storageId); return tag; } @@ -107,6 +103,8 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto loadStorage(); } + + OneSixMigrationHelper.migrateItemStorageBlock(this, tag); } public void loadStorage() { 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 61ad824fa..c5f602c99 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java @@ -5,6 +5,10 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider; import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.api.util.IOneSixMigrationHelper; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.storage.NetworkNodeFluidStorage; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.storage.NetworkNodeStorage; +import com.raoulvdberge.refinedstorage.block.FluidStorageType; +import com.raoulvdberge.refinedstorage.block.ItemStorageType; import com.raoulvdberge.refinedstorage.item.ItemPattern; import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import net.minecraft.item.Item; @@ -31,6 +35,57 @@ public class OneSixMigrationHelper implements IOneSixMigrationHelper { private static final String NBT_FLUIDS = "Fluids"; + private static UUID createItemDisk(World world, int capacity, NBTTagCompound legacyTag) { + UUID id = UUID.randomUUID(); + + IStorageDisk newDisk = API.instance().createDefaultItemDisk(world, capacity); + + NBTTagList list = (NBTTagList) legacyTag.getTag(NBT_ITEMS); + + for (int i = 0; i < list.tagCount(); ++i) { + NBTTagCompound tag = list.getCompoundTagAt(i); + + ItemStack stack = new ItemStack( + Item.getItemById(tag.getInteger(NBT_ITEM_TYPE)), + tag.getInteger(NBT_ITEM_QUANTITY), + tag.getInteger(NBT_ITEM_DAMAGE), + tag.hasKey(NBT_ITEM_CAPS) ? tag.getCompoundTag(NBT_ITEM_CAPS) : null + ); + + stack.setTagCompound(tag.hasKey(NBT_ITEM_NBT) ? tag.getCompoundTag(NBT_ITEM_NBT) : null); + + if (!stack.isEmpty()) { + newDisk.insert(stack, stack.getCount(), false); + } + } + + API.instance().getStorageDiskManager(world).set(id, newDisk); + API.instance().getStorageDiskManager(world).markForSaving(); + + return id; + } + + private static UUID createFluidDisk(World world, int capacity, NBTTagCompound legacyTag) { + UUID id = UUID.randomUUID(); + + IStorageDisk newDisk = API.instance().createDefaultFluidDisk(world, capacity); + + NBTTagList list = (NBTTagList) legacyTag.getTag(NBT_FLUIDS); + + for (int i = 0; i < list.tagCount(); ++i) { + FluidStack stack = FluidStack.loadFluidStackFromNBT(list.getCompoundTagAt(i)); + + if (stack != null) { + newDisk.insert(stack, stack.amount, false); + } + } + + API.instance().getStorageDiskManager(world).set(id, newDisk); + API.instance().getStorageDiskManager(world).markForSaving(); + + return id; + } + @Override public boolean migrateDisk(World world, ItemStack disk) { IStorageDiskProvider provider = (IStorageDiskProvider) disk.getItem(); @@ -38,33 +93,7 @@ public class OneSixMigrationHelper implements IOneSixMigrationHelper { switch (provider.getType()) { case ITEM: if (disk.hasTagCompound() && disk.getTagCompound().hasKey(NBT_ITEMS)) { - UUID id = UUID.randomUUID(); - - IStorageDisk newDisk = API.instance().createDefaultItemDisk(world, provider.getCapacity(disk)); - - NBTTagList list = (NBTTagList) disk.getTagCompound().getTag(NBT_ITEMS); - - for (int i = 0; i < list.tagCount(); ++i) { - NBTTagCompound tag = list.getCompoundTagAt(i); - - ItemStack stack = new ItemStack( - Item.getItemById(tag.getInteger(NBT_ITEM_TYPE)), - tag.getInteger(NBT_ITEM_QUANTITY), - tag.getInteger(NBT_ITEM_DAMAGE), - tag.hasKey(NBT_ITEM_CAPS) ? tag.getCompoundTag(NBT_ITEM_CAPS) : null - ); - - stack.setTagCompound(tag.hasKey(NBT_ITEM_NBT) ? tag.getCompoundTag(NBT_ITEM_NBT) : null); - - if (!stack.isEmpty()) { - newDisk.insert(stack, stack.getCount(), false); - } - } - - API.instance().getStorageDiskManager(world).set(id, newDisk); - API.instance().getStorageDiskManager(world).markForSaving(); - - provider.setId(disk, id); + provider.setId(disk, createItemDisk(world, provider.getCapacity(disk), disk.getTagCompound())); return true; } @@ -72,24 +101,7 @@ public class OneSixMigrationHelper implements IOneSixMigrationHelper { break; case FLUID: if (disk.hasTagCompound() && disk.getTagCompound().hasKey(NBT_FLUIDS)) { - UUID id = UUID.randomUUID(); - - IStorageDisk newDisk = API.instance().createDefaultFluidDisk(world, provider.getCapacity(disk)); - - NBTTagList list = (NBTTagList) disk.getTagCompound().getTag(NBT_FLUIDS); - - for (int i = 0; i < list.tagCount(); ++i) { - FluidStack stack = FluidStack.loadFluidStackFromNBT(list.getCompoundTagAt(i)); - - if (stack != null) { - newDisk.insert(stack, stack.amount, false); - } - } - - API.instance().getStorageDiskManager(world).set(id, newDisk); - API.instance().getStorageDiskManager(world).markForSaving(); - - provider.setId(disk, id); + provider.setId(disk, createFluidDisk(world, provider.getCapacity(disk), disk.getTagCompound())); return true; } @@ -197,4 +209,42 @@ public class OneSixMigrationHelper implements IOneSixMigrationHelper { filterable.setMode(IFilter.MODE_BLACKLIST); } } + + private static final String NBT_STORAGE = "Storage"; + + public static void migrateItemStorageBlock(NetworkNodeStorage storage, NBTTagCompound tag) { + if (tag.hasKey(NBT_STORAGE)) { + NBTTagCompound storageTag = tag.getCompoundTag(NBT_STORAGE); + + storage.setStorageId(createItemDisk(storage.getWorld(), storage.getType().getCapacity(), storageTag)); + storage.loadStorage(); + } + } + + public static void migrateItemStorageBlockItem(World world, ItemStack stack) { + if (stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_STORAGE)) { + NBTTagCompound storageTag = stack.getTagCompound().getCompoundTag(NBT_STORAGE); + + stack.setTagCompound(new NBTTagCompound()); + stack.getTagCompound().setUniqueId(NetworkNodeStorage.NBT_ID, createItemDisk(world, ItemStorageType.getById(stack.getItemDamage()).getCapacity(), storageTag)); + } + } + + public static void migrateFluidStorageBlock(NetworkNodeFluidStorage storage, NBTTagCompound tag) { + if (tag.hasKey(NBT_STORAGE)) { + NBTTagCompound storageTag = tag.getCompoundTag(NBT_STORAGE); + + storage.setStorageId(createFluidDisk(storage.getWorld(), storage.getType().getCapacity(), storageTag)); + storage.loadStorage(); + } + } + + public static void migrateFluidStorageBlockItem(World world, ItemStack stack) { + if (stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_STORAGE)) { + NBTTagCompound storageTag = stack.getTagCompound().getCompoundTag(NBT_STORAGE); + + stack.setTagCompound(new NBTTagCompound()); + stack.getTagCompound().setUniqueId(NetworkNodeStorage.NBT_ID, createFluidDisk(world, FluidStorageType.getById(stack.getItemDamage()).getCapacity(), storageTag)); + } + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java index ecb27b694..83a198ead 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java @@ -99,6 +99,7 @@ public class BlockCable extends BlockNode { return getActualState(stateForRendering, world, pos); } + // TODO: investigate connection issue public static boolean hasConnectionWith(IBlockAccess world, BlockPos pos, BlockBase block, TileEntity tile, EnumFacing direction) { if (!(tile instanceof TileNode)) { return false; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemBlockFluidStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemBlockFluidStorage.java index a8e6a502a..2ecedd072 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemBlockFluidStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemBlockFluidStorage.java @@ -6,8 +6,10 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskSyncData; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.node.storage.NetworkNodeFluidStorage; +import com.raoulvdberge.refinedstorage.apiimpl.util.OneSixMigrationHelper; 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.inventory.InventoryHelper; import net.minecraft.item.ItemStack; @@ -100,4 +102,13 @@ public class ItemBlockFluidStorage extends ItemBlockBase { private boolean isValid(ItemStack disk) { return disk.hasTagCompound() && disk.getTagCompound().hasUniqueId(NetworkNodeFluidStorage.NBT_ID); } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { + super.onUpdate(stack, world, entity, itemSlot, isSelected); + + if (!world.isRemote) { + OneSixMigrationHelper.migrateFluidStorageBlockItem(world, stack); + } + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemBlockStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemBlockStorage.java index 28deb57f9..7c7a66c82 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemBlockStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemBlockStorage.java @@ -6,8 +6,10 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskSyncData; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.node.storage.NetworkNodeStorage; +import com.raoulvdberge.refinedstorage.apiimpl.util.OneSixMigrationHelper; 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.inventory.InventoryHelper; import net.minecraft.item.ItemStack; @@ -100,4 +102,13 @@ public class ItemBlockStorage extends ItemBlockBase { private boolean isValid(ItemStack disk) { return disk.hasTagCompound() && disk.getTagCompound().hasUniqueId(NetworkNodeStorage.NBT_ID); } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { + super.onUpdate(stack, world, entity, itemSlot, isSelected); + + if (!world.isRemote) { + OneSixMigrationHelper.migrateItemStorageBlockItem(world, stack); + } + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java index a162d3d8a..9da823de5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java @@ -279,7 +279,7 @@ public class ProxyClient extends ProxyCommon { ModelLoader.setCustomStateMapper(RSBlocks.PORTABLE_GRID, new StateMap.Builder().ignore(BlockPortableGrid.TYPE).build()); ModelLoader.setCustomMeshDefinition(Item.getItemFromBlock(RSBlocks.PORTABLE_GRID), stack -> { - PortableGrid portableGrid = new PortableGrid(null, stack); + PortableGrid portableGrid = new PortableGrid(null, stack); // TODO: pass fullness? return new ModelResourceLocation("refinedstorage:portable_grid", "connected=" + Boolean.toString(portableGrid.getEnergy() != 0 && !portableGrid.getDisk().getStackInSlot(0).isEmpty()) + ",direction=north,disk_state=" + TilePortableGrid.getDiskState(portableGrid)); }); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java index 0da79b31d..fe5fed4cc 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java @@ -8,13 +8,11 @@ import com.raoulvdberge.refinedstorage.apiimpl.API; import io.netty.buffer.ByteBuf; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Items; -import net.minecraft.init.PotionTypes; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.potion.PotionUtils; import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; @@ -38,8 +36,6 @@ import java.util.function.Function; public final class StackUtils { public static final ItemStack EMPTY_BUCKET = new ItemStack(Items.BUCKET); - public static final ItemStack EMPTY_BOTTLE = new ItemStack(Items.GLASS_BOTTLE); - public static final ItemStack WATER_BOTTLE = PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER); private static final String NBT_INVENTORY = "Inventory_%d"; private static final String NBT_SLOT = "Slot";