From a0f3ef9d86e07ea16bd6475f878c227b387b483c Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Mon, 28 Feb 2022 21:25:13 -0300 Subject: [PATCH] cut crafting tree earlier if ingredients are available --- .../java/appeng/crafting/CraftingJob.java | 12 ++++++++ .../appeng/crafting/CraftingTreeNode.java | 29 +++++++++++++++++++ .../appeng/crafting/CraftingTreeProcess.java | 25 ++++++++++++++-- 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/main/java/appeng/crafting/CraftingJob.java b/src/main/java/appeng/crafting/CraftingJob.java index 75c0bc4ad..2f0d450d4 100644 --- a/src/main/java/appeng/crafting/CraftingJob.java +++ b/src/main/java/appeng/crafting/CraftingJob.java @@ -57,6 +57,8 @@ public class CraftingJob implements Runnable, ICraftingJob private final World world; private final IItemList crafting = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList(); private final IItemList missing = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList(); + private final IItemList usedWhileBuilding = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList(); + private final HashMap opsAndMultiplier = new HashMap<>(); private final Object monitor = new Object(); private final Stopwatch watch = Stopwatch.createUnstarted(); @@ -102,6 +104,16 @@ public class CraftingJob implements Runnable, ICraftingJob this.availableCheck.injectItems( o, Actionable.MODULATE, this.actionSrc ); } + public IItemList getUsedWhileBuilding() + { + return usedWhileBuilding; + } + + public IAEItemStack getOriginal( IAEItemStack request ) + { + return original.getItemList().findPrecise( request ); + } + IAEItemStack checkUse( final IAEItemStack available ) { return this.availableCheck.extractItems( available, Actionable.MODULATE, this.actionSrc ); diff --git a/src/main/java/appeng/crafting/CraftingTreeNode.java b/src/main/java/appeng/crafting/CraftingTreeNode.java index 3f5038515..f8857923e 100644 --- a/src/main/java/appeng/crafting/CraftingTreeNode.java +++ b/src/main/java/appeng/crafting/CraftingTreeNode.java @@ -88,6 +88,35 @@ public class CraftingTreeNode } } + public CraftingTreeNode( final ICraftingGrid cc, final CraftingJob job, final IAEItemStack wat, final CraftingTreeProcess par, final int slot, final int depth, boolean available ) + { + this.what = wat; + this.parent = par; + this.slot = slot; + this.world = job.getWorld(); + this.job = job; + this.sim = false; + + this.canEmit = cc.canEmitFor( this.what ); + + if( this.canEmit ) + { + return; // if you can emit for something, you can't make it with patterns. + } + + if( !available ) + { + for( final ICraftingPatternDetails details : cc.getCraftingFor( this.what, this.parent == null ? null : this.parent.details, slot, this.world ) )// in + // order. + { + if( this.parent == null || this.parent.notRecursive( details ) ) + { + this.nodes.add( new CraftingTreeProcess( cc, job, details, this, depth + 1 ) ); + } + } + } + } + boolean notRecursive( final ICraftingPatternDetails details ) { IAEItemStack[] o = details.getCondensedOutputs(); diff --git a/src/main/java/appeng/crafting/CraftingTreeProcess.java b/src/main/java/appeng/crafting/CraftingTreeProcess.java index 98f8dbc99..1b72eb3e8 100644 --- a/src/main/java/appeng/crafting/CraftingTreeProcess.java +++ b/src/main/java/appeng/crafting/CraftingTreeProcess.java @@ -93,6 +93,7 @@ public class CraftingTreeProcess if( part.getItem().hasContainerItem( part.getDefinition() ) ) { this.limitQty = this.containerItems = true; + break; } } @@ -103,7 +104,16 @@ public class CraftingTreeProcess final IAEItemStack part = list[x]; if( part != null ) { - this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, x, depth + 1 ), part.getStackSize() ); + job.getUsedWhileBuilding().addStorage( part ); + IAEItemStack used = job.getUsedWhileBuilding().findPrecise( part ); + if( job.getOriginal( part ) != null && used.getStackSize() <= job.getOriginal( part ).getStackSize() ) + { + this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, x, depth + 1, true ), part.getStackSize() ); + } + else + { + this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, x, depth + 1 ), part.getStackSize() ); + } } } } @@ -117,8 +127,17 @@ public class CraftingTreeProcess final IAEItemStack comparePart = list[x]; if( part != null && part.equals( comparePart ) ) { - // use the first slot... - this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, x, depth + 1 ), part.getStackSize() ); + job.getUsedWhileBuilding().addStorage( part ); + IAEItemStack used = job.getUsedWhileBuilding().findPrecise( part ); + if( job.getOriginal( part ) != null && used.getStackSize() <= job.getOriginal( part ).getStackSize() ) + { + this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, x, depth + 1, true ), part.getStackSize() ); + } + else + { + // use the first slot... + this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, x, depth + 1 ), part.getStackSize() ); + } break; } }