From 3ee04b64804dc144b7946e7ddf3b0ca9b2996dc2 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Fri, 7 Oct 2016 02:10:45 +0200 Subject: [PATCH] IItemStackList holds some behavior that I don't want to duplicate everywhere --- src/main/java/refinedstorage/api/IAPI.java | 7 ++ .../api/storage/item/IGroupedItemStorage.java | 33 +------ .../api/util/IItemStackList.java | 27 ++++++ src/main/java/refinedstorage/apiimpl/API.java | 8 ++ .../autocrafting/task/CraftingTaskNormal.java | 14 +-- .../apiimpl/network/grid/ItemGridHandler.java | 4 +- .../storage/item/GroupedItemStorage.java | 83 ++--------------- .../apiimpl/util/ItemStackList.java | 90 +++++++++++++++++++ .../network/MessageGridItemUpdate.java | 4 +- .../refinedstorage/tile/TileController.java | 2 +- .../refinedstorage/tile/TileDetector.java | 2 +- .../tile/TileDiskManipulator.java | 2 +- 12 files changed, 159 insertions(+), 117 deletions(-) create mode 100755 src/main/java/refinedstorage/api/util/IItemStackList.java create mode 100755 src/main/java/refinedstorage/apiimpl/util/ItemStackList.java diff --git a/src/main/java/refinedstorage/api/IAPI.java b/src/main/java/refinedstorage/api/IAPI.java index bd7a98f83..f4862b4ba 100755 --- a/src/main/java/refinedstorage/api/IAPI.java +++ b/src/main/java/refinedstorage/api/IAPI.java @@ -3,6 +3,7 @@ package refinedstorage.api; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; import refinedstorage.api.solderer.ISoldererRegistry; +import refinedstorage.api.util.IItemStackList; import javax.annotation.Nonnull; @@ -27,4 +28,10 @@ public interface IAPI { */ @Nonnull ICraftingMonitorElementRegistry getCraftingMonitorElementRegistry(); + + /** + * @return a empty fast item stack list + */ + @Nonnull + IItemStackList createItemStackList(); } diff --git a/src/main/java/refinedstorage/api/storage/item/IGroupedItemStorage.java b/src/main/java/refinedstorage/api/storage/item/IGroupedItemStorage.java index b1c2292d7..0ae4bf23a 100755 --- a/src/main/java/refinedstorage/api/storage/item/IGroupedItemStorage.java +++ b/src/main/java/refinedstorage/api/storage/item/IGroupedItemStorage.java @@ -2,11 +2,9 @@ package refinedstorage.api.storage.item; import net.minecraft.item.ItemStack; import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.util.IItemStackList; import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Collection; import java.util.List; /** @@ -47,34 +45,9 @@ public interface IGroupedItemStorage { void remove(@Nonnull ItemStack stack); /** - * Gets an item from the network. - * - * @param stack the stack to find - * @param flags the flags to compare on, see {@link CompareUtils} - * @return null if no item is found, or the stack, do NOT modify + * @return the list behind this grouped storage */ - @Nullable - ItemStack get(@Nonnull ItemStack stack, int flags); - - /** - * Gets an item from the network by hash, see {@link refinedstorage.api.network.NetworkUtils#getItemStackHashCode(ItemStack)}. - * - * @return null if no item is found matching the hash, or the stack, do NOT modify - */ - @Nullable - ItemStack get(int hash); - - /** - * Copies a grouped item storage. - * - * @return the storage - */ - IGroupedItemStorage copy(); - - /** - * @return all items in this storage network - */ - Collection getStacks(); + IItemStackList getList(); /** * @return the item storages connected to this network diff --git a/src/main/java/refinedstorage/api/util/IItemStackList.java b/src/main/java/refinedstorage/api/util/IItemStackList.java new file mode 100755 index 000000000..bc2374699 --- /dev/null +++ b/src/main/java/refinedstorage/api/util/IItemStackList.java @@ -0,0 +1,27 @@ +package refinedstorage.api.util; + +import net.minecraft.item.ItemStack; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collection; + +public interface IItemStackList { + void add(ItemStack stack); + + boolean remove(@Nonnull ItemStack stack, boolean removeIfReachedZero); + + @Nullable + ItemStack get(@Nonnull ItemStack stack, int flags); + + @Nullable + ItemStack get(int hash); + + void clear(); + + @Nonnull + Collection getStacks(); + + @Nonnull + IItemStackList copy(); +} diff --git a/src/main/java/refinedstorage/apiimpl/API.java b/src/main/java/refinedstorage/apiimpl/API.java index 88ec325b7..c4e02fdf2 100755 --- a/src/main/java/refinedstorage/apiimpl/API.java +++ b/src/main/java/refinedstorage/apiimpl/API.java @@ -4,9 +4,11 @@ import refinedstorage.api.IAPI; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; import refinedstorage.api.solderer.ISoldererRegistry; +import refinedstorage.api.util.IItemStackList; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementRegistry; import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry; import refinedstorage.apiimpl.solderer.SoldererRegistry; +import refinedstorage.apiimpl.util.ItemStackList; import javax.annotation.Nonnull; @@ -34,4 +36,10 @@ public class API implements IAPI { public ICraftingMonitorElementRegistry getCraftingMonitorElementRegistry() { return craftingMonitorElementRegistry; } + + @Nonnull + @Override + public IItemStackList createItemStackList() { + return new ItemStackList(); + } } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java index f5e6b6799..9b2ca7d93 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java @@ -13,7 +13,7 @@ import refinedstorage.api.autocrafting.task.IProcessable; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.NetworkUtils; import refinedstorage.api.storage.CompareUtils; -import refinedstorage.api.storage.item.IGroupedItemStorage; +import refinedstorage.api.util.IItemStackList; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementRoot; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementToTake; @@ -41,22 +41,24 @@ public class CraftingTaskNormal implements ICraftingTask { } public void calculate() { + IItemStackList list = network.getItemStorage().getList().copy(); + int newQuantity = quantity; while (newQuantity > 0) { - calculate(network.getItemStorage().copy(), pattern, true); + calculate(list, pattern, true); newQuantity -= requested == null ? newQuantity : pattern.getQuantityPerRequest(requested); } } - private void calculate(IGroupedItemStorage storage, ICraftingPattern pattern, boolean basePattern) { + private void calculate(IItemStackList list, ICraftingPattern pattern, boolean basePattern) { if (pattern.isProcessing()) { toProcess.add(new Processable(pattern)); } for (ItemStack input : pattern.getInputs()) { - ItemStack inputInNetwork = storage.get(input, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); + ItemStack inputInNetwork = list.get(input, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); if (inputInNetwork == null || inputInNetwork.stackSize == 0) { if (getExtrasFor(input) != null) { @@ -69,7 +71,7 @@ public class CraftingTaskNormal implements ICraftingTask { addToCraft(output); } - calculate(storage, inputPattern, false); + calculate(list, inputPattern, false); } else { addMissing(input); } @@ -79,7 +81,7 @@ public class CraftingTaskNormal implements ICraftingTask { toTake.push(input); } - storage.remove(input); + list.remove(input, true); } } diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java index 15bba8c82..dda97a31a 100755 --- a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java @@ -22,7 +22,7 @@ public class ItemGridHandler implements IItemGridHandler { @Override public void onExtract(int hash, int flags, EntityPlayerMP player) { - ItemStack item = network.getItemStorage().get(hash); + ItemStack item = network.getItemStorage().getList().get(hash); if (item == null) { return; @@ -120,7 +120,7 @@ public class ItemGridHandler implements IItemGridHandler { @Override public void onCraftingPreviewRequested(EntityPlayerMP player, int hash, int quantity) { - ItemStack stack = network.getItemStorage().get(hash); + ItemStack stack = network.getItemStorage().getList().get(hash); if (stack != null) { CraftingTaskNormal task = new CraftingTaskNormal(network, stack, NetworkUtils.getPattern(network, stack), quantity); diff --git a/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java b/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java index 8d9778ed6..8cf8a9fc0 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java +++ b/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java @@ -1,27 +1,23 @@ package refinedstorage.apiimpl.storage.item; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import refinedstorage.api.RefinedStorageAPI; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.NetworkUtils; -import refinedstorage.api.storage.CompareUtils; import refinedstorage.api.storage.item.IGroupedItemStorage; import refinedstorage.api.storage.item.IItemStorage; import refinedstorage.api.storage.item.IItemStorageProvider; +import refinedstorage.api.util.IItemStackList; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.util.ArrayList; -import java.util.Collection; import java.util.List; public class GroupedItemStorage implements IGroupedItemStorage { private INetworkMaster network; private List storages = new ArrayList<>(); - private Multimap stacks = ArrayListMultimap.create(); + private IItemStackList list = RefinedStorageAPI.instance().createItemStackList(); public GroupedItemStorage(INetworkMaster network) { this.network = network; @@ -35,7 +31,7 @@ public class GroupedItemStorage implements IGroupedItemStorage { .filter(node -> node.canUpdate() && node instanceof IItemStorageProvider) .forEach(node -> ((IItemStorageProvider) node).addItemStorages(storages)); - stacks.clear(); + list.clear(); for (IItemStorage storage : storages) { for (ItemStack stack : storage.getItems()) { @@ -56,19 +52,7 @@ public class GroupedItemStorage implements IGroupedItemStorage { @Override public void add(@Nonnull ItemStack stack, boolean rebuilding) { - for (ItemStack otherStack : stacks.get(stack.getItem())) { - if (CompareUtils.compareStackNoQuantity(otherStack, stack)) { - otherStack.stackSize += stack.stackSize; - - if (!rebuilding) { - network.sendItemStorageDeltaToClient(stack, stack.stackSize); - } - - return; - } - } - - stacks.put(stack.getItem(), stack.copy()); + list.add(stack); if (!rebuilding) { network.sendItemStorageDeltaToClient(stack, stack.stackSize); @@ -77,63 +61,14 @@ public class GroupedItemStorage implements IGroupedItemStorage { @Override public void remove(@Nonnull ItemStack stack) { - for (ItemStack otherStack : stacks.get(stack.getItem())) { - if (CompareUtils.compareStackNoQuantity(otherStack, stack)) { - otherStack.stackSize -= stack.stackSize; - - if (otherStack.stackSize == 0) { - if (!NetworkUtils.hasPattern(network, stack)) { - stacks.remove(otherStack.getItem(), otherStack); - } - } - - network.sendItemStorageDeltaToClient(stack, -stack.stackSize); - - return; - } + if (list.remove(stack, !NetworkUtils.hasPattern(network, stack))) { + network.sendItemStorageDeltaToClient(stack, -stack.stackSize); } } @Override - @Nullable - public ItemStack get(@Nonnull ItemStack stack, int flags) { - for (ItemStack otherStack : stacks.get(stack.getItem())) { - if (CompareUtils.compareStack(otherStack, stack, flags)) { - return otherStack; - } - } - - return null; - } - - @Override - @Nullable - public ItemStack get(int hash) { - for (ItemStack stack : this.stacks.values()) { - if (NetworkUtils.getItemStackHashCode(stack) == hash) { - return stack; - } - } - - return null; - } - - @Override - public IGroupedItemStorage copy() { - GroupedItemStorage copy = new GroupedItemStorage(network); - - copy.storages = storages; - - for (ItemStack stack : stacks.values()) { - copy.stacks.put(stack.getItem(), stack.copy()); - } - - return copy; - } - - @Override - public Collection getStacks() { - return stacks.values(); + public IItemStackList getList() { + return list; } @Override diff --git a/src/main/java/refinedstorage/apiimpl/util/ItemStackList.java b/src/main/java/refinedstorage/apiimpl/util/ItemStackList.java new file mode 100755 index 000000000..1e902a1da --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/util/ItemStackList.java @@ -0,0 +1,90 @@ +package refinedstorage.apiimpl.util; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.util.IItemStackList; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collection; + +public class ItemStackList implements IItemStackList { + private Multimap stacks = ArrayListMultimap.create(); + + public void add(ItemStack stack) { + for (ItemStack otherStack : stacks.get(stack.getItem())) { + if (CompareUtils.compareStackNoQuantity(otherStack, stack)) { + otherStack.stackSize += stack.stackSize; + + return; + } + } + + stacks.put(stack.getItem(), stack.copy()); + } + + public boolean remove(@Nonnull ItemStack stack, boolean removeIfReachedZero) { + for (ItemStack otherStack : stacks.get(stack.getItem())) { + if (CompareUtils.compareStackNoQuantity(otherStack, stack)) { + otherStack.stackSize -= stack.stackSize; + + if (otherStack.stackSize == 0 && removeIfReachedZero) { + stacks.remove(otherStack.getItem(), otherStack); + } + + return true; + } + } + + return false; + } + + @Nullable + public ItemStack get(@Nonnull ItemStack stack, int flags) { + for (ItemStack otherStack : stacks.get(stack.getItem())) { + if (CompareUtils.compareStack(otherStack, stack, flags)) { + return otherStack; + } + } + + return null; + } + + @Nullable + public ItemStack get(int hash) { + for (ItemStack stack : this.stacks.values()) { + if (NetworkUtils.getItemStackHashCode(stack) == hash) { + return stack; + } + } + + return null; + } + + @Override + public void clear() { + stacks.clear(); + } + + @Nonnull + @Override + public Collection getStacks() { + return stacks.values(); + } + + @Override + @Nonnull + public IItemStackList copy() { + ItemStackList list = new ItemStackList(); + + for (ItemStack stack : stacks.values()) { + list.add(stack.copy()); + } + + return list; + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridItemUpdate.java b/src/main/java/refinedstorage/network/MessageGridItemUpdate.java index f88300cce..2a514d5c1 100755 --- a/src/main/java/refinedstorage/network/MessageGridItemUpdate.java +++ b/src/main/java/refinedstorage/network/MessageGridItemUpdate.java @@ -35,9 +35,9 @@ public class MessageGridItemUpdate implements IMessage, IMessageHandler networkItems = new ArrayList<>(network.getItemStorage().getStacks()); + ArrayList networkItems = new ArrayList<>(network.getItemStorage().getList().getStacks()); int j = 0;