Fix buggy Processable serialization

This commit is contained in:
Raoul Van den Berge
2016-10-20 21:58:37 +02:00
parent a78ee21329
commit 19b64ee84d
3 changed files with 48 additions and 20 deletions

View File

@@ -35,7 +35,11 @@ public class CraftingTaskFactory implements ICraftingTaskFactory {
List<IProcessable> toProcess = new ArrayList<>();
for (int i = 0; i < toProcessList.tagCount(); ++i) {
toProcess.add(new Processable(pattern, toProcessList.getCompoundTagAt(i)));
Processable processable = new Processable(network);
if (processable.readFromNBT(toProcessList.getCompoundTagAt(i))) {
toProcess.add(processable);
}
}
IItemStackList toTake = RSUtils.readItemStackList(tag.getTagList(CraftingTask.NBT_TO_TAKE, Constants.NBT.TAG_COMPOUND));

View File

@@ -75,10 +75,6 @@ public class CraftingTask implements ICraftingTask {
this.tookFluids = tookFluids;
}
public INetworkMaster getNetwork() {
return network;
}
@Override
public void calculate() {
IItemStackList networkList = network.getItemStorageCache().getList().copy();
@@ -163,7 +159,7 @@ public class CraftingTask implements ICraftingTask {
}
if (pattern.isProcessing()) {
toProcess.add(new Processable(this));
toProcess.add(new Processable(network, pattern));
}
if (missing.isEmpty()) {

View File

@@ -2,27 +2,35 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task;
import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternProvider;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.IProcessable;
import com.raoulvdberge.refinedstorage.api.network.INetworkMaster;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IItemStackList;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.util.Constants;
public class Processable implements IProcessable {
private static final String NBT_SATISFIED = "Satisfied_%d";
private static final String NBT_TO_INSERT = "ToInsert";
private static final String NBT_PATTERN = "Pattern";
private static final String NBT_PATTERN_CONTAINER = "PatternContainer";
private static final String NBT_STARTED_PROCESSING = "StartedProcessing";
private CraftingTask task;
private INetworkMaster network;
private ICraftingPattern pattern;
private IItemStackList toInsert = API.instance().createItemStackList();
private boolean satisfied[];
private boolean startedProcessing;
public Processable(CraftingTask task) {
this.task = task;
this.pattern = task.getPattern();
public Processable(INetworkMaster network, ICraftingPattern pattern) {
this.network = network;
this.pattern = pattern;
this.satisfied = new boolean[pattern.getOutputs().size()];
for (ItemStack input : pattern.getInputs()) {
@@ -32,19 +40,36 @@ public class Processable implements IProcessable {
}
}
public Processable(ICraftingPattern pattern, NBTTagCompound tag) {
this.pattern = pattern;
this.satisfied = new boolean[pattern.getOutputs().size()];
public Processable(INetworkMaster network) {
this.network = network;
}
for (int i = 0; i < satisfied.length; ++i) {
String id = String.format(NBT_SATISFIED, i);
public boolean readFromNBT(NBTTagCompound tag) {
ItemStack patternStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag(NBT_PATTERN));
if (tag.hasKey(id)) {
this.satisfied[i] = tag.getBoolean(id);
if (patternStack != null) {
TileEntity container = network.getNetworkWorld().getTileEntity(BlockPos.fromLong(tag.getLong(NBT_PATTERN_CONTAINER)));
if (container instanceof ICraftingPatternContainer) {
this.pattern = ((ICraftingPatternProvider) patternStack.getItem()).create(network.getNetworkWorld(), patternStack, (ICraftingPatternContainer) container);
this.satisfied = new boolean[pattern.getOutputs().size()];
for (int i = 0; i < satisfied.length; ++i) {
String id = String.format(NBT_SATISFIED, i);
if (tag.hasKey(id)) {
this.satisfied[i] = tag.getBoolean(id);
}
}
this.toInsert = RSUtils.readItemStackList(tag.getTagList(NBT_TO_INSERT, Constants.NBT.TAG_COMPOUND));
this.startedProcessing = tag.getBoolean(NBT_STARTED_PROCESSING);
return true;
}
}
this.toInsert = RSUtils.readItemStackList(tag.getTagList(NBT_TO_INSERT, Constants.NBT.TAG_COMPOUND));
return false;
}
@Override
@@ -107,7 +132,7 @@ public class Processable implements IProcessable {
if (API.instance().getComparer().isEqualNoQuantity(stack, item)) {
satisfied[i] = true;
task.getNetwork().sendCraftingMonitorUpdate();
network.sendCraftingMonitorUpdate();
return true;
}
@@ -124,7 +149,10 @@ public class Processable implements IProcessable {
}
tag.setTag(NBT_TO_INSERT, RSUtils.serializeItemStackList(toInsert));
tag.setTag(NBT_PATTERN, pattern.getStack().serializeNBT());
tag.setLong(NBT_PATTERN_CONTAINER, pattern.getContainer().getPosition().toLong());
tag.setBoolean(NBT_STARTED_PROCESSING, startedProcessing);
return tag;
}
}