diff --git a/src/main/java/io/github/sefiraat/networks/network/NetworkRoot.java b/src/main/java/io/github/sefiraat/networks/network/NetworkRoot.java index df37b1be..063a401a 100644 --- a/src/main/java/io/github/sefiraat/networks/network/NetworkRoot.java +++ b/src/main/java/io/github/sefiraat/networks/network/NetworkRoot.java @@ -22,6 +22,7 @@ import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; +import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.BlockFace; @@ -53,8 +54,6 @@ public class NetworkRoot extends NetworkNode { protected final Set networkCrafters = new HashSet<>(); protected Set barrels = null; - private long totalPower = 0; - public NetworkRoot(Location location, NodeType type) { super(location, type); this.root = this; @@ -131,10 +130,15 @@ public Set getPurgers() { return networkPurgers; } + public Set getCrafters() { + return networkCrafters; + } + @Nonnull public Map getAllNetworkItems() { final Map itemStacks = new HashMap<>(); + // Barrels for (BarrelIdentity barrelIdentity : getBarrels()) { final Integer currentAmount = itemStacks.get(barrelIdentity.getItemStack()); final int newAmount; @@ -151,6 +155,30 @@ public Map getAllNetworkItems() { itemStacks.put(barrelIdentity.getItemStack(), newAmount); } + for (BlockMenu blockMenu : getCrafterOutputs()) { + int[] slots = blockMenu.getPreset().getSlotsAccessedByItemTransport(ItemTransportFlow.WITHDRAW); + for (int slot : slots) { + final ItemStack itemStack = blockMenu.getItemInSlot(slot); + if (itemStack == null || itemStack.getType() == Material.AIR) { + continue; + } + final ItemStack clone = StackUtils.getAsQuantity(itemStack, 1); + final Integer currentAmount = itemStacks.get(clone); + final int newAmount; + if (currentAmount == null) { + newAmount = itemStack.getAmount(); + } else { + long newLong = (long) currentAmount + (long) itemStack.getAmount(); + if (newLong > Integer.MAX_VALUE) { + newAmount = Integer.MAX_VALUE; + } else { + newAmount = currentAmount + itemStack.getAmount(); + } + } + itemStacks.put(clone, newAmount); + } + } + for (BlockMenu blockMenu : getCellMenus()) { for (ItemStack itemStack : blockMenu.getContents()) { if (itemStack != null && itemStack.getType() != Material.AIR) { @@ -326,10 +354,23 @@ public Set getCellMenus() { return menus; } + @Nonnull + public Set getCrafterOutputs() { + final Set menus = new HashSet<>(); + for (Location location : networkCrafters) { + BlockMenu menu = BlockStorage.getInventory(location); + if (menu != null) { + menus.add(menu); + } + } + return menus; + } + @Nullable public ItemStack getItemStack(@Nonnull ItemRequest request) { ItemStack stackToReturn = null; + // Cells first for (BlockMenu blockMenu : getCellMenus()) { for (ItemStack itemStack : blockMenu.getContents()) { if (itemStack == null @@ -365,6 +406,41 @@ public ItemStack getItemStack(@Nonnull ItemRequest request) { } } + // Crafters + for (BlockMenu blockMenu : getCrafterOutputs()) { + int[] slots = blockMenu.getPreset().getSlotsAccessedByItemTransport(ItemTransportFlow.WITHDRAW); + for (int slot : slots) { + final ItemStack itemStack = blockMenu.getItemInSlot(slot); + if (itemStack == null || itemStack.getType() == Material.AIR || !StackUtils.itemsMatch(request, itemStack)) { + continue; + } + + // Stack is null, so we can fill it here + if (stackToReturn == null) { + stackToReturn = itemStack.clone(); + stackToReturn.setAmount(1); + request.receiveAmount(1); + itemStack.setAmount(itemStack.getAmount() - 1); + } + + // Escape if fulfilled request + if (request.getAmount() <= 0) { + return stackToReturn; + } + + if (request.getAmount() <= itemStack.getAmount()) { + stackToReturn.setAmount(stackToReturn.getAmount() + request.getAmount()); + itemStack.setAmount(itemStack.getAmount() - request.getAmount()); + return stackToReturn; + } else { + stackToReturn.setAmount(stackToReturn.getAmount() + itemStack.getAmount()); + request.receiveAmount(itemStack.getAmount()); + itemStack.setAmount(0); + } + } + } + + // Barrels for (BarrelIdentity barrelIdentity : getBarrels()) { if (barrelIdentity.holdsMatchingItem(request.getItemStack())) { final ItemStack itemStack = barrelIdentity.requestItem(request.getItemStack()); @@ -372,7 +448,6 @@ public ItemStack getItemStack(@Nonnull ItemRequest request) { if (itemStack == null || (infinity && itemStack.getAmount() == 1) - //|| !SlimefunUtils.isItemSimilar(request.getItemStack(), itemStack, true, false) || !StackUtils.itemsMatch(request, itemStack) ) { continue; diff --git a/src/main/java/io/github/sefiraat/networks/slimefun/NetworkSlimefunItems.java b/src/main/java/io/github/sefiraat/networks/slimefun/NetworkSlimefunItems.java index c757efcb..21b911b9 100644 --- a/src/main/java/io/github/sefiraat/networks/slimefun/NetworkSlimefunItems.java +++ b/src/main/java/io/github/sefiraat/networks/slimefun/NetworkSlimefunItems.java @@ -390,8 +390,8 @@ public class NetworkSlimefunItems { OPTIC_CABLE.getItem(), SIMPLE_NANOBOTS.getItem(), OPTIC_CABLE.getItem(), OPTIC_GLASS.getItem(), SlimefunItems.ENHANCED_AUTO_CRAFTER, OPTIC_GLASS.getItem(), }, - 1000, - true + 64, + false ); NETWORK_AUTO_CRAFTER_WITHHOLDING = new NetworkAutoCrafter( @@ -403,8 +403,8 @@ public class NetworkSlimefunItems { OPTIC_CABLE.getItem(), ADVANCED_NANOBOTS.getItem(), OPTIC_CABLE.getItem(), OPTIC_GLASS.getItem(), NETWORK_AUTO_CRAFTER.getItem(), OPTIC_GLASS.getItem(), }, - 2000, - false + 128, + true ); diff --git a/src/main/java/io/github/sefiraat/networks/slimefun/NetworksSlimefunItemStacks.java b/src/main/java/io/github/sefiraat/networks/slimefun/NetworksSlimefunItemStacks.java index 02286017..e1ced8bd 100644 --- a/src/main/java/io/github/sefiraat/networks/slimefun/NetworksSlimefunItemStacks.java +++ b/src/main/java/io/github/sefiraat/networks/slimefun/NetworksSlimefunItemStacks.java @@ -369,7 +369,7 @@ public class NetworksSlimefunItemStacks { "it will be crafted if you have", "materials.", "", - MessageFormat.format("{0}Network Drain: {1}{2}/craft", Theme.CLICK_INFO, Theme.PASSIVE, 1000) + MessageFormat.format("{0}Network Drain: {1}{2}/craft", Theme.CLICK_INFO, Theme.PASSIVE, 64) ); NETWORK_AUTO_CRAFTER_WITHHOLDING = Theme.themedSlimefunItemStack( @@ -385,10 +385,11 @@ public class NetworksSlimefunItemStacks { "materials.", "A Withholding Crafter will keep", "a stack in the output and stop", - "crafting. The stack can bee seen", - "in the Network.", + "crafting. The stack can been seen", + "in the Network and also allows for", + "cargo.", "", - MessageFormat.format("{0}Network Drain: {1}{2}/craft", Theme.CLICK_INFO, Theme.PASSIVE, 2000) + MessageFormat.format("{0}Network Drain: {1}{2}/craft", Theme.CLICK_INFO, Theme.PASSIVE, 128) ); NETWORK_MEMORY_CARD_1 = Theme.themedSlimefunItemStack( diff --git a/src/main/java/io/github/sefiraat/networks/slimefun/network/NetworkAutoCrafter.java b/src/main/java/io/github/sefiraat/networks/slimefun/network/NetworkAutoCrafter.java index 2ffffb18..c9514f53 100644 --- a/src/main/java/io/github/sefiraat/networks/slimefun/network/NetworkAutoCrafter.java +++ b/src/main/java/io/github/sefiraat/networks/slimefun/network/NetworkAutoCrafter.java @@ -60,15 +60,15 @@ public class NetworkAutoCrafter extends NetworkObject { ); private final int chargePerCraft; - private final boolean directSubmit; + private final boolean withholding; private static final Map INSTANCE_MAP = new HashMap<>(); - public NetworkAutoCrafter(ItemGroup itemGroup, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, int chargePerCraft, boolean directSubmit) { + public NetworkAutoCrafter(ItemGroup itemGroup, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, int chargePerCraft, boolean withholding) { super(itemGroup, item, recipeType, recipe, NodeType.CRAFTER); this.chargePerCraft = chargePerCraft; - this.directSubmit = directSubmit; + this.withholding = withholding; this.getSlotsToDrop().add(BLUEPRINT_SLOT); this.getSlotsToDrop().add(OUTPUT_SLOT); @@ -98,17 +98,25 @@ protected void craftPreFlight(@Nonnull BlockMenu blockMenu) { final NodeDefinition definition = NetworkStorage.getAllNetworkObjects().get(blockMenu.getLocation()); - if (definition.getNode() == null) { + if (definition == null || definition.getNode() == null) { return; } + final NetworkRoot root = definition.getNode().getRoot(); + + if (!this.withholding) { + final ItemStack stored = blockMenu.getItemInSlot(OUTPUT_SLOT); + if (stored != null && stored.getType() != Material.AIR) { + root.addItemStack(stored); + } + } + final ItemStack blueprint = blockMenu.getItemInSlot(BLUEPRINT_SLOT); if (blueprint == null || blueprint.getType() == Material.AIR) { return; } - final NetworkRoot root = definition.getNode().getRoot(); final long networkCharge = root.getDownstreamCharge(); if (networkCharge > this.chargePerCraft) { @@ -136,21 +144,14 @@ protected void craftPreFlight(@Nonnull BlockMenu blockMenu) { if (outputItem != null && outputItem.getType() != Material.AIR - && (!StackUtils.itemsMatch(instance, outputItem) || outputItem.getAmount() >= outputItem.getMaxStackSize()) - ) { + && (!StackUtils.itemsMatch(instance, outputItem) || outputItem.getAmount() >= outputItem.getMaxStackSize())) + { return; } if (tryCraft(blockMenu, instance, root)) { root.removeCharge(this.chargePerCraft); } - - if (this.directSubmit) { - final ItemStack crafted = blockMenu.getItemInSlot(OUTPUT_SLOT); - if (crafted != null && crafted.getType() != Material.AIR) { - root.addItemStack(crafted); - } - } } } @@ -237,6 +238,9 @@ public boolean canOpen(@Nonnull Block block, @Nonnull Player player) { @Override public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { + if (NetworkAutoCrafter.this.withholding && flow == ItemTransportFlow.WITHDRAW) { + return new int[]{OUTPUT_SLOT}; + } return new int[0]; } };