diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/CargoNetworkTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/CargoNetworkTask.java index 84185e479..35b5fe225 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/CargoNetworkTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/CargoNetworkTask.java @@ -151,15 +151,19 @@ class CargoNetworkTask implements Runnable { boolean roundrobin = Objects.equals(cfg.getString("round-robin"), "true"); boolean smartFill = Objects.equals(cfg.getString("smart-fill"), "true"); + int index = 0; Collection destinations; if (roundrobin) { + // The current round-robin index of the (unsorted) outputNodes list, + // or the index at which to start searching for valid output nodes + index = network.roundRobin.getOrDefault(inputNode, 0); // Use an ArrayDeque to perform round-robin sorting // Since the impl for roundRobinSort just does Deque.addLast(Deque#removeFirst) // An ArrayDequeue is preferable as opposed to a LinkedList: // - The number of elements does not change. // - ArrayDequeue has better iterative performance Deque tempDestinations = new ArrayDeque<>(outputNodes); - roundRobinSort(inputNode, tempDestinations); + roundRobinSort(index, tempDestinations); destinations = tempDestinations; } else { // Using an ArrayList here since we won't need to sort the destinations @@ -175,9 +179,14 @@ class CargoNetworkTask implements Runnable { item = CargoUtils.insert(network, inventories, output.getBlock(), target.get(), smartFill, item, wrapper); if (item == null) { + if (roundrobin) { + // The output was valid, set the round robin index to the node after this one + network.roundRobin.put(inputNode, (index + 1) % outputNodes.size()); + } break; } } + index++; } return item; @@ -187,27 +196,19 @@ class CargoNetworkTask implements Runnable { * This method sorts a given {@link Deque} of output node locations using a semi-accurate * round-robin method. * - * @param inputNode - * The {@link Location} of the input node + * @param index + * The round-robin index of the input node * @param outputNodes * A {@link Deque} of {@link Location Locations} of the output nodes */ - private void roundRobinSort(Location inputNode, Deque outputNodes) { - int index = network.roundRobin.getOrDefault(inputNode, 0); - + private void roundRobinSort(int index, Deque outputNodes) { if (index < outputNodes.size()) { // Not ideal but actually not bad performance-wise over more elegant alternatives for (int i = 0; i < index; i++) { Location temp = outputNodes.removeFirst(); outputNodes.add(temp); } - - index++; - } else { - index = 1; } - - network.roundRobin.put(inputNode, index); } }