From 828627bb170386730b26aaa8f28d7256201356e3 Mon Sep 17 00:00:00 2001 From: Eldrinn-Elantey <46845681+Eldrinn-Elantey@users.noreply.github.com> Date: Sun, 15 Feb 2026 16:53:43 +0400 Subject: [PATCH] fix(logistics): enforce correct promise ordering for cascading factory requests Issue: in cascading crafting requests, a parent-level Promise could be created before child-level ones, and promises could also be added when no actual requests were generated, causing crafting to stall. Changes: Switched request storage to LinkedHashMap to preserve deterministic bottom-up processing order. Added explicit tracking for contexts that produced real requests. Now creates output promises only when requests were actually generated and then fully dispatched. --- .../panel/FactoryPanelRequestMixin.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/panel/FactoryPanelRequestMixin.java b/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/panel/FactoryPanelRequestMixin.java index b4f6698..72dc200 100644 --- a/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/panel/FactoryPanelRequestMixin.java +++ b/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/panel/FactoryPanelRequestMixin.java @@ -245,7 +245,8 @@ private void tickRequests(Operation original) { // Map of result -> requests of its ingredients // Input items may come from differing networks - Map> requests = new HashMap<>(); + Map> requests = new LinkedHashMap<>(); + Set contextsWithRequests = new HashSet<>(); // Collect request distributions for (PanelRequestedStacks requestContext : toRequest) { @@ -255,6 +256,9 @@ private void tickRequests(Operation original) { GenericOrder order = GenericOrder.of(requestContext, entry.getValue()); Multimap request = GenericLogisticsManager.findPackagersForRequest( entry.getKey(), order, null, requestContext.recipeAddress()); + if (!request.isEmpty()) { + contextsWithRequests.add(requestContext); + } requests.merge(requestContext, request, (a, b) -> { a.putAll(b); @@ -274,11 +278,20 @@ private void tickRequests(Operation original) { GenericLogisticsManager.performPackageRequests(entry); // Keep the output promises - for (Map.Entry> entry : requests.entrySet()) { - RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(entry.getKey().resultNetwork()); + for (PanelRequestedStacks requestContext : toRequest) { + if (!contextsWithRequests.contains(requestContext)) { + continue; + } + + Multimap request = requests.get(requestContext); + if (request == null || !request.isEmpty()) { + continue; + } + + RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(requestContext.resultNetwork()); // if all requests were sent, add the output promise - if (promises != null && entry.getValue().isEmpty()) - promises.add(new RequestPromise(BigGenericStack.of(entry.getKey().result()).asStack())); + if (promises != null) + promises.add(new RequestPromise(BigGenericStack.of(requestContext.result()).asStack())); } panelBE.advancements.awardPlayer(AllAdvancements.FACTORY_GAUGE);