diff --git a/build.gradle b/build.gradle index 8027040..bd74235 100644 --- a/build.gradle +++ b/build.gradle @@ -104,9 +104,12 @@ dependencies { compileOnly fg.deobf("mezz.jei:jei-1.16.2:7.3.2.25:api") runtimeOnly fg.deobf("mezz.jei:jei-1.16.2:7.3.2.25") - // to test the rf requiring stuff - runtimeOnly fg.deobf("curse.maven:powah:3057732") - runtimeOnly fg.deobf("curse.maven:lollipop:3057731") + // to test the rf requiring and crafting stuff + runtimeOnly fg.deobf("curse.maven:powah-352656:3057732") + runtimeOnly fg.deobf("curse.maven:lollipop-347954:3057731") + runtimeOnly fg.deobf("curse.maven:mcjtylib-233105:3131241") + runtimeOnly fg.deobf("curse.maven:rftools-base-326041:3140147") + runtimeOnly fg.deobf("curse.maven:rftools-utility-342466:3152948") } // Example for how to get properties into the manifest for reading by the runtime.. diff --git a/src/main/java/de/ellpeck/prettypipes/items/IModule.java b/src/main/java/de/ellpeck/prettypipes/items/IModule.java index faf88b8..ff77258 100644 --- a/src/main/java/de/ellpeck/prettypipes/items/IModule.java +++ b/src/main/java/de/ellpeck/prettypipes/items/IModule.java @@ -36,9 +36,9 @@ public interface IModule { List getAllCraftables(ItemStack module, PipeTileEntity tile); - int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain); + int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain); - ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack); + ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain); Integer getCustomNextNode(ItemStack module, PipeTileEntity tile, List nodes, int index); } diff --git a/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java b/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java index f709c50..60fae92 100644 --- a/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java @@ -85,12 +85,12 @@ public abstract class ModuleItem extends Item implements IModule { } @Override - public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain) { + public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain) { return 0; } @Override - public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack) { + public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain) { return stack; } diff --git a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java index 87167e0..8d804a7 100644 --- a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java +++ b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java @@ -6,8 +6,6 @@ import com.google.common.collect.Streams; import de.ellpeck.prettypipes.PrettyPipes; import de.ellpeck.prettypipes.Registry; import de.ellpeck.prettypipes.Utility; -import de.ellpeck.prettypipes.items.IModule; -import de.ellpeck.prettypipes.items.ModuleItem; import de.ellpeck.prettypipes.misc.ItemEqualityType; import de.ellpeck.prettypipes.packets.PacketHandler; import de.ellpeck.prettypipes.packets.PacketItemEnterPipe; @@ -196,17 +194,17 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL return remain; } // check craftable items - return this.requestCraftedItem(destPipe, null, remain, equalityTypes); + return this.requestCraftedItem(destPipe, null, remain, new Stack<>(), equalityTypes); } - public ItemStack requestCraftedItem(BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { + public ItemStack requestCraftedItem(BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain, ItemEqualityType... equalityTypes) { for (Pair craftable : this.getAllCraftables(destPipe)) { if (!ItemEqualityType.compareItems(stack, craftable.getRight(), equalityTypes)) continue; PipeTileEntity pipe = this.getPipe(craftable.getLeft()); if (pipe == null) continue; - stack = pipe.craft(destPipe, unavailableConsumer, stack); + stack = pipe.craft(destPipe, unavailableConsumer, stack, dependencyChain); if (stack.isEmpty()) break; } @@ -301,7 +299,7 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL return craftables; } - public int getCraftableAmount(BlockPos node, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain, ItemEqualityType... equalityTypes) { + public int getCraftableAmount(BlockPos node, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain, ItemEqualityType... equalityTypes) { int total = 0; for (Pair pair : this.getAllCraftables(node)) { if (!ItemEqualityType.compareItems(pair.getRight(), stack, equalityTypes)) diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java index cc4c537..2f68aa3 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java @@ -4,7 +4,7 @@ import de.ellpeck.prettypipes.PrettyPipes; import de.ellpeck.prettypipes.Registry; import de.ellpeck.prettypipes.Utility; import de.ellpeck.prettypipes.items.IModule; -import de.ellpeck.prettypipes.items.ModuleItem; +import de.ellpeck.prettypipes.misc.ItemEqualityType; import de.ellpeck.prettypipes.network.NetworkLock; import de.ellpeck.prettypipes.network.PipeNetwork; import de.ellpeck.prettypipes.pipe.containers.MainPipeContainer; @@ -307,13 +307,13 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide .collect(Collectors.toList()); } - public int getCraftableAmount(Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain) { + public int getCraftableAmount(Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain) { int total = 0; Iterator> modules = this.streamModules().iterator(); while (modules.hasNext()) { Pair module = modules.next(); // make sure we don't factor in recursive dependencies like ingot -> block -> ingot etc. - if (!dependencyChain.contains(module.getRight())) { + if (dependencyChain.stream().noneMatch(d -> ItemEqualityType.compareItems(module.getLeft(), d, ItemEqualityType.NBT))) { int amount = module.getRight().getCraftableAmount(module.getLeft(), this, unavailableConsumer, stack, dependencyChain); if (amount > 0) total += amount; @@ -322,11 +322,11 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide return total; } - public ItemStack craft(BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack) { + public ItemStack craft(BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain) { Iterator> modules = this.streamModules().iterator(); while (modules.hasNext()) { Pair module = modules.next(); - stack = module.getRight().craft(module.getLeft(), this, destPipe, unavailableConsumer, stack); + stack = module.getRight().craft(module.getLeft(), this, destPipe, unavailableConsumer, stack, dependencyChain); if (stack.isEmpty()) break; } 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 1cfe20d..8750856 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 @@ -137,7 +137,7 @@ public class CraftingModuleItem extends ModuleItem { } @Override - public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain) { + public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain) { PipeNetwork network = PipeNetwork.get(tile.getWorld()); List items = network.getOrderedNetworkItems(tile.getPos()); ItemEqualityType[] equalityTypes = ItemFilter.getEqualityTypes(tile); @@ -148,12 +148,8 @@ public class CraftingModuleItem extends ModuleItem { for (int i = 0; i < output.getSlots(); i++) { ItemStack out = output.getStackInSlot(i); if (!out.isEmpty() && ItemEqualityType.compareItems(out, stack, equalityTypes)) { - // we copy the dependency chain, because we want to pass down the dependencies for this output only - Stack deps = (Stack) dependencyChain.clone(); - // we can craft this item *in general*, so add us to the dependency chain - deps.push(this); // figure out how many crafting operations we can actually do with the input items we have in the network - int availableCrafts = CraftingTerminalTileEntity.getAvailableCrafts(tile, input.getSlots(), input::getStackInSlot, k -> true, s -> items, unavailableConsumer, deps, equalityTypes); + int availableCrafts = CraftingTerminalTileEntity.getAvailableCrafts(tile, input.getSlots(), input::getStackInSlot, k -> true, s -> items, unavailableConsumer, addDependency(dependencyChain, module), equalityTypes); if (availableCrafts > 0) craftable += out.getCount() * availableCrafts; } @@ -162,9 +158,9 @@ public class CraftingModuleItem extends ModuleItem { } @Override - public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack) { + public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain) { // check if we can craft the required amount of items - int craftableAmount = this.getCraftableAmount(module, tile, unavailableConsumer, stack, new Stack<>()); + int craftableAmount = this.getCraftableAmount(module, tile, unavailableConsumer, stack, dependencyChain); if (craftableAmount <= 0) return stack; @@ -183,7 +179,7 @@ public class CraftingModuleItem extends ModuleItem { continue; ItemStack copy = in.copy(); copy.setCount(in.getCount() * toCraft); - Pair, ItemStack> ret = ItemTerminalTileEntity.requestItemLater(tile.getWorld(), tile.getPos(), items, unavailableConsumer, copy, equalityTypes); + Pair, ItemStack> ret = ItemTerminalTileEntity.requestItemLater(tile.getWorld(), tile.getPos(), items, unavailableConsumer, copy, addDependency(dependencyChain, module), equalityTypes); tile.craftIngredientRequests.addAll(ret.getLeft()); } @@ -229,4 +225,10 @@ public class CraftingModuleItem extends ModuleItem { } return resultAmount; } + + private static Stack addDependency(Stack deps, ItemStack module) { + deps = (Stack) deps.clone(); + deps.push(module); + return deps; + } } diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java index f2ccca5..8ddd6aa 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java @@ -196,7 +196,7 @@ public class CraftingTerminalTileEntity extends ItemTerminalTileEntity { return remain; } - public static int getAvailableCrafts(PipeTileEntity tile, int slots, Function inputFunction, Predicate isGhost, Function> locationsFunction, Consumer unavailableConsumer, Stack dependencyChain, ItemEqualityType... equalityTypes) { + public static int getAvailableCrafts(PipeTileEntity tile, int slots, Function inputFunction, Predicate isGhost, Function> locationsFunction, Consumer unavailableConsumer, Stack dependencyChain, ItemEqualityType... equalityTypes) { PipeNetwork network = PipeNetwork.get(tile.getWorld()); // the highest amount we can craft with the items we have int lowestAvailable = Integer.MAX_VALUE; diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java index 406441e..952eda7 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java @@ -158,7 +158,7 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine public int requestItemImpl(ItemStack stack, Consumer unavailableConsumer) { NetworkItem item = this.networkItems.get(new EquatableItemStack(stack, ItemEqualityType.NBT)); Collection locations = item == null ? Collections.emptyList() : item.getLocations(); - Pair, ItemStack> ret = requestItemLater(this.world, this.getConnectedPipe().getPos(), locations, unavailableConsumer, stack, ItemEqualityType.NBT); + Pair, ItemStack> ret = requestItemLater(this.world, this.getConnectedPipe().getPos(), locations, unavailableConsumer, stack, new Stack<>(), ItemEqualityType.NBT); this.existingRequests.addAll(ret.getLeft()); return stack.getCount() - ret.getRight().getCount(); } @@ -269,7 +269,7 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine return true; } - public static Pair, ItemStack> requestItemLater(World world, BlockPos destPipe, Collection locations, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { + public static Pair, ItemStack> requestItemLater(World world, BlockPos destPipe, Collection locations, Consumer unavailableConsumer, ItemStack stack, Stack dependencyChain, ItemEqualityType... equalityTypes) { List requests = new ArrayList<>(); ItemStack remain = stack.copy(); PipeNetwork network = PipeNetwork.get(world); @@ -297,7 +297,7 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine } // check for craftable items if (!remain.isEmpty()) - remain = network.requestCraftedItem(destPipe, unavailableConsumer, remain, equalityTypes); + remain = network.requestCraftedItem(destPipe, unavailableConsumer, remain, dependencyChain, equalityTypes); return Pair.of(requests, remain); }