diff --git a/CHANGELOG.md b/CHANGELOG.md index e3f3b6bc0..752bdfd65 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Removed Project E integration (raoulvdberge) - Removed Storage Drawers integration (you can still attach an External Storage to drawers, though) (raoulvdberge) - Removed blocking mode in autocrafting (raoulvdberge) +- Added new storage disk system where the storage disk data (items, fluids) are stored off the disk itself, in another file (refinedstorage_disks.dat). The disk itself only stores its ID (raoulvdberge) - You can no longer put a Filter in filter slots to gain additional filter slots (raoulvdberge) - You can now re-insert Processing Patterns in the Pattern Grid and have the inputs and outputs be completed (raoulvdberge) - Fixed bug where pattern was recipe pattern was creatable when there was no recipe output (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java index ddae12253..6207e49fd 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java @@ -13,6 +13,7 @@ import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeRegistry; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandlerRegistry; import com.raoulvdberge.refinedstorage.api.solderer.ISoldererRegistry; +import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskManager; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskRegistry; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskSync; @@ -123,12 +124,39 @@ public interface IRSAPI { @Nonnull IWirelessGridRegistry getWirelessGridRegistry(); + /** + * @return the storage disk registry + */ + @Nonnull IStorageDiskRegistry getStorageDiskRegistry(); + /** + * @param world the world + * @return the storage disk manager + */ + @Nonnull IStorageDiskManager getStorageDiskManager(World world); + /** + * @return the storage disk sync manager + */ + @Nonnull IStorageDiskSync getStorageDiskSync(); + /** + * @param world the world + * @param capacity the capacity + * @return a storage disk + */ + IStorageDisk createDefaultItemDisk(World world, int capacity); + + /** + * @param world the world + * @param capacity the capacity in mB + * @return a fluid storage disk + */ + IStorageDisk createDefaultFluidDisk(World world, int capacity); + /** * Opens a wireless grid for the given player. * diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java index 1f72c282d..d1156c77a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java @@ -35,6 +35,13 @@ public interface IStorageDiskManager { */ void set(UUID id, IStorageDisk disk); + /** + * Removes a storage disk. + * + * @param id the id + */ + void remove(UUID id); + /** * Marks this manager for saving. */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java index 04a100290..8203b1f30 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java @@ -17,6 +17,7 @@ import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeRegistry; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandlerRegistry; import com.raoulvdberge.refinedstorage.api.solderer.ISoldererRegistry; +import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskManager; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskRegistry; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskSync; @@ -33,9 +34,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.network.grid.wireless.WirelessGri import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterChannel; import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRegistry; import com.raoulvdberge.refinedstorage.apiimpl.solderer.SoldererRegistry; -import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskManager; -import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskRegistry; -import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskSync; +import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.*; import com.raoulvdberge.refinedstorage.apiimpl.util.Comparer; import com.raoulvdberge.refinedstorage.apiimpl.util.QuantityFormatter; import com.raoulvdberge.refinedstorage.apiimpl.util.StackListFluid; @@ -195,11 +194,13 @@ public class API implements IRSAPI { return gridRegistry; } + @Nonnull @Override public IStorageDiskRegistry getStorageDiskRegistry() { return storageDiskRegistry; } + @Nonnull @Override public IStorageDiskManager getStorageDiskManager(World world) { if (world.isRemote) { @@ -220,11 +221,22 @@ public class API implements IRSAPI { return instance; } + @Nonnull @Override public IStorageDiskSync getStorageDiskSync() { return storageDiskSync; } + @Override + public IStorageDisk createDefaultItemDisk(World world, int capacity) { + return new StorageDiskItem(world, capacity); + } + + @Override + public IStorageDisk createDefaultFluidDisk(World world, int capacity) { + return new StorageDiskFluid(world, capacity); + } + @Override public void openWirelessGrid(EntityPlayer player, EnumHand hand, int networkDimension, int id) { player.openGui(RS.INSTANCE, RSGui.WIRELESS_GRID, player.getEntityWorld(), hand.ordinal(), networkDimension, id); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeManager.java index a278588b0..e9ccbce34 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeManager.java @@ -99,11 +99,23 @@ public class NetworkNodeManager extends WorldSavedData implements INetworkNodeMa @Override public void removeNode(BlockPos pos) { + if (pos == null) { + throw new IllegalArgumentException("Position cannot be null"); + } + nodes.remove(pos); } @Override public void setNode(BlockPos pos, INetworkNode node) { + if (pos == null) { + throw new IllegalArgumentException("Position cannot be null"); + } + + if (node == null) { + throw new IllegalArgumentException("Node cannot be null"); + } + nodes.put(pos, node); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java index eaf5f9a91..923e95361 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java @@ -58,6 +58,14 @@ public class StorageDiskManager extends WorldSavedData implements IStorageDiskMa @Override public void set(UUID id, IStorageDisk disk) { + if (id == null) { + throw new IllegalArgumentException("Id cannot be null"); + } + + if (disk == null) { + throw new IllegalArgumentException("Disk cannot be null"); + } + if (disks.containsKey(id)) { throw new IllegalArgumentException("Disks already contains id '" + id + "'"); } @@ -65,6 +73,15 @@ public class StorageDiskManager extends WorldSavedData implements IStorageDiskMa disks.put(id, disk); } + @Override + public void remove(UUID id) { + if (id == null) { + throw new IllegalArgumentException("Id cannot be null"); + } + + disks.remove(id); + } + @Override public void markForSaving() { markDirty(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFluidStorageDisk.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFluidStorageDisk.java index 4c4ae1ecc..e7209eef2 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFluidStorageDisk.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFluidStorageDisk.java @@ -1,17 +1,23 @@ package com.raoulvdberge.refinedstorage.item; +import com.raoulvdberge.refinedstorage.RSItems; +import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskSyncData; import com.raoulvdberge.refinedstorage.api.storage.disk.StorageDiskType; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskFluid; import com.raoulvdberge.refinedstorage.block.FluidStorageType; import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.world.World; @@ -57,7 +63,7 @@ public class ItemFluidStorageDisk extends ItemBase implements IStorageDiskProvid stack.setTagCompound(new NBTTagCompound()); stack.getTagCompound().setUniqueId(NBT_ID, id); - API.instance().getStorageDiskManager(world).set(id, new StorageDiskFluid(world, FluidStorageType.getById(stack.getItemDamage()).getCapacity())); + API.instance().getStorageDiskManager(world).set(id, API.instance().createDefaultFluidDisk(world, FluidStorageType.getById(stack.getItemDamage()).getCapacity())); API.instance().getStorageDiskManager(world).markForSaving(); } } @@ -86,7 +92,29 @@ public class ItemFluidStorageDisk extends ItemBase implements IStorageDiskProvid } } - // TODO: onItemRightClick + @Override + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack diskStack = player.getHeldItem(hand); + + if (!world.isRemote && player.isSneaking() && diskStack.getMetadata() != TYPE_CREATIVE) { + IStorageDisk disk = API.instance().getStorageDiskManager(world).getByStack(diskStack); + + if (disk != null && disk.getStored() == 0) { + ItemStack storagePart = new ItemStack(RSItems.FLUID_STORAGE_PART, 1, diskStack.getMetadata()); + + if (!player.inventory.addItemStackToInventory(storagePart.copy())) { + InventoryHelper.spawnItemStack(world, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), storagePart); + } + + API.instance().getStorageDiskManager(world).remove(getId(diskStack)); + API.instance().getStorageDiskManager(world).markForSaving(); + + return new ActionResult<>(EnumActionResult.SUCCESS, new ItemStack(RSItems.STORAGE_HOUSING)); + } + } + + return new ActionResult<>(EnumActionResult.PASS, diskStack); + } @Override public int getEntityLifespan(ItemStack stack, World world) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemStorageDisk.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemStorageDisk.java index 6d34e37a4..3d4e8cac3 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemStorageDisk.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemStorageDisk.java @@ -1,17 +1,23 @@ package com.raoulvdberge.refinedstorage.item; +import com.raoulvdberge.refinedstorage.RSItems; +import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskSyncData; import com.raoulvdberge.refinedstorage.api.storage.disk.StorageDiskType; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskItem; import com.raoulvdberge.refinedstorage.block.ItemStorageType; import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.world.World; @@ -57,7 +63,7 @@ public class ItemStorageDisk extends ItemBase implements IStorageDiskProvider { stack.setTagCompound(new NBTTagCompound()); stack.getTagCompound().setUniqueId(NBT_ID, id); - API.instance().getStorageDiskManager(world).set(id, new StorageDiskItem(world, ItemStorageType.getById(stack.getItemDamage()).getCapacity())); //TODO: create factory in API + API.instance().getStorageDiskManager(world).set(id, API.instance().createDefaultItemDisk(world, ItemStorageType.getById(stack.getItemDamage()).getCapacity())); API.instance().getStorageDiskManager(world).markForSaving(); } } @@ -86,7 +92,29 @@ public class ItemStorageDisk extends ItemBase implements IStorageDiskProvider { } } - // TODO: onItemRightClick + @Override + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack diskStack = player.getHeldItem(hand); + + if (!world.isRemote && player.isSneaking() && diskStack.getMetadata() != TYPE_CREATIVE) { + IStorageDisk disk = API.instance().getStorageDiskManager(world).getByStack(diskStack); + + if (disk != null && disk.getStored() == 0) { + ItemStack storagePart = new ItemStack(RSItems.STORAGE_PART, 1, diskStack.getMetadata()); + + if (!player.inventory.addItemStackToInventory(storagePart.copy())) { + InventoryHelper.spawnItemStack(world, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), storagePart); + } + + API.instance().getStorageDiskManager(world).remove(getId(diskStack)); + API.instance().getStorageDiskManager(world).markForSaving(); + + return new ActionResult<>(EnumActionResult.SUCCESS, new ItemStack(RSItems.STORAGE_HOUSING)); + } + } + + return new ActionResult<>(EnumActionResult.PASS, diskStack); + } @Override public int getEntityLifespan(ItemStack stack, World world) {