diff --git a/src/main/java/me/desht/pneumaticcraft/common/drone/LogisticsManager.java b/src/main/java/me/desht/pneumaticcraft/common/drone/LogisticsManager.java index 0d87bd7c1..0107c5261 100644 --- a/src/main/java/me/desht/pneumaticcraft/common/drone/LogisticsManager.java +++ b/src/main/java/me/desht/pneumaticcraft/common/drone/LogisticsManager.java @@ -56,7 +56,8 @@ public PriorityQueue getTasks(Object holdingStack, boolean droneA FluidStack fluid = holdingStack instanceof FluidStack ? (FluidStack) holdingStack : FluidStack.EMPTY; PriorityQueue tasks = new PriorityQueue<>(); for (int priority = logistics.size() - 1; priority >= 0; priority--) { - for (AbstractLogisticsFrameEntity requester : logistics.get(priority)) { + for (int requesterId = 0; requesterId < logistics.get(priority).size(); requesterId++) { + AbstractLogisticsFrameEntity requester = logistics.get(priority).get(requesterId); if (droneAccess && requester.isObstructed(PathComputationType.AIR)) continue; for (int i = 0; i < priority; i++) { for (AbstractLogisticsFrameEntity provider : logistics.get(i)) { @@ -82,7 +83,15 @@ public PriorityQueue getTasks(Object holdingStack, boolean droneA // it could be that the drone is carrying some item or fluid it can't drop off right now // however it might still be able to transfer the other resource type (i.e. transfer items if // it's holding a fluid, and vice versa) + int taskCount = tasks.size(); tryProvide(provider, requester, tasks, item.isEmpty(), fluid.isEmpty()); + + // if we provided something to the requester, move the requester to last in its list + // so another requester gets the next delivery, effectively round robin. + List requesters = logistics.get(priority); + if (tasks.size() > taskCount && requesters.size() > 1) { + requesters.add(requesters.remove(requesterId)); + } } } }