diff --git a/src/main/java/de/ellpeck/prettypipes/network/NetworkLocation.java b/src/main/java/de/ellpeck/prettypipes/network/NetworkLocation.java index 849c2bd..ce03709 100644 --- a/src/main/java/de/ellpeck/prettypipes/network/NetworkLocation.java +++ b/src/main/java/de/ellpeck/prettypipes/network/NetworkLocation.java @@ -1,7 +1,5 @@ package de.ellpeck.prettypipes.network; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ListMultimap; import de.ellpeck.prettypipes.misc.ItemEqualityType; import de.ellpeck.prettypipes.pipe.PipeTileEntity; import net.minecraft.item.ItemStack; @@ -12,9 +10,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.items.IItemHandler; -import org.apache.commons.lang3.tuple.Pair; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class NetworkLocation implements INBTSerializable { @@ -37,17 +37,16 @@ public class NetworkLocation implements INBTSerializable { if (this.isEmpty(world)) return Collections.emptyList(); return this.getItems(world).entrySet().stream() - .filter(e -> ItemEqualityType.compareItems(e.getValue(), stack, equalityTypes)) - .map(Map.Entry::getKey) - .collect(Collectors.toList()); + .filter(kv -> ItemEqualityType.compareItems(kv.getValue(), stack, equalityTypes) && this.canExtract(world, kv.getKey())) + .map(Map.Entry::getKey).collect(Collectors.toList()); } public int getItemAmount(World world, ItemStack stack, ItemEqualityType... equalityTypes) { if (this.isEmpty(world)) return 0; - return this.getItems(world).values().stream() - .filter(i -> ItemEqualityType.compareItems(stack, i, equalityTypes)) - .mapToInt(ItemStack::getCount).sum(); + return this.getItems(world).entrySet().stream() + .filter(kv -> ItemEqualityType.compareItems(stack, kv.getValue(), equalityTypes) && this.canExtract(world, kv.getKey())) + .mapToInt(kv -> kv.getValue().getCount()).sum(); } public Map getItems(World world) { @@ -55,19 +54,25 @@ public class NetworkLocation implements INBTSerializable { IItemHandler handler = this.getItemHandler(world); if (handler != null) { for (int i = 0; i < handler.getSlots(); i++) { + ItemStack stack = handler.getStackInSlot(i); // check if the slot is accessible to us - if (handler.extractItem(i, 1, true).isEmpty()) + if (stack.isEmpty()) continue; if (this.itemCache == null) this.itemCache = new HashMap<>(); // use getStackInSlot since there might be more than 64 items in there - this.itemCache.put(i, handler.getStackInSlot(i)); + this.itemCache.put(i, stack); } } } return this.itemCache; } + public boolean canExtract(World world, int slot) { + IItemHandler handler = this.getItemHandler(world); + return handler != null && !handler.extractItem(slot, 1, true).isEmpty(); + } + public IItemHandler getItemHandler(World world) { if (this.handlerCache == null) { PipeNetwork network = PipeNetwork.get(world); diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java index 23aae21..749244c 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java @@ -36,6 +36,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.common.util.Lazy; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -76,6 +77,7 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide private int lastItemAmount; private int priority; private final LazyOptional lazyThis = LazyOptional.of(() -> this); + private final Lazy workRandomizer = Lazy.of(() -> this.world.rand.nextInt(200)); public PipeTileEntity() { this(Registry.pipeTileEntity); @@ -384,6 +386,10 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide this.cover = null; } + public boolean shouldWorkNow(int speed) { + return (this.world.getGameTime() + this.workRandomizer.get()) % speed == 0; + } + @Override public void remove() { super.remove(); diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java index cb3387f..ba9a73f 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java @@ -66,7 +66,7 @@ public class CraftingModuleItem extends ModuleItem { @Override public void tick(ItemStack module, PipeTileEntity tile) { - if (tile.getWorld().getGameTime() % this.speed != 0 || !tile.canWork()) + if (!tile.shouldWorkNow(this.speed) || !tile.canWork()) return; PipeNetwork network = PipeNetwork.get(tile.getWorld()); // process crafting ingredient requests diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/modules/extraction/ExtractionModuleItem.java b/src/main/java/de/ellpeck/prettypipes/pipe/modules/extraction/ExtractionModuleItem.java index 2887bf5..6a7b684 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/modules/extraction/ExtractionModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/modules/extraction/ExtractionModuleItem.java @@ -1,12 +1,12 @@ package de.ellpeck.prettypipes.pipe.modules.extraction; import de.ellpeck.prettypipes.Registry; -import de.ellpeck.prettypipes.items.ModuleItem; -import de.ellpeck.prettypipes.misc.ItemFilter; -import de.ellpeck.prettypipes.pipe.PipeTileEntity; import de.ellpeck.prettypipes.items.IModule; +import de.ellpeck.prettypipes.items.ModuleItem; import de.ellpeck.prettypipes.items.ModuleTier; +import de.ellpeck.prettypipes.misc.ItemFilter; import de.ellpeck.prettypipes.network.PipeNetwork; +import de.ellpeck.prettypipes.pipe.PipeTileEntity; import de.ellpeck.prettypipes.pipe.containers.AbstractPipeContainer; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -31,9 +31,7 @@ public class ExtractionModuleItem extends ModuleItem { @Override public void tick(ItemStack module, PipeTileEntity tile) { - if (tile.getWorld().getGameTime() % this.speed != 0) - return; - if (!tile.canWork()) + if (!tile.shouldWorkNow(this.speed) || !tile.canWork()) return; ItemFilter filter = new ItemFilter(this.filterSlots, module, tile); diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/modules/retrieval/RetrievalModuleItem.java b/src/main/java/de/ellpeck/prettypipes/pipe/modules/retrieval/RetrievalModuleItem.java index a5f009b..1be80d7 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/modules/retrieval/RetrievalModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/modules/retrieval/RetrievalModuleItem.java @@ -31,9 +31,7 @@ public class RetrievalModuleItem extends ModuleItem { @Override public void tick(ItemStack module, PipeTileEntity tile) { - if (tile.getWorld().getGameTime() % this.speed != 0) - return; - if (!tile.canWork()) + if (!tile.shouldWorkNow(this.speed) || !tile.canWork()) return; PipeNetwork network = PipeNetwork.get(tile.getWorld()); diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java index 11a5354..406441e 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java @@ -176,10 +176,13 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine PipeTileEntity pipe = this.getConnectedPipe(); Map items = new HashMap<>(); for (NetworkLocation location : network.getOrderedNetworkItems(pipe.getPos())) { - for (ItemStack stack : location.getItems(this.world).values()) { - EquatableItemStack equatable = new EquatableItemStack(stack, equalityTypes); + for (Map.Entry entry : location.getItems(this.world).entrySet()) { + // make sure we can extract from this slot to display it + if (!location.canExtract(this.world, entry.getKey())) + continue; + EquatableItemStack equatable = new EquatableItemStack(entry.getValue(), equalityTypes); NetworkItem item = items.computeIfAbsent(equatable, NetworkItem::new); - item.add(location, stack); + item.add(location, entry.getValue()); } } network.endProfile();