From 52ed4d991ae5113e19942defbfacb498ecb0deb4 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 12 Oct 2026 18:49:25 +0000 Subject: [PATCH] Fix duplicate crafting job dependencies when interfaces re-register Crafting interfaces re-register to the network when they become dirty, which added the dependencies of their jobs to the dependency graph again. This caused duplicated subtrees in crafting plans of running jobs. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01C5iUzweRYoCkKB5bvJdH8Y --- .../crafting/CraftingJobDependencyGraph.java | 9 +++++++-- .../TestCraftingJobDependencyGraph.java | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cyclops/integratedcrafting/api/crafting/CraftingJobDependencyGraph.java b/src/main/java/org/cyclops/integratedcrafting/api/crafting/CraftingJobDependencyGraph.java index 8e5643d13..37c6cf9a8 100644 --- a/src/main/java/org/cyclops/integratedcrafting/api/crafting/CraftingJobDependencyGraph.java +++ b/src/main/java/org/cyclops/integratedcrafting/api/crafting/CraftingJobDependencyGraph.java @@ -153,7 +153,10 @@ public void addDependency(CraftingJob craftingJob, int dependency) { jobDependencies = new IntArrayList(); dependencies.put(craftingJob.getId(), jobDependencies); } - jobDependencies.add(dependency); + // An edge is only stored once, as crafting interfaces add the edges of their jobs again when they re-register + if (!jobDependencies.contains(dependency)) { + jobDependencies.add(dependency); + } // Save reverse link IntCollection jobDependents = dependents.get(dependency); @@ -161,7 +164,9 @@ public void addDependency(CraftingJob craftingJob, int dependency) { jobDependents = new IntArrayList(); dependents.put(dependency, jobDependents); } - jobDependents.add(craftingJob.getId()); + if (!jobDependents.contains(craftingJob.getId())) { + jobDependents.add(craftingJob.getId()); + } } public void removeDependency(int craftingJob, int dependency) { diff --git a/src/test/java/org/cyclops/integratedcrafting/api/crafting/TestCraftingJobDependencyGraph.java b/src/test/java/org/cyclops/integratedcrafting/api/crafting/TestCraftingJobDependencyGraph.java index 31082fc60..a61b9e5e0 100644 --- a/src/test/java/org/cyclops/integratedcrafting/api/crafting/TestCraftingJobDependencyGraph.java +++ b/src/test/java/org/cyclops/integratedcrafting/api/crafting/TestCraftingJobDependencyGraph.java @@ -71,6 +71,23 @@ public void testSingleDependencyDouble() { assertThat(Sets.newHashSet(g.getDependents(J1)), equalTo(Sets.newHashSet(J0))); } + @Test + public void testSingleDependencyDoubleStoredOnce() { + g.addDependency(J0, J1); + g.addDependency(J0, J1.getId()); + assertThat(Lists.newArrayList(g.getDependencies(J0)), equalTo(Lists.newArrayList(J1))); + assertThat(Lists.newArrayList(g.getDependents(J1)), equalTo(Lists.newArrayList(J0))); + } + + @Test + public void testSingleDependencyDoubleRemove() { + g.addDependency(J0, J1); + g.addDependency(J0, J1); + g.removeDependency(0, 1); + assertThat(Sets.newHashSet(g.getCraftingJobs()), equalTo(Sets.newHashSet())); + assertThat(g.hasDependencies(J0), equalTo(false)); + } + @Test public void testSingleDependencyRemove() { g.addDependency(J0, J1);