diff --git a/src/main/java/storagecraft/gui/GuiGrid.java b/src/main/java/storagecraft/gui/GuiGrid.java index fa53a5131..5ae4eb448 100644 --- a/src/main/java/storagecraft/gui/GuiGrid.java +++ b/src/main/java/storagecraft/gui/GuiGrid.java @@ -53,8 +53,8 @@ public class GuiGrid extends GuiContainer { for (int i = 0; i < 9 * 4; ++i) { ItemStack stack = null; - if (grid.isConnected() && i < grid.getController().getStorage().getItems().size()) { - StorageItem item = grid.getController().getStorage().getItems().get(i); + if (grid.isConnected() && i < grid.getController().getItems().size()) { + StorageItem item = grid.getController().getItems().get(i); stack = new ItemStack(item.getType(), item.getQuantity(), item.getMeta()); diff --git a/src/main/java/storagecraft/inventory/slot/SlotDrive.java b/src/main/java/storagecraft/inventory/slot/SlotDrive.java index fc89840bd..118332df7 100644 --- a/src/main/java/storagecraft/inventory/slot/SlotDrive.java +++ b/src/main/java/storagecraft/inventory/slot/SlotDrive.java @@ -23,6 +23,8 @@ public class SlotDrive extends SlotItemFilter { public void onSlotChanged() { super.onSlotChanged(); - drive.getController().getStorage().sync(); + if (drive.isConnected()) { + drive.getController().storageSync(); + } } } diff --git a/src/main/java/storagecraft/item/ItemStorageCell.java b/src/main/java/storagecraft/item/ItemStorageCell.java index d3e3467e6..198ae50f4 100644 --- a/src/main/java/storagecraft/item/ItemStorageCell.java +++ b/src/main/java/storagecraft/item/ItemStorageCell.java @@ -1,25 +1,15 @@ package storagecraft.item; -import java.util.ArrayList; import java.util.List; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import storagecraft.storage.StorageItem; +import storagecraft.storage.CellStorage; public class ItemStorageCell extends ItemSC { - public static final String NBT_ITEMS = "Items"; - public static final String NBT_STORED = "Stored"; - - public static final String NBT_ITEM_TYPE = "Type"; - public static final String NBT_ITEM_QUANTITY = "Quantity"; - public static final String NBT_ITEM_META = "Meta"; - public ItemStorageCell() { super("storageCell"); @@ -31,16 +21,16 @@ public class ItemStorageCell extends ItemSC { @Override public void getSubItems(Item item, CreativeTabs tab, List list) { for (int i = 0; i < 5; ++i) { - list.add(init(new ItemStack(item, 1, i))); + list.add(CellStorage.init(new ItemStack(item, 1, i))); } } @Override public void addInformation(ItemStack cell, EntityPlayer player, List list, boolean b) { - if (getCapacity(cell) == -1) { - list.add(String.format(StatCollector.translateToLocal("misc.storagecraft:storageCellStored"), getStored(cell))); + if (CellStorage.getCapacity(cell) == -1) { + list.add(String.format(StatCollector.translateToLocal("misc.storagecraft:storageCellStored"), CellStorage.getStored(cell))); } else { - list.add(String.format(StatCollector.translateToLocal("misc.storagecraft:storageCellStoredWithCapacity"), getStored(cell), getCapacity(cell))); + list.add(String.format(StatCollector.translateToLocal("misc.storagecraft:storageCellStoredWithCapacity"), CellStorage.getStored(cell), CellStorage.getCapacity(cell))); } } @@ -48,113 +38,6 @@ public class ItemStorageCell extends ItemSC { public void onCreated(ItemStack stack, World world, EntityPlayer player) { super.onCreated(stack, world, player); - init(stack); - } - - private static StorageItem createItemFromNBT(NBTTagCompound tag) { - return new StorageItem(Item.getItemById(tag.getInteger(NBT_ITEM_TYPE)), tag.getInteger(NBT_ITEM_QUANTITY), tag.getInteger(NBT_ITEM_META)); - } - - public static List getStoredItems(ItemStack cell) { - List items = new ArrayList(); - - NBTTagList list = (NBTTagList) cell.stackTagCompound.getTag(NBT_ITEMS); - - for (int i = 0; i < list.tagCount(); ++i) { - items.add(createItemFromNBT(list.getCompoundTagAt(i))); - } - - return items; - } - - public static ItemStack init(ItemStack cell) { - cell.stackTagCompound = new NBTTagCompound(); - cell.stackTagCompound.setTag(NBT_ITEMS, new NBTTagList()); - cell.stackTagCompound.setInteger(NBT_STORED, 0); - - return cell; - } - - public static void push(ItemStack cell, ItemStack stack) { - NBTTagList list = (NBTTagList) cell.stackTagCompound.getTag(NBT_ITEMS); - - cell.stackTagCompound.setInteger(NBT_STORED, getStored(cell) + stack.stackSize); - - for (int i = 0; i < list.tagCount(); ++i) { - NBTTagCompound tag = list.getCompoundTagAt(i); - - StorageItem item = createItemFromNBT(tag); - - if (item.getType() == stack.getItem() && item.getMeta() == stack.getItemDamage()) { - tag.setInteger(NBT_ITEM_QUANTITY, item.getQuantity() + stack.stackSize); - - return; - } - } - - NBTTagCompound tag = new NBTTagCompound(); - - tag.setInteger(NBT_ITEM_TYPE, Item.getIdFromItem(stack.getItem())); - tag.setInteger(NBT_ITEM_QUANTITY, stack.stackSize); - tag.setInteger(NBT_ITEM_META, stack.getItemDamage()); - - list.appendTag(tag); - } - - public static int take(ItemStack cell, Item type, int quantity, int meta) { - NBTTagList list = (NBTTagList) cell.stackTagCompound.getTag(NBT_ITEMS); - - for (int i = 0; i < list.tagCount(); ++i) { - NBTTagCompound tag = list.getCompoundTagAt(i); - - StorageItem item = createItemFromNBT(tag); - - if (item.getType() == type && item.getMeta() == meta) { - if (quantity > item.getQuantity()) { - quantity = item.getQuantity(); - } - - tag.setInteger(NBT_ITEM_QUANTITY, item.getQuantity() - quantity); - - if (item.getQuantity() - quantity == 0) { - list.removeTag(i); - } - - cell.stackTagCompound.setInteger(NBT_STORED, getStored(cell) - quantity); - - return quantity; - } - } - - return 0; - } - - public static boolean hasSpace(ItemStack cell, ItemStack stack) { - if (getCapacity(cell) == -1) { - return true; - } - - return (getStored(cell) + stack.stackSize) <= getCapacity(cell); - } - - public static int getStored(ItemStack cell) { - return cell.stackTagCompound.getInteger(NBT_STORED); - } - - public static int getCapacity(ItemStack cell) { - switch (cell.getItemDamage()) { - case 0: - return 1000; - case 1: - return 4000; - case 2: - return 16000; - case 3: - return 64000; - case 4: - return -1; - } - - return 0; + CellStorage.init(stack); } } diff --git a/src/main/java/storagecraft/network/MessagePullFromStorage.java b/src/main/java/storagecraft/network/MessagePullFromStorage.java index 3fc30b878..eaabdbb52 100644 --- a/src/main/java/storagecraft/network/MessagePullFromStorage.java +++ b/src/main/java/storagecraft/network/MessagePullFromStorage.java @@ -60,8 +60,8 @@ public class MessagePullFromStorage implements IMessage, IMessageHandler getAll() { + List items = new ArrayList(); + + NBTTagList list = (NBTTagList) cell.stackTagCompound.getTag(NBT_ITEMS); + + for (int i = 0; i < list.tagCount(); ++i) { + items.add(createItemFromNBT(list.getCompoundTagAt(i))); + } + + return items; + } + + @Override + public void push(ItemStack stack) { + NBTTagList list = (NBTTagList) cell.stackTagCompound.getTag(NBT_ITEMS); + + cell.stackTagCompound.setInteger(NBT_STORED, getStored(cell) + stack.stackSize); + + for (int i = 0; i < list.tagCount(); ++i) { + NBTTagCompound tag = list.getCompoundTagAt(i); + + StorageItem item = createItemFromNBT(tag); + + if (item.getType() == stack.getItem() && item.getMeta() == stack.getItemDamage()) { + tag.setInteger(NBT_ITEM_QUANTITY, item.getQuantity() + stack.stackSize); + + return; + } + } + + NBTTagCompound tag = new NBTTagCompound(); + + tag.setInteger(NBT_ITEM_TYPE, Item.getIdFromItem(stack.getItem())); + tag.setInteger(NBT_ITEM_QUANTITY, stack.stackSize); + tag.setInteger(NBT_ITEM_META, stack.getItemDamage()); + + list.appendTag(tag); + } + + @Override + public int take(Item type, int quantity, int meta) { + NBTTagList list = (NBTTagList) cell.stackTagCompound.getTag(NBT_ITEMS); + + for (int i = 0; i < list.tagCount(); ++i) { + NBTTagCompound tag = list.getCompoundTagAt(i); + + StorageItem item = createItemFromNBT(tag); + + if (item.getType() == type && item.getMeta() == meta) { + if (quantity > item.getQuantity()) { + quantity = item.getQuantity(); + } + + tag.setInteger(NBT_ITEM_QUANTITY, item.getQuantity() - quantity); + + if (item.getQuantity() - quantity == 0) { + list.removeTag(i); + } + + cell.stackTagCompound.setInteger(NBT_STORED, getStored(cell) - quantity); + + return quantity; + } + } + + return 0; + } + + @Override + public boolean canPush(ItemStack stack) { + if (getCapacity(cell) == -1) { + return true; + } + + return (getStored(cell) + stack.stackSize) <= getCapacity(cell); + } + + public static int getStored(ItemStack cell) { + return cell.stackTagCompound.getInteger(CellStorage.NBT_STORED); + } + + public static int getCapacity(ItemStack cell) { + switch (cell.getItemDamage()) { + case 0: + return 1000; + case 1: + return 4000; + case 2: + return 16000; + case 3: + return 64000; + case 4: + return -1; + } + + return 0; + } + + public static ItemStack init(ItemStack cell) { + cell.stackTagCompound = new NBTTagCompound(); + cell.stackTagCompound.setTag(CellStorage.NBT_ITEMS, new NBTTagList()); + cell.stackTagCompound.setInteger(CellStorage.NBT_STORED, 0); + + return cell; + } +} diff --git a/src/main/java/storagecraft/storage/IStorage.java b/src/main/java/storagecraft/storage/IStorage.java new file mode 100644 index 000000000..3cc1c978d --- /dev/null +++ b/src/main/java/storagecraft/storage/IStorage.java @@ -0,0 +1,15 @@ +package storagecraft.storage; + +import java.util.List; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public interface IStorage { + public List getAll(); + + public void push(ItemStack stack); + + public int take(Item type, int quantity, int meta); + + public boolean canPush(ItemStack stack); +} diff --git a/src/main/java/storagecraft/storage/IStorageCellProvider.java b/src/main/java/storagecraft/storage/IStorageCellProvider.java deleted file mode 100644 index 9b0a0d54b..000000000 --- a/src/main/java/storagecraft/storage/IStorageCellProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -package storagecraft.storage; - -import java.util.List; -import net.minecraft.item.ItemStack; - -public interface IStorageCellProvider { - public List getStorageCells(); -} diff --git a/src/main/java/storagecraft/storage/IStorageProvider.java b/src/main/java/storagecraft/storage/IStorageProvider.java new file mode 100644 index 000000000..0b59e50f5 --- /dev/null +++ b/src/main/java/storagecraft/storage/IStorageProvider.java @@ -0,0 +1,7 @@ +package storagecraft.storage; + +import java.util.List; + +public interface IStorageProvider { + public void addStorages(List providers); +} diff --git a/src/main/java/storagecraft/storage/Storage.java b/src/main/java/storagecraft/storage/Storage.java deleted file mode 100644 index 8b9a820f1..000000000 --- a/src/main/java/storagecraft/storage/Storage.java +++ /dev/null @@ -1,94 +0,0 @@ -package storagecraft.storage; - -import io.netty.buffer.ByteBuf; -import java.util.ArrayList; -import java.util.List; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import storagecraft.item.ItemStorageCell; - -public class Storage { - private IStorageCellProvider provider; - private List items = new ArrayList(); - - public Storage(IStorageCellProvider provider) { - this.provider = provider; - - sync(); - } - - public List getItems() { - return items; - } - - public void sync() { - items.clear(); - - // @TODO: merge stored items with others.. - for (ItemStack cell : provider.getStorageCells()) { - items.addAll(ItemStorageCell.getStoredItems(cell)); - } - } - - public boolean push(ItemStack stack) { - ItemStack cellWithSpace = null; - - for (ItemStack cell : provider.getStorageCells()) { - if (ItemStorageCell.hasSpace(cell, stack)) { - cellWithSpace = cell; - - break; - } - } - - if (cellWithSpace == null) { - return false; - } - - ItemStorageCell.push(cellWithSpace, stack); - - sync(); - - return true; - } - - public ItemStack take(Item type, int quantity, int meta) { - int took = 0; - - for (ItemStack cell : provider.getStorageCells()) { - took += ItemStorageCell.take(cell, type, quantity, meta); - - if (took == quantity) { - break; - } - } - - sync(); - - return new ItemStack(type, took, meta); - } - - public void fromBytes(ByteBuf buf) { - items.clear(); - - int size = buf.readInt(); - - for (int i = 0; i < size; ++i) { - Item type = Item.getItemById(buf.readInt()); - int quantity = buf.readInt(); - int meta = buf.readInt(); - - items.add(new StorageItem(type, quantity, meta)); - } - } - - public void toBytes(ByteBuf buf) { - buf.writeInt(items.size()); - - for (StorageItem item : items) { - buf.writeInt(Item.getIdFromItem(item.getType())); - buf.writeInt(item.getQuantity()); - buf.writeInt(item.getMeta()); - } - } -} diff --git a/src/main/java/storagecraft/tile/TileController.java b/src/main/java/storagecraft/tile/TileController.java index b2c14eedb..f68bcb22e 100644 --- a/src/main/java/storagecraft/tile/TileController.java +++ b/src/main/java/storagecraft/tile/TileController.java @@ -5,24 +5,25 @@ import cofh.api.energy.IEnergyReceiver; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import java.util.List; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -import storagecraft.SCItems; -import storagecraft.storage.IStorageCellProvider; -import storagecraft.storage.Storage; +import storagecraft.storage.IStorage; +import storagecraft.storage.IStorageProvider; +import storagecraft.storage.StorageItem; -public class TileController extends TileSC implements IEnergyReceiver, INetworkTile, IStorageCellProvider { +public class TileController extends TileSC implements IEnergyReceiver, INetworkTile { public static final int BASE_ENERGY_USAGE = 100; + private List items = new ArrayList(); + private List storages = new ArrayList(); private List connectedMachines = new ArrayList(); private EnergyStorage energy = new EnergyStorage(32000); private int energyUsage; - private Storage storage = new Storage(this); - private boolean destroyed = false; private int ticks = 0; @@ -64,6 +65,8 @@ public class TileController extends TileSC implements IEnergyReceiver, INetworkT } connectedMachines = machines; + + storageSync(); } energyUsage = BASE_ENERGY_USAGE; @@ -93,31 +96,70 @@ public class TileController extends TileSC implements IEnergyReceiver, INetworkT connectedMachines.clear(); } - public Storage getStorage() { - return storage; + public List getMachines() { + return connectedMachines; } - @Override - public List getStorageCells() { - List stacks = new ArrayList(); + public List getItems() { + return items; + } + + public void storageSync() { + storages.clear(); for (TileMachine machine : connectedMachines) { - if (machine instanceof TileDrive) { - TileDrive drive = (TileDrive) machine; - - for (int i = 0; i < drive.getSizeInventory(); ++i) { - if (drive.getStackInSlot(i) != null && drive.getStackInSlot(i).getItem() == SCItems.STORAGE_CELL) { - stacks.add(drive.getStackInSlot(i)); - } - } + if (machine instanceof IStorageProvider) { + ((IStorageProvider) machine).addStorages(storages); } } - return stacks; + storageItemsSync(); } - public List getMachines() { - return connectedMachines; + private void storageItemsSync() { + items.clear(); + + for (IStorage storage : storages) { + items.addAll(storage.getAll()); + } + } + + public boolean push(ItemStack stack) { + IStorage storageThatCanPush = null; + + for (IStorage storage : storages) { + if (storage.canPush(stack)) { + storageThatCanPush = storage; + + break; + } + } + + if (storageThatCanPush == null) { + return false; + } + + storageThatCanPush.push(stack); + + storageItemsSync(); + + return true; + } + + public ItemStack take(Item type, int quantity, int meta) { + int took = 0; + + for (IStorage storage : storages) { + took += storage.take(type, quantity, meta); + + if (took == quantity) { + break; + } + } + + storageItemsSync(); + + return new ItemStack(type, took, meta); } @Override @@ -167,7 +209,17 @@ public class TileController extends TileSC implements IEnergyReceiver, INetworkT energy.setEnergyStored(buf.readInt()); energyUsage = buf.readInt(); - storage.fromBytes(buf); + items.clear(); + + int size = buf.readInt(); + + for (int i = 0; i < size; ++i) { + Item type = Item.getItemById(buf.readInt()); + int quantity = buf.readInt(); + int meta = buf.readInt(); + + items.add(new StorageItem(type, quantity, meta)); + } } @Override @@ -175,6 +227,12 @@ public class TileController extends TileSC implements IEnergyReceiver, INetworkT buf.writeInt(energy.getEnergyStored()); buf.writeInt(energyUsage); - storage.toBytes(buf); + buf.writeInt(items.size()); + + for (StorageItem item : items) { + buf.writeInt(Item.getIdFromItem(item.getType())); + buf.writeInt(item.getQuantity()); + buf.writeInt(item.getMeta()); + } } } diff --git a/src/main/java/storagecraft/tile/TileDrive.java b/src/main/java/storagecraft/tile/TileDrive.java index af1c4fce0..a5ee04483 100644 --- a/src/main/java/storagecraft/tile/TileDrive.java +++ b/src/main/java/storagecraft/tile/TileDrive.java @@ -1,13 +1,17 @@ package storagecraft.tile; +import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import storagecraft.SC; import storagecraft.inventory.InventorySC; +import storagecraft.storage.CellStorage; +import storagecraft.storage.IStorage; +import storagecraft.storage.IStorageProvider; -public class TileDrive extends TileMachine implements IInventory { +public class TileDrive extends TileMachine implements IInventory, IStorageProvider { private InventorySC inventory = new InventorySC("drive", 8); @Override @@ -88,4 +92,13 @@ public class TileDrive extends TileMachine implements IInventory { SC.saveInventory(this, nbt); } + + @Override + public void addStorages(List providers) { + for (int i = 0; i < getSizeInventory(); ++i) { + if (getStackInSlot(i) != null) { + providers.add(new CellStorage(getStackInSlot(i))); + } + } + } }