Crafting task write.

This commit is contained in:
raoulvdberge
2018-06-18 14:58:41 +02:00
parent b02bcbfdfd
commit 3b73c615a6
8 changed files with 228 additions and 10 deletions

View File

@@ -60,7 +60,7 @@ public interface ICraftingTask {
* @param tag the tag
* @return the written tag
*/
NBTTagCompound writeToNBT(NBTTagCompound tag);
NBTTagCompound writeToNbt(NBTTagCompound tag);
/**
* {@link ICraftingTask#calculate()} must be run before this!

View File

@@ -13,6 +13,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.tile.TileController;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.items.IItemHandlerModifiable;
import javax.annotation.Nonnull;
@@ -20,6 +21,8 @@ import javax.annotation.Nullable;
import java.util.*;
public class CraftingManager implements ICraftingManager {
private static final String NBT_TASKS = "Tasks";
private TileController network;
private Map<String, List<IItemHandlerModifiable>> containerInventories = new LinkedHashMap<>();
@@ -115,6 +118,10 @@ public class CraftingManager implements ICraftingManager {
if (changed || anyFinished) {
onTaskChanged();
}
if (!tasks.isEmpty()) {
network.markDirty();
}
}
}
@@ -122,8 +129,16 @@ public class CraftingManager implements ICraftingManager {
public void readFromNBT(NBTTagCompound tag) {
}
@Override // TODO
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
NBTTagList list = new NBTTagList();
for (ICraftingTask task : tasks.values()) {
list.appendTag(task.writeToNbt(new NBTTagCompound()));
}
tag.setTag(NBT_TASKS, list);
return tag;
}

View File

@@ -1,8 +1,6 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChain;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChainList;
import com.raoulvdberge.refinedstorage.api.autocrafting.*;
import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementList;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
@@ -10,6 +8,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskErrorTy
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTaskError;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.api.util.IStackList;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementColor;
@@ -26,7 +25,10 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step.CraftingSt
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step.CraftingStepProcess;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nullable;
@@ -35,6 +37,15 @@ import java.util.*;
public class CraftingTask implements ICraftingTask {
private static final long CALCULATION_TIMEOUT_MS = 5000;
private static final String NBT_REQUESTED = "Requested";
private static final String NBT_QUANTITY = "Quantity";
private static final String NBT_PATTERN = "Pattern";
private static final String NBT_STEPS = "Steps";
private static final String NBT_INSERTER = "Inserter";
private static final String NBT_TICKS = "Ticks";
private static final String NBT_ID = "Id";
private static final String NBT_MISSING = "Missing";
private INetwork network;
private ItemStack requested;
private int quantity;
@@ -296,11 +307,6 @@ public class CraftingTask implements ICraftingTask {
return size;
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
return tag;
}
@Override
public List<ICraftingMonitorElement> getCraftingMonitorElements() {
ICraftingMonitorElementList elements = API.instance().createCraftingMonitorElementList();
@@ -474,6 +480,32 @@ public class CraftingTask implements ICraftingTask {
return id;
}
@Override
public NBTTagCompound writeToNbt(NBTTagCompound tag) {
tag.setTag(NBT_REQUESTED, requested.serializeNBT());
tag.setInteger(NBT_QUANTITY, quantity);
tag.setTag(NBT_PATTERN, writePatternToNbt(pattern));
tag.setTag(NBT_INSERTER, inserter.writeToNbt());
tag.setInteger(NBT_TICKS, ticks);
tag.setUniqueId(NBT_ID, id);
NBTTagList steps = new NBTTagList();
for (CraftingStep step : this.steps) {
steps.appendTag(step.writeToNbt());
}
tag.setTag(NBT_STEPS, steps);
NBTTagList missing = new NBTTagList();
for (ItemStack missingItem : this.missing.getStacks()) {
missing.appendTag(missingItem.serializeNBT());
}
tag.setTag(NBT_MISSING, missing);
return tag;
}
private int getTickInterval(int speedUpgrades) {
switch (speedUpgrades) {
case 1:
@@ -489,4 +521,33 @@ public class CraftingTask implements ICraftingTask {
return 10;
}
}
private static final String NBT_PATTERN_STACK = "Stack";
private static final String NBT_PATTERN_CONTAINER_POS = "ContainerPos";
public static NBTTagCompound writePatternToNbt(ICraftingPattern pattern) {
NBTTagCompound tag = new NBTTagCompound();
tag.setTag(NBT_PATTERN_STACK, pattern.getStack().serializeNBT());
tag.setLong(NBT_PATTERN_CONTAINER_POS, pattern.getContainer().getPosition().toLong());
return tag;
}
@Nullable
public static ICraftingPattern readPatternFromNbt(NBTTagCompound tag, World world) {
BlockPos containerPos = BlockPos.fromLong(tag.getLong(NBT_PATTERN_CONTAINER_POS));
INetworkNode node = API.instance().getNetworkNodeManager(world).getNode(containerPos);
if (node instanceof ICraftingPatternContainer) {
ItemStack stack = new ItemStack(tag.getCompoundTag(NBT_PATTERN_STACK));
if (stack.getItem() instanceof ICraftingPatternProvider) {
return ((ICraftingPatternProvider) stack.getItem()).create(world, stack, (ICraftingPatternContainer) node);
}
}
return null;
}
}

View File

@@ -2,6 +2,8 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.extractor;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
@@ -10,6 +12,9 @@ import java.util.ArrayList;
import java.util.List;
public class CraftingExtractor {
private static final String NBT_ITEM = "Item";
private static final String NBT_STATUS = "Status";
private INetwork network;
private List<ItemStack> items;
private List<CraftingExtractorItemStatus> status = new ArrayList<>();
@@ -25,6 +30,23 @@ public class CraftingExtractor {
}
}
public CraftingExtractor(INetwork network, NBTTagList tag, boolean processing) {
this.network = network;
this.processing = processing;
this.items = new ArrayList<>();
for (int i = 0; i < tag.tagCount(); ++i) {
NBTTagCompound itemTag = tag.getCompoundTagAt(i);
ItemStack stack = new ItemStack(itemTag.getCompoundTag(NBT_ITEM));
CraftingExtractorItemStatus status = CraftingExtractorItemStatus.values()[itemTag.getInteger(NBT_STATUS)];
this.items.add(stack);
this.status.add(status);
}
}
public List<ItemStack> getItems() {
return items;
}
@@ -104,4 +126,19 @@ public class CraftingExtractor {
}
}
}
public NBTTagList writeToNbt() {
NBTTagList list = new NBTTagList();
for (int i = 0; i < items.size(); ++i) {
NBTTagCompound tag = new NBTTagCompound();
tag.setTag(NBT_ITEM, items.get(i).serializeNBT());
tag.setInteger(NBT_STATUS, status.get(i).ordinal());
list.appendTag(tag);
}
return list;
}
}

View File

@@ -2,12 +2,17 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.inserter;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Deque;
public class CraftingInserter {
private static final String NBT_ITEM = "Item";
private static final String NBT_STATUS = "Status";
private INetwork network;
private Deque<CraftingInserterItem> items = new ArrayDeque<>();
@@ -15,6 +20,19 @@ public class CraftingInserter {
this.network = network;
}
public CraftingInserter(INetwork network, NBTTagList list) {
this(network);
for (int i = 0; i < list.tagCount(); ++i) {
NBTTagCompound itemTag = list.getCompoundTagAt(i);
ItemStack stack = new ItemStack(itemTag.getCompoundTag(NBT_ITEM));
CraftingInserterItemStatus status = CraftingInserterItemStatus.values()[itemTag.getInteger(NBT_STATUS)];
items.push(new CraftingInserterItem(stack, status));
}
}
public void insert(ItemStack stack) {
items.addLast(new CraftingInserterItem(stack, CraftingInserterItemStatus.WAITING));
@@ -57,4 +75,19 @@ public class CraftingInserter {
public Collection<CraftingInserterItem> getItems() {
return items;
}
public NBTTagList writeToNbt() {
NBTTagList list = new NBTTagList();
for (CraftingInserterItem item : items) {
NBTTagCompound tag = new NBTTagCompound();
tag.setTag(NBT_ITEM, item.getStack().serializeNBT());
tag.setInteger(NBT_STATUS, item.getStatus().ordinal());
list.appendTag(tag);
}
return list;
}
}

View File

@@ -1,8 +1,14 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.CraftingTask;
import net.minecraft.nbt.NBTTagCompound;
public abstract class CraftingStep {
private static final String NBT_PATTERN = "Pattern";
private static final String NBT_COMPLETED = "Completed";
private static final String NBT_TYPE = "Type";
protected ICraftingPattern pattern;
private boolean completed;
@@ -25,4 +31,16 @@ public abstract class CraftingStep {
public void setCompleted() {
this.completed = true;
}
public abstract String getType();
public NBTTagCompound writeToNbt() {
NBTTagCompound tag = new NBTTagCompound();
tag.setTag(NBT_PATTERN, CraftingTask.writePatternToNbt(pattern));
tag.setBoolean(NBT_COMPLETED, completed);
tag.setString(NBT_TYPE, getType());
return tag;
}
}

View File

@@ -5,11 +5,16 @@ import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.extractor.CraftingExtractor;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.inserter.CraftingInserter;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.NonNullList;
import java.util.List;
public class CraftingStepCraft extends CraftingStep {
private static final String NBT_EXTRACTOR = "Extractor";
private static final String NBT_TOOK = "Took";
private CraftingInserter inserter;
private CraftingExtractor extractor;
@@ -51,6 +56,28 @@ public class CraftingStepCraft extends CraftingStep {
return allExtracted;
}
@Override
public String getType() {
return "craft";
}
@Override
public NBTTagCompound writeToNbt() {
NBTTagCompound tag = super.writeToNbt();
tag.setTag(NBT_EXTRACTOR, extractor.writeToNbt());
NBTTagList took = new NBTTagList();
for (ItemStack stack : this.took) {
took.appendTag(stack.serializeNBT());
}
tag.setTag(NBT_TOOK, took);
return tag;
}
public CraftingExtractor getExtractor() {
return extractor;
}

View File

@@ -6,10 +6,15 @@ import com.raoulvdberge.refinedstorage.api.util.IStackList;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.extractor.CraftingExtractor;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import java.util.List;
public class CraftingStepProcess extends CraftingStep {
private static final String NBT_EXTRACTOR = "Extractor";
private static final String NBT_TO_RECEIVE = "ToReceive";
private CraftingExtractor extractor;
private IStackList<ItemStack> itemsToReceive = API.instance().createItemStackList();
@@ -60,6 +65,28 @@ public class CraftingStepProcess extends CraftingStep {
return itemsToReceive.isEmpty();
}
@Override
public String getType() {
return "process";
}
@Override
public NBTTagCompound writeToNbt() {
NBTTagCompound tag = super.writeToNbt();
tag.setTag(NBT_EXTRACTOR, extractor.writeToNbt());
NBTTagList toReceive = new NBTTagList();
for (ItemStack toReceiveStack : itemsToReceive.getStacks()) {
toReceive.appendTag(toReceiveStack.serializeNBT());
}
tag.setTag(NBT_TO_RECEIVE, toReceive);
return tag;
}
public CraftingExtractor getExtractor() {
return extractor;
}