Untested crafting task persistence

This commit is contained in:
Raoul Van den Berge
2016-05-08 15:34:23 +02:00
parent 505b316f69
commit 5051ae29a2
6 changed files with 192 additions and 0 deletions

View File

@@ -9,10 +9,12 @@ import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container; import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.ByteBufUtils;
import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageBlocks;
@@ -52,6 +54,8 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
public static final int ENERGY_CAPACITY = 32000; public static final int ENERGY_CAPACITY = 32000;
public static final String NBT_CRAFTING_TASKS = "CraftingTasks";
private List<ItemGroup> itemGroups = new ArrayList<ItemGroup>(); private List<ItemGroup> itemGroups = new ArrayList<ItemGroup>();
private List<IStorage> storages = new ArrayList<IStorage>(); private List<IStorage> storages = new ArrayList<IStorage>();
private List<WirelessGridConsumer> wirelessGridConsumers = new ArrayList<WirelessGridConsumer>(); private List<WirelessGridConsumer> wirelessGridConsumers = new ArrayList<WirelessGridConsumer>();
@@ -502,6 +506,23 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
if (nbt.hasKey(RedstoneMode.NBT)) { if (nbt.hasKey(RedstoneMode.NBT)) {
redstoneMode = RedstoneMode.getById(nbt.getInteger(RedstoneMode.NBT)); redstoneMode = RedstoneMode.getById(nbt.getInteger(RedstoneMode.NBT));
} }
if (nbt.hasKey(NBT_CRAFTING_TASKS)) {
NBTTagList taskList = nbt.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < taskList.tagCount(); ++i) {
NBTTagCompound taskTag = taskList.getCompoundTagAt(i);
switch (taskTag.getInteger("Type")) {
case 0:
addCraftingTask(new BasicCraftingTask(worldObj, taskTag));
break;
case 1:
addCraftingTask(new ProcessingCraftingTask(worldObj, taskTag));
break;
}
}
}
} }
@Override @Override
@@ -509,6 +530,16 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
super.writeToNBT(nbt); super.writeToNBT(nbt);
nbt.setInteger(RedstoneMode.NBT, redstoneMode.id); nbt.setInteger(RedstoneMode.NBT, redstoneMode.id);
NBTTagList list = new NBTTagList();
for (ICraftingTask task : craftingTasks) {
NBTTagCompound taskTag = new NBTTagCompound();
task.writeToNBT(taskTag);
list.appendTag(taskTag);
}
nbt.setTag(NBT_CRAFTING_TASKS, list);
} }
@Override @Override

View File

@@ -1,9 +1,21 @@
package refinedstorage.tile.autocrafting; package refinedstorage.tile.autocrafting;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import refinedstorage.item.ItemPattern;
import refinedstorage.util.InventoryUtils; import refinedstorage.util.InventoryUtils;
public class CraftingPattern { public class CraftingPattern {
public static final String NBT = "Pattern";
public static final String NBT_CRAFTER_X = "CrafterX";
public static final String NBT_CRAFTER_Y = "CrafterY";
public static final String NBT_CRAFTER_Z = "CrafterZ";
private TileCrafter crafter; private TileCrafter crafter;
private boolean processing; private boolean processing;
private ItemStack[] inputs; private ItemStack[] inputs;
@@ -58,4 +70,52 @@ public class CraftingPattern {
return true; return true;
} }
public void writeToNBT(NBTTagCompound tag) {
tag.setBoolean(ItemPattern.NBT_PROCESSING, processing);
NBTTagList inputsTag = new NBTTagList();
for (ItemStack input : inputs) {
inputsTag.appendTag(input.serializeNBT());
}
tag.setTag(ItemPattern.NBT_INPUTS, inputsTag);
NBTTagList outputsTag = new NBTTagList();
for (ItemStack output : outputs) {
outputsTag.appendTag(output.serializeNBT());
}
tag.setTag(ItemPattern.NBT_OUTPUTS, outputsTag);
tag.setInteger(NBT_CRAFTER_X, crafter.getPos().getX());
tag.setInteger(NBT_CRAFTER_Y, crafter.getPos().getY());
tag.setInteger(NBT_CRAFTER_Z, crafter.getPos().getZ());
}
public static CraftingPattern readFromNBT(World world, NBTTagCompound tag) {
int cx = tag.getInteger(NBT_CRAFTER_X);
int cy = tag.getInteger(NBT_CRAFTER_Y);
int cz = tag.getInteger(NBT_CRAFTER_Z);
TileEntity crafter = world.getTileEntity(new BlockPos(cx, cy, cz));
if (crafter instanceof TileCrafter) {
boolean processing = tag.getBoolean(ItemPattern.NBT_PROCESSING);
NBTTagList inputsTag = tag.getTagList(ItemPattern.NBT_INPUTS, Constants.NBT.TAG_COMPOUND);
ItemStack inputs[] = new ItemStack[inputsTag.tagCount()];
for (int i = 0; i < inputsTag.tagCount(); ++i) {
inputs[i] = ItemStack.loadItemStackFromNBT(inputsTag.getCompoundTagAt(i));
}
NBTTagList outputsTag = tag.getTagList(ItemPattern.NBT_OUTPUTS, Constants.NBT.TAG_COMPOUND);
ItemStack outputs[] = new ItemStack[outputsTag.tagCount()];
for (int i = 0; i < outputsTag.tagCount(); ++i) {
outputs[i] = ItemStack.loadItemStackFromNBT(outputsTag.getCompoundTagAt(i));
}
return new CraftingPattern((TileCrafter) crafter, processing, inputs, outputs);
}
return null;
}
} }

View File

@@ -1,14 +1,25 @@
package refinedstorage.tile.autocrafting.task; package refinedstorage.tile.autocrafting.task;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import refinedstorage.tile.TileController; import refinedstorage.tile.TileController;
import refinedstorage.tile.autocrafting.CraftingPattern; import refinedstorage.tile.autocrafting.CraftingPattern;
import refinedstorage.util.NBTUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class BasicCraftingTask implements ICraftingTask { public class BasicCraftingTask implements ICraftingTask {
public static final int ID = 0;
public static final String NBT_SATISFIED = "Satisfied";
public static final String NBT_CHECKED = "Checked";
public static final String NBT_CHILD_TASKS = "ChildTasks";
public static final String NBT_TOOK = "Took";
private CraftingPattern pattern; private CraftingPattern pattern;
private boolean satisfied[]; private boolean satisfied[];
private boolean checked[]; private boolean checked[];
@@ -22,6 +33,13 @@ public class BasicCraftingTask implements ICraftingTask {
this.childTasks = new boolean[pattern.getInputs().length]; this.childTasks = new boolean[pattern.getInputs().length];
} }
public BasicCraftingTask(World world, NBTTagCompound tag) {
this.pattern = CraftingPattern.readFromNBT(world, tag.getCompoundTag(CraftingPattern.NBT));
this.satisfied = NBTUtils.readBoolArray(tag, NBT_SATISFIED);
this.checked = NBTUtils.readBoolArray(tag, NBT_CHECKED);
this.childTasks = NBTUtils.readBoolArray(tag, NBT_CHILD_TASKS);
}
public CraftingPattern getPattern() { public CraftingPattern getPattern() {
return pattern; return pattern;
} }
@@ -76,6 +94,27 @@ public class BasicCraftingTask implements ICraftingTask {
} }
} }
@Override
public void writeToNBT(NBTTagCompound tag) {
NBTTagCompound patternTag = new NBTTagCompound();
pattern.writeToNBT(patternTag);
tag.setTag(CraftingPattern.NBT, patternTag);
NBTUtils.writeBoolArray(tag, NBT_SATISFIED, satisfied);
NBTUtils.writeBoolArray(tag, NBT_CHECKED, checked);
NBTUtils.writeBoolArray(tag, NBT_CHILD_TASKS, childTasks);
NBTTagList tookList = new NBTTagList();
for (ItemStack took : itemsTook) {
tookList.appendTag(took.serializeNBT());
}
tag.setTag(NBT_TOOK, tookList);
tag.setInteger("Type", ID);
}
@Override @Override
public String getInfo() { public String getInfo() {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();

View File

@@ -1,5 +1,6 @@
package refinedstorage.tile.autocrafting.task; package refinedstorage.tile.autocrafting.task;
import net.minecraft.nbt.NBTTagCompound;
import refinedstorage.tile.TileController; import refinedstorage.tile.TileController;
import refinedstorage.tile.autocrafting.CraftingPattern; import refinedstorage.tile.autocrafting.CraftingPattern;
@@ -12,5 +13,7 @@ public interface ICraftingTask {
void onCancelled(TileController controller); void onCancelled(TileController controller);
void writeToNBT(NBTTagCompound tag);
String getInfo(); String getInfo();
} }

View File

@@ -2,15 +2,24 @@ package refinedstorage.tile.autocrafting.task;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityHopper; import net.minecraft.tileentity.TileEntityHopper;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import refinedstorage.tile.TileController; import refinedstorage.tile.TileController;
import refinedstorage.tile.autocrafting.CraftingPattern; import refinedstorage.tile.autocrafting.CraftingPattern;
import refinedstorage.tile.autocrafting.TileCrafter; import refinedstorage.tile.autocrafting.TileCrafter;
import refinedstorage.util.InventoryUtils; import refinedstorage.util.InventoryUtils;
import refinedstorage.util.NBTUtils;
public class ProcessingCraftingTask implements ICraftingTask { public class ProcessingCraftingTask implements ICraftingTask {
public static final int ID = 1;
public static final String NBT_INSERTED = "Inserted";
public static final String NBT_MISSING = "Missing";
public static final String NBT_SATISFIED = "Satisfied";
private CraftingPattern pattern; private CraftingPattern pattern;
private boolean inserted[]; private boolean inserted[];
private boolean missing[]; private boolean missing[];
@@ -23,6 +32,13 @@ public class ProcessingCraftingTask implements ICraftingTask {
this.satisfied = new boolean[pattern.getOutputs().length]; this.satisfied = new boolean[pattern.getOutputs().length];
} }
public ProcessingCraftingTask(World world, NBTTagCompound tag) {
this.pattern = CraftingPattern.readFromNBT(world, tag.getCompoundTag(CraftingPattern.NBT));
this.inserted = NBTUtils.readBoolArray(tag, NBT_INSERTED);
this.missing = NBTUtils.readBoolArray(tag, NBT_MISSING);
this.satisfied = NBTUtils.readBoolArray(tag, NBT_SATISFIED);
}
@Override @Override
public CraftingPattern getPattern() { public CraftingPattern getPattern() {
return pattern; return pattern;
@@ -89,6 +105,19 @@ public class ProcessingCraftingTask implements ICraftingTask {
// NO OP // NO OP
} }
@Override
public void writeToNBT(NBTTagCompound tag) {
NBTTagCompound patternTag = new NBTTagCompound();
pattern.writeToNBT(patternTag);
tag.setTag(CraftingPattern.NBT, patternTag);
NBTUtils.writeBoolArray(tag, NBT_INSERTED, satisfied);
NBTUtils.writeBoolArray(tag, NBT_MISSING, missing);
NBTUtils.writeBoolArray(tag, NBT_SATISFIED, satisfied);
tag.setInteger("Type", ID);
}
@Override @Override
public String getInfo() { public String getInfo() {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();

View File

@@ -0,0 +1,30 @@
package refinedstorage.util;
import net.minecraft.nbt.NBTTagByte;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.common.util.Constants;
public class NBTUtils {
public static void writeBoolArray(NBTTagCompound tag, String name, boolean[] arr) {
NBTTagList list = new NBTTagList();
for (int i = 0; i < arr.length; ++i) {
list.appendTag(new NBTTagByte(arr[i] ? (byte) 1 : (byte) 0));
}
tag.setTag(name, list);
}
public static boolean[] readBoolArray(NBTTagCompound tag, String name) {
NBTTagList list = tag.getTagList(name, Constants.NBT.TAG_COMPOUND);
boolean[] arr = new boolean[list.tagCount()];
for (int i = 0; i < arr.length; ++i) {
arr[i] = ((NBTTagByte) list.get(i)).getByte() == 1 ? true : false;
}
return arr;
}
}