Merge branch 'autocrafting-containeritem-fix' into AE2-Omnifactory
This commit is contained in:
@@ -32,13 +32,14 @@ import appeng.core.sync.network.NetworkHandler;
|
|||||||
import appeng.core.sync.packets.PacketInformPlayer;
|
import appeng.core.sync.packets.PacketInformPlayer;
|
||||||
import appeng.me.cluster.implementations.CraftingCPUCluster;
|
import appeng.me.cluster.implementations.CraftingCPUCluster;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.fml.common.Optional;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class CraftingTreeNode {
|
public class CraftingTreeNode {
|
||||||
@@ -111,14 +112,16 @@ public class CraftingTreeNode {
|
|||||||
this.what.setStackSize(l);
|
this.what.setStackSize(l);
|
||||||
|
|
||||||
if (this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable()) {
|
if (this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable()) {
|
||||||
Collection<IAEItemStack> itemList = new ArrayList<>();
|
LinkedList<IAEItemStack> itemList = new LinkedList<>();
|
||||||
|
|
||||||
boolean damageableItem = this.what.getItem().isDamageable() || Platform.isGTDamageableItem(this.what.getItem());
|
boolean damageableItem = this.what.getItem().isDamageable() || Platform.isGTDamageableItem(this.what.getItem());
|
||||||
|
|
||||||
if (this.parent.details.canSubstitute()) {
|
if (this.parent.details.canSubstitute()) {
|
||||||
for (IAEItemStack subs : this.parent.details.getSubstituteInputs(this.slot)) {
|
for (IAEItemStack subs : this.parent.details.getSubstituteInputs(this.slot)) {
|
||||||
if (damageableItem) {
|
if (damageableItem) {
|
||||||
itemList.addAll(inventoryList.findFuzzy(subs, FuzzyMode.IGNORE_ALL));
|
for (IAEItemStack i : inventoryList.findFuzzy(subs, FuzzyMode.IGNORE_ALL)) {
|
||||||
|
itemList.add(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
subs = inventoryList.findPrecise(subs);
|
subs = inventoryList.findPrecise(subs);
|
||||||
if (subs != null) {
|
if (subs != null) {
|
||||||
@@ -127,7 +130,9 @@ public class CraftingTreeNode {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (damageableItem) {
|
if (damageableItem) {
|
||||||
itemList.addAll(inventoryList.findFuzzy(this.what, FuzzyMode.IGNORE_ALL));
|
for (IAEItemStack i : inventoryList.findFuzzy(this.what, FuzzyMode.IGNORE_ALL)) {
|
||||||
|
itemList.add(i);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
final IAEItemStack item = inventoryList.findPrecise(this.what);
|
final IAEItemStack item = inventoryList.findPrecise(this.what);
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
@@ -137,13 +142,25 @@ public class CraftingTreeNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (IAEItemStack fuzz : itemList) {
|
for (IAEItemStack fuzz : itemList) {
|
||||||
if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.copy().getCachedItemStack(1), this.world)) {
|
if (fuzz.getStackSize() == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (this.parent.details.isValidItemForSlot(this.getSlot(), fuzz.getDefinition(), this.world)) {
|
||||||
fuzz = fuzz.copy();
|
fuzz = fuzz.copy();
|
||||||
fuzz.setStackSize(l);
|
fuzz.setStackSize(l);
|
||||||
|
|
||||||
final IAEItemStack available = inv.extractItems(fuzz, Actionable.MODULATE, src);
|
final IAEItemStack available = inv.extractItems(fuzz, Actionable.MODULATE, src);
|
||||||
|
|
||||||
if (available != null) {
|
if (available != null) {
|
||||||
|
if (available.getItem().hasContainerItem(available.getDefinition())) {
|
||||||
|
final ItemStack is2 = Platform.getContainerItem(available.createItemStack());
|
||||||
|
final IAEItemStack o = AEItemStack.fromItemStack(is2);
|
||||||
|
|
||||||
|
if (o != null) {
|
||||||
|
this.parent.addContainers(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!this.exhausted) {
|
if (!this.exhausted) {
|
||||||
final IAEItemStack is = this.job.checkUse(available);
|
final IAEItemStack is = this.job.checkUse(available);
|
||||||
|
|
||||||
@@ -197,6 +214,16 @@ public class CraftingTreeNode {
|
|||||||
final IAEItemStack available = inv.extractItems(madeWhat, Actionable.MODULATE, src);
|
final IAEItemStack available = inv.extractItems(madeWhat, Actionable.MODULATE, src);
|
||||||
|
|
||||||
if (available != null) {
|
if (available != null) {
|
||||||
|
|
||||||
|
if (parent != null && available.getItem().hasContainerItem(available.getDefinition())) {
|
||||||
|
final ItemStack is2 = Platform.getContainerItem(available.createItemStack());
|
||||||
|
final IAEItemStack o = AEItemStack.fromItemStack(is2);
|
||||||
|
|
||||||
|
if (o != null) {
|
||||||
|
this.parent.addContainers(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.bytes += available.getStackSize();
|
this.bytes += available.getStackSize();
|
||||||
l -= available.getStackSize();
|
l -= available.getStackSize();
|
||||||
|
|
||||||
@@ -240,6 +267,14 @@ public class CraftingTreeNode {
|
|||||||
|
|
||||||
if (job.isSimulation()) {
|
if (job.isSimulation()) {
|
||||||
this.bytes += l;
|
this.bytes += l;
|
||||||
|
if (parent != null && this.what.getItem().hasContainerItem(this.what.getDefinition())) {
|
||||||
|
final ItemStack is2 = Platform.getContainerItem(this.what.copy().setStackSize(1).createItemStack());
|
||||||
|
final IAEItemStack o = AEItemStack.fromItemStack(is2);
|
||||||
|
|
||||||
|
if (o != null) {
|
||||||
|
this.parent.addContainers(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
this.missing += l;
|
this.missing += l;
|
||||||
final IAEItemStack rv = this.what.copy();
|
final IAEItemStack rv = this.what.copy();
|
||||||
rv.setStackSize(l);
|
rv.setStackSize(l);
|
||||||
|
|||||||
@@ -27,15 +27,11 @@ import appeng.api.storage.data.IAEItemStack;
|
|||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
import appeng.core.AEConfig;
|
import appeng.core.AEConfig;
|
||||||
import appeng.me.cluster.implementations.CraftingCPUCluster;
|
import appeng.me.cluster.implementations.CraftingCPUCluster;
|
||||||
import appeng.util.Platform;
|
|
||||||
import appeng.util.item.AEItemStack;
|
|
||||||
import com.google.common.collect.ImmutableCollection;
|
import com.google.common.collect.ImmutableCollection;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2LongArrayMap;
|
import it.unimi.dsi.fastutil.objects.Object2LongArrayMap;
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
|
||||||
@@ -50,6 +46,7 @@ public class CraftingTreeProcess {
|
|||||||
boolean possible = true;
|
boolean possible = true;
|
||||||
private long crafts = 0;
|
private long crafts = 0;
|
||||||
private long bytes = 0;
|
private long bytes = 0;
|
||||||
|
private ArrayList<IAEItemStack> containers;
|
||||||
|
|
||||||
public CraftingTreeProcess(final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth) {
|
public CraftingTreeProcess(final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth) {
|
||||||
this.parent = craftingTreeNode;
|
this.parent = craftingTreeNode;
|
||||||
@@ -198,32 +195,18 @@ public class CraftingTreeProcess {
|
|||||||
void request(final MECraftingInventory inv, final long amountOfTimes, final IActionSource src) throws CraftBranchFailure, InterruptedException {
|
void request(final MECraftingInventory inv, final long amountOfTimes, final IActionSource src) throws CraftBranchFailure, InterruptedException {
|
||||||
addProcess();
|
addProcess();
|
||||||
this.job.handlePausing();
|
this.job.handlePausing();
|
||||||
List<IAEItemStack> containerItems = null;
|
|
||||||
|
|
||||||
// request and remove inputs...
|
// request and remove inputs...
|
||||||
for (final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet()) {
|
for (final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet()) {
|
||||||
final IAEItemStack stack = entry.getKey().request(inv, entry.getValue() * amountOfTimes, src);
|
final IAEItemStack stack = entry.getKey().request(inv, entry.getValue() * amountOfTimes, src);
|
||||||
|
|
||||||
if (this.details.isCraftable() && stack.getItem().hasContainerItem(stack.getDefinition())) {
|
|
||||||
final ItemStack is = Platform.getContainerItem(stack.createItemStack());
|
|
||||||
final IAEItemStack o = AEItemStack.fromItemStack(is);
|
|
||||||
if (o != null) {
|
|
||||||
if (containerItems == null) {
|
|
||||||
containerItems = new ArrayList<>();
|
|
||||||
}
|
|
||||||
this.bytes++;
|
|
||||||
o.setCachedItemStack(is);
|
|
||||||
containerItems.add(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (containerItems != null) {
|
if (this.containers != null) {
|
||||||
for (IAEItemStack i : containerItems) {
|
for (IAEItemStack iae : containers) {
|
||||||
inv.injectItems(i, Actionable.MODULATE, src);
|
inv.injectItems(iae, Actionable.MODULATE, src);
|
||||||
}
|
}
|
||||||
|
containers = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// assume its possible.
|
// assume its possible.
|
||||||
|
|
||||||
// add crafting results..
|
// add crafting results..
|
||||||
@@ -235,6 +218,13 @@ public class CraftingTreeProcess {
|
|||||||
this.crafts += amountOfTimes;
|
this.crafts += amountOfTimes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addContainers(IAEItemStack container) {
|
||||||
|
if (this.containers == null) {
|
||||||
|
this.containers = new ArrayList<>();
|
||||||
|
}
|
||||||
|
this.containers.add(container);
|
||||||
|
}
|
||||||
|
|
||||||
void dive(final CraftingJob job) {
|
void dive(final CraftingJob job) {
|
||||||
job.addTask(this.getAmountCrafted(this.parent.getStack(1)), this.crafts, this.details, this.depth);
|
job.addTask(this.getAmountCrafted(this.parent.getStack(1)), this.crafts, this.details, this.depth);
|
||||||
for (final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet()) {
|
for (final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet()) {
|
||||||
|
|||||||
@@ -74,13 +74,11 @@ public class MultiCraftingTracker {
|
|||||||
|
|
||||||
public boolean handleCrafting(final int x, final long itemToCraft, final IAEItemStack ais, final InventoryAdaptor d, final World w, final IGrid g, final ICraftingGrid cg, final IActionSource mySrc) {
|
public boolean handleCrafting(final int x, final long itemToCraft, final IAEItemStack ais, final InventoryAdaptor d, final World w, final IGrid g, final ICraftingGrid cg, final IActionSource mySrc) {
|
||||||
if (ais != null) {
|
if (ais != null) {
|
||||||
ItemStack inputStack = ais.getCachedItemStack(ais.getStackSize());
|
ItemStack inputStack = ais.createItemStack();
|
||||||
|
|
||||||
ItemStack remaining = d.simulateAdd(inputStack);
|
ItemStack remaining = d.simulateAdd(inputStack);
|
||||||
|
|
||||||
if (remaining.isEmpty()) {
|
if (remaining.isEmpty()) {
|
||||||
ais.setCachedItemStack(inputStack);
|
|
||||||
|
|
||||||
final Future<ICraftingJob> craftingJob = this.getJob(x);
|
final Future<ICraftingJob> craftingJob = this.getJob(x);
|
||||||
|
|
||||||
if (this.getLink(x) != null) {
|
if (this.getLink(x) != null) {
|
||||||
@@ -117,8 +115,6 @@ public class MultiCraftingTracker {
|
|||||||
this.setJob(x, cg.beginCraftingJob(w, g, mySrc, aisC, null));
|
this.setJob(x, cg.beginCraftingJob(w, g, mySrc, aisC, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
ais.setCachedItemStack(remaining);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user