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<>(); List<IProcessable> toProcess = new ArrayList<>();
for (int i = 0; i < toProcessList.tagCount(); ++i) { 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)); 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; this.tookFluids = tookFluids;
} }
public INetworkMaster getNetwork() {
return network;
}
@Override @Override
public void calculate() { public void calculate() {
IItemStackList networkList = network.getItemStorageCache().getList().copy(); IItemStackList networkList = network.getItemStorageCache().getList().copy();
@@ -163,7 +159,7 @@ public class CraftingTask implements ICraftingTask {
} }
if (pattern.isProcessing()) { if (pattern.isProcessing()) {
toProcess.add(new Processable(this)); toProcess.add(new Processable(network, pattern));
} }
if (missing.isEmpty()) { 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.RSUtils;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; 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.autocrafting.task.IProcessable;
import com.raoulvdberge.refinedstorage.api.network.INetworkMaster;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IItemStackList; import com.raoulvdberge.refinedstorage.api.util.IItemStackList;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
public class Processable implements IProcessable { public class Processable implements IProcessable {
private static final String NBT_SATISFIED = "Satisfied_%d"; private static final String NBT_SATISFIED = "Satisfied_%d";
private static final String NBT_TO_INSERT = "ToInsert"; 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 ICraftingPattern pattern;
private IItemStackList toInsert = API.instance().createItemStackList(); private IItemStackList toInsert = API.instance().createItemStackList();
private boolean satisfied[]; private boolean satisfied[];
private boolean startedProcessing; private boolean startedProcessing;
public Processable(CraftingTask task) { public Processable(INetworkMaster network, ICraftingPattern pattern) {
this.task = task; this.network = network;
this.pattern = task.getPattern(); this.pattern = pattern;
this.satisfied = new boolean[pattern.getOutputs().size()]; this.satisfied = new boolean[pattern.getOutputs().size()];
for (ItemStack input : pattern.getInputs()) { for (ItemStack input : pattern.getInputs()) {
@@ -32,19 +40,36 @@ public class Processable implements IProcessable {
} }
} }
public Processable(ICraftingPattern pattern, NBTTagCompound tag) { public Processable(INetworkMaster network) {
this.pattern = pattern; this.network = network;
this.satisfied = new boolean[pattern.getOutputs().size()]; }
for (int i = 0; i < satisfied.length; ++i) { public boolean readFromNBT(NBTTagCompound tag) {
String id = String.format(NBT_SATISFIED, i); ItemStack patternStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag(NBT_PATTERN));
if (tag.hasKey(id)) { if (patternStack != null) {
this.satisfied[i] = tag.getBoolean(id); 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 @Override
@@ -107,7 +132,7 @@ public class Processable implements IProcessable {
if (API.instance().getComparer().isEqualNoQuantity(stack, item)) { if (API.instance().getComparer().isEqualNoQuantity(stack, item)) {
satisfied[i] = true; satisfied[i] = true;
task.getNetwork().sendCraftingMonitorUpdate(); network.sendCraftingMonitorUpdate();
return true; return true;
} }
@@ -124,7 +149,10 @@ public class Processable implements IProcessable {
} }
tag.setTag(NBT_TO_INSERT, RSUtils.serializeItemStackList(toInsert)); 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; return tag;
} }
} }