diff --git a/src/main/java/refinedstorage/api/storage/IItemList.java b/src/main/java/refinedstorage/api/storage/IItemList.java index 3450a5e39..b018bbf5f 100755 --- a/src/main/java/refinedstorage/api/storage/IItemList.java +++ b/src/main/java/refinedstorage/api/storage/IItemList.java @@ -1,10 +1,13 @@ package refinedstorage.api.storage; import net.minecraft.item.ItemStack; +import refinedstorage.api.network.INetworkMaster; import java.util.List; public interface IItemList { + void rebuild(INetworkMaster master); + void add(ItemStack stack); void remove(ItemStack stack); diff --git a/src/main/java/refinedstorage/apiimpl/storage/ItemList.java b/src/main/java/refinedstorage/apiimpl/storage/ItemList.java index 51edfcedb..12df66163 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/ItemList.java +++ b/src/main/java/refinedstorage/apiimpl/storage/ItemList.java @@ -2,7 +2,10 @@ package refinedstorage.apiimpl.storage; import net.minecraft.item.ItemStack; import refinedstorage.RefinedStorageUtils; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.INetworkSlave; import refinedstorage.api.storage.IItemList; +import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorageProvider; import java.util.List; @@ -11,8 +14,24 @@ public class ItemList implements IItemList { private List stacks; @Override - public void rebuild(List providers) { + public void rebuild(INetworkMaster master) { stacks.clear(); + + for (INetworkSlave slave : master.getSlaves()) { + if (slave instanceof IStorageProvider) { + IStorage[] storages = ((IStorageProvider) slave).getStorages(); + + if (storages != null) { + for (IStorage storage : storages) { + if (storage != null) { + for (ItemStack stack : storage.getItems()) { + add(stack); + } + } + } + } + } + } } @Override diff --git a/src/main/java/refinedstorage/apiimpl/storage/NBTStorage.java b/src/main/java/refinedstorage/apiimpl/storage/NBTStorage.java index 010a758b9..400ec7db2 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/NBTStorage.java +++ b/src/main/java/refinedstorage/apiimpl/storage/NBTStorage.java @@ -110,8 +110,8 @@ public abstract class NBTStorage implements IStorage { } @Override - public void addItems(List items) { - items.addAll(stacks); + public List getItems() { + return stacks; } @Override diff --git a/src/main/java/refinedstorage/network/MessageGridItems.java b/src/main/java/refinedstorage/network/MessageGridItems.java index 1bff6bc14..2824463f9 100755 --- a/src/main/java/refinedstorage/network/MessageGridItems.java +++ b/src/main/java/refinedstorage/network/MessageGridItems.java @@ -41,9 +41,9 @@ public class MessageGridItems implements IMessage, IMessageHandler storages) { - for (IStorage storage : this.storages) { - if (storage != null) { - storages.add(storage); - } - } + public IStorage[] getStorages() { + return storages; } @Override diff --git a/src/main/java/refinedstorage/tile/TileSlave.java b/src/main/java/refinedstorage/tile/TileSlave.java index 37ae190c6..f4cf4db1d 100755 --- a/src/main/java/refinedstorage/tile/TileSlave.java +++ b/src/main/java/refinedstorage/tile/TileSlave.java @@ -11,6 +11,7 @@ import refinedstorage.RefinedStorageUtils; import refinedstorage.api.RefinedStorageCapabilities; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkSlave; +import refinedstorage.api.storage.IStorageProvider; import refinedstorage.tile.config.IRedstoneModeConfig; import refinedstorage.tile.config.RedstoneMode; import refinedstorage.tile.controller.TileController; @@ -168,6 +169,10 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync markDirty(); this.redstoneMode = mode; + + if (this instanceof IStorageProvider && isConnected()) { + network.getItems().rebuild(network); + } } @Override diff --git a/src/main/java/refinedstorage/tile/TileStorage.java b/src/main/java/refinedstorage/tile/TileStorage.java index 27eeb8116..9602269dc 100755 --- a/src/main/java/refinedstorage/tile/TileStorage.java +++ b/src/main/java/refinedstorage/tile/TileStorage.java @@ -20,8 +20,6 @@ import refinedstorage.inventory.BasicItemHandler; import refinedstorage.network.MessagePriorityUpdate; import refinedstorage.tile.config.*; -import java.util.List; - public class TileStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { class Storage extends NBTStorage { public Storage() { @@ -89,10 +87,14 @@ public class TileStorage extends TileSlave implements IStorageProvider, IStorage } @Override - public void provide(List storages) { + public IStorage[] getStorages() { if (storage != null) { - storages.add(storage); + return new IStorage[]{ + storage + }; } + + return null; } @Override diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index 791d25087..a702a5072 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -60,6 +60,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR private List storages = new ArrayList(); private IItemList items = new ItemList(); + private boolean rebuildItemList; private List slaves = new ArrayList(); private List slavesToAdd = new ArrayList(); @@ -107,14 +108,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty(); for (INetworkSlave newSlave : slavesToAdd) { - if (newSlave instanceof IStorageProvider) { - for (IStorage storage : ((IStorageProvider) newSlave).getStorages()) { - for (ItemStack item : storage.getItems()) { - items.add(item); - } - } - } - boolean found = false; for (int i = 0; i < slaves.size(); ++i) { @@ -192,6 +185,14 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR updateSlaves(); } + if (rebuildItemList) { + items.rebuild(this); + + rebuildItemList = false; + + updateItemsWithClient(); + } + if (couldRun != canRun()) { couldRun = canRun(); @@ -226,11 +227,19 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public void addSlave(INetworkSlave slave) { slavesToAdd.add(slave); + + if (slave instanceof IStorageProvider) { + rebuildItemList = true; + } } @Override public void removeSlave(INetworkSlave slave) { slavesToRemove.add(slave); + + if (slave instanceof IStorageProvider) { + rebuildItemList = true; + } } public void disconnectSlaves() { @@ -453,6 +462,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } items.add(ItemHandlerHelper.copyStackWithSize(stack, sizePushed)); + + updateItemsWithClient(); } return remainder; @@ -485,6 +496,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR if (newStack != null) { items.remove(newStack); + + updateItemsWithClient(); } return newStack; diff --git a/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java b/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java index ed5c78499..a508dfc95 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java @@ -7,6 +7,7 @@ import refinedstorage.RefinedStorageUtils; import refinedstorage.tile.config.ModeFilter; import javax.annotation.Nonnull; +import java.util.Collections; import java.util.List; public class DeepStorageUnitStorage extends ExternalStorage { @@ -24,10 +25,12 @@ public class DeepStorageUnitStorage extends ExternalStorage { } @Override - public void addItems(List items) { + public List getItems() { if (unit.getStoredItemType() != null && unit.getStoredItemType().stackSize > 0) { - items.add(unit.getStoredItemType().copy()); + return Collections.singletonList(unit.getStoredItemType().copy()); } + + return Collections.emptyList(); } @Override diff --git a/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java b/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java index 0d0a36783..062d80ee8 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java @@ -7,6 +7,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorageUtils; import refinedstorage.tile.config.ModeFilter; +import java.util.Collections; import java.util.List; public class DrawerStorage extends ExternalStorage { @@ -24,10 +25,12 @@ public class DrawerStorage extends ExternalStorage { } @Override - public void addItems(List items) { + public List getItems() { if (!drawer.isEmpty() && drawer.getStoredItemCount() > 0) { - items.add(drawer.getStoredItemCopy()); + return Collections.singletonList(drawer.getStoredItemCopy()); } + + return Collections.emptyList(); } public boolean isVoidable() { diff --git a/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java b/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java index 18cf07341..7a556ac64 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java @@ -6,6 +6,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorageUtils; import refinedstorage.tile.config.ModeFilter; +import java.util.ArrayList; import java.util.List; public class ItemHandlerStorage extends ExternalStorage { @@ -23,12 +24,16 @@ public class ItemHandlerStorage extends ExternalStorage { } @Override - public void addItems(List items) { + public List getItems() { + List items = new ArrayList(); + for (int i = 0; i < handler.getSlots(); ++i) { if (handler.getStackInSlot(i) != null && handler.getStackInSlot(i).getItem() != null) { items.add(handler.getStackInSlot(i).copy()); } } + + return items; } @Override diff --git a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java index cf16c3ca4..24e019446 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java @@ -22,8 +22,6 @@ import refinedstorage.tile.config.IModeConfig; import refinedstorage.tile.config.IRedstoneModeConfig; import refinedstorage.tile.config.ModeConstants; -import java.util.List; - public class TileExternalStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { public static final String NBT_PRIORITY = "Priority"; public static final String NBT_COMPARE = "Compare"; @@ -143,12 +141,14 @@ public class TileExternalStorage extends TileSlave implements IStorageProvider, } @Override - public void provide(List storages) { + public IStorage[] getStorages() { TileEntity facing = getFacingTile(); if (facing instanceof IDrawerGroup) { IDrawerGroup group = (IDrawerGroup) facing; + IStorage[] storages = new IStorage[group.getDrawerCount()]; + energyUsage = group.getDrawerCount(); stored = 0; capacity = 0; @@ -157,7 +157,7 @@ public class TileExternalStorage extends TileSlave implements IStorageProvider, if (group.isDrawerEnabled(i)) { DrawerStorage storage = new DrawerStorage(this, group.getDrawer(i)); - storages.add(storage); + storages[i] = storage; stored += storage.getStored(); capacity += storage.getCapacity(); @@ -166,36 +166,44 @@ public class TileExternalStorage extends TileSlave implements IStorageProvider, } else if (facing instanceof IDrawer) { DrawerStorage storage = new DrawerStorage(this, (IDrawer) facing); - storages.add(storage); - energyUsage = 1; stored = storage.getStored(); capacity = storage.getCapacity(); + + return new IStorage[]{ + storage + }; } else if (facing instanceof IDeepStorageUnit) { DeepStorageUnitStorage storage = new DeepStorageUnitStorage(this, (IDeepStorageUnit) facing); - storages.add(storage); - energyUsage = 1; stored = storage.getStored(); capacity = storage.getCapacity(); + + return new IStorage[]{ + storage + }; } else { IItemHandler handler = RefinedStorageUtils.getItemHandler(facing, getDirection().getOpposite()); if (handler != null) { ItemHandlerStorage storage = new ItemHandlerStorage(this, handler); - storages.add(storage); - energyUsage = 1; stored = storage.getStored(); capacity = storage.getCapacity(); + + return new IStorage[]{ + storage + }; } else { energyUsage = 0; stored = 0; capacity = 0; } } + + return null; } @Override