diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index 1b2721ed6..6b62e5f3a 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -123,12 +123,20 @@ public interface INetworkMaster { /** * Sends to all clients in a grid a packet with all the items in this network. */ - void updateStorageWithClient(); + void sendStorageToClient(); /** * Sends a player a packet with all the items in this network. */ - void updateStorageWithClient(EntityPlayerMP player); + void sendStorageToClient(EntityPlayerMP player); + + /** + * Sends a specific delta to all grid watchers. + * + * @param stack The stack + * @param amount The amount changed + */ + void sendStorageDelta(ItemStack stack, int amount); /** * Pushes an item to this network. diff --git a/src/main/java/refinedstorage/api/storage/IGroupedStorage.java b/src/main/java/refinedstorage/api/storage/IGroupedStorage.java index 0b86e28c4..95f1331ae 100755 --- a/src/main/java/refinedstorage/api/storage/IGroupedStorage.java +++ b/src/main/java/refinedstorage/api/storage/IGroupedStorage.java @@ -13,10 +13,8 @@ public interface IGroupedStorage { /** * Rebuilds the storages and items for a network. Typically called when a {@link IStorageProvider} is * added or removed from the network. - * - * @param master The network */ - void rebuild(INetworkMaster master); + void rebuild(); /** * @return A list of {@link IStorage} connected to this network diff --git a/src/main/java/refinedstorage/apiimpl/network/WirelessGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/WirelessGridHandler.java index 2344ddc42..8051d193e 100755 --- a/src/main/java/refinedstorage/apiimpl/network/WirelessGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/WirelessGridHandler.java @@ -57,7 +57,7 @@ public class WirelessGridHandler implements IWirelessGridHandler { player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_GRID, player.worldObj, RefinedStorageUtils.getIdFromHand(hand), 0, 0); - network.updateStorageWithClient((EntityPlayerMP) player); + network.sendStorageToClient((EntityPlayerMP) player); drainEnergy(player, ItemWirelessGrid.USAGE_OPEN); diff --git a/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java b/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java index eb9710e36..143b45939 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java +++ b/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java @@ -18,12 +18,20 @@ import java.util.List; public class GroupedStorage implements IGroupedStorage { private List storages = new ArrayList(); private Multimap stacks = ArrayListMultimap.create(); + private INetworkMaster network; + private boolean rebuilding; + + public GroupedStorage(INetworkMaster network) { + this.network = network; + } @Override - public void rebuild(INetworkMaster master) { + public void rebuild() { + rebuilding = true; + storages.clear(); - for (INetworkSlave slave : master.getSlaves()) { + for (INetworkSlave slave : network.getSlaves()) { if (slave.canUpdate() && slave instanceof IStorageProvider) { ((IStorageProvider) slave).addStorages(storages); } @@ -36,6 +44,8 @@ public class GroupedStorage implements IGroupedStorage { add(stack); } } + + rebuilding = false; } @Override @@ -54,6 +64,10 @@ public class GroupedStorage implements IGroupedStorage { } stacks.put(stack.getItem(), stack.copy()); + + if (!rebuilding) { + network.sendStorageDelta(stack, stack.stackSize); + } } @Override @@ -66,6 +80,8 @@ public class GroupedStorage implements IGroupedStorage { stacks.remove(otherStack.getItem(), otherStack); } + network.sendStorageDelta(stack, -stack.stackSize); + return; } } diff --git a/src/main/java/refinedstorage/network/MessageGridDelta.java b/src/main/java/refinedstorage/network/MessageGridDelta.java new file mode 100755 index 000000000..dffd9f6be --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageGridDelta.java @@ -0,0 +1,67 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.items.ItemHandlerHelper; +import refinedstorage.RefinedStorageUtils; +import refinedstorage.container.ContainerGrid; + +import java.util.List; + +public class MessageGridDelta implements IMessage, IMessageHandler { + private ItemStack stack; + private int delta; + + public MessageGridDelta() { + } + + public MessageGridDelta(ItemStack stack, int delta) { + this.stack = stack; + this.delta = delta; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.stack = ByteBufUtils.readItemStack(buf); + this.delta = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + ByteBufUtils.writeItemStack(buf, stack); + buf.writeInt(delta); + } + + @Override + public IMessage onMessage(MessageGridDelta message, MessageContext ctx) { + Container container = Minecraft.getMinecraft().thePlayer.openContainer; + + if (container instanceof ContainerGrid) { + List items = ((ContainerGrid) container).getGrid().getItems(); + + for (ItemStack item : items) { + if (RefinedStorageUtils.compareStackNoQuantity(item, message.stack)) { + item.stackSize += message.delta; + + if (item.stackSize <= 0) { + items.remove(item); + } + + return null; + } + } + + if (message.delta > 0) { + items.add(ItemHandlerHelper.copyStackWithSize(message.stack, message.delta)); + } + } + + return null; + } +} diff --git a/src/main/java/refinedstorage/tile/TileDiskDrive.java b/src/main/java/refinedstorage/tile/TileDiskDrive.java index d1d492b91..6b5bff350 100755 --- a/src/main/java/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/refinedstorage/tile/TileDiskDrive.java @@ -65,7 +65,7 @@ public class TileDiskDrive extends TileSlave implements IStorageProvider, IStora } if (isConnected()) { - network.getStorage().rebuild(network); + network.getStorage().rebuild(); } } } diff --git a/src/main/java/refinedstorage/tile/TileSlave.java b/src/main/java/refinedstorage/tile/TileSlave.java index ab001933b..4b389093e 100755 --- a/src/main/java/refinedstorage/tile/TileSlave.java +++ b/src/main/java/refinedstorage/tile/TileSlave.java @@ -171,7 +171,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync this.redstoneMode = mode; if (this instanceof IStorageProvider && isConnected()) { - network.getStorage().rebuild(network); + network.getStorage().rebuild(); } } diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index 4a908a169..75fc9a05c 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -39,6 +39,7 @@ import refinedstorage.block.EnumControllerType; import refinedstorage.container.ContainerController; import refinedstorage.container.ContainerGrid; import refinedstorage.item.ItemPattern; +import refinedstorage.network.MessageGridDelta; import refinedstorage.network.MessageGridItems; import refinedstorage.tile.ISynchronizedContainer; import refinedstorage.tile.TileBase; @@ -58,7 +59,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR private GridHandler gridHandler = new GridHandler(this); private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this); - private IGroupedStorage storage = new GroupedStorage(); + private IGroupedStorage storage = new GroupedStorage(this); private boolean rebuildStorage; private List slaves = new ArrayList(); @@ -132,11 +133,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR slavesToRemove.clear(); if (rebuildStorage) { - storage.rebuild(this); + storage.rebuild(); rebuildStorage = false; - updateStorageWithClient(); + sendStorageToClient(); } if (canRun()) { @@ -413,19 +414,32 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } @Override - public void updateStorageWithClient() { + public void sendStorageToClient() { for (EntityPlayer player : worldObj.playerEntities) { - if (player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition())) { - updateStorageWithClient((EntityPlayerMP) player); + if (isWatchingGrid(player)) { + sendStorageToClient((EntityPlayerMP) player); } } } @Override - public void updateStorageWithClient(EntityPlayerMP player) { + public void sendStorageToClient(EntityPlayerMP player) { RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player); } + @Override + public void sendStorageDelta(ItemStack stack, int amount) { + for (EntityPlayer player : worldObj.playerEntities) { + if (isWatchingGrid(player)) { + RefinedStorage.NETWORK.sendTo(new MessageGridDelta(stack, amount), (EntityPlayerMP) player); + } + } + } + + private boolean isWatchingGrid(EntityPlayer player) { + return player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition()); + } + @Override public ItemStack push(ItemStack stack, int size, boolean simulate) { if (stack == null || stack.getItem() == null || storage.getStorages().isEmpty()) { @@ -460,8 +474,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } storage.add(ItemHandlerHelper.copyStackWithSize(stack, sizePushed)); - - updateStorageWithClient(); } return remainder; @@ -494,8 +506,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR if (newStack != null) { storage.remove(newStack); - - updateStorageWithClient(); } return newStack; diff --git a/src/main/java/refinedstorage/tile/grid/TileGrid.java b/src/main/java/refinedstorage/tile/grid/TileGrid.java index 38794ba6b..cdb3dd5ea 100755 --- a/src/main/java/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/refinedstorage/tile/grid/TileGrid.java @@ -112,7 +112,7 @@ public class TileGrid extends TileSlave implements IGrid { public void onGridOpened(EntityPlayer player) { if (isConnected()) { - network.updateStorageWithClient((EntityPlayerMP) player); + network.sendStorageToClient((EntityPlayerMP) player); } }