Refactor. Processing patterns are broken.

This commit is contained in:
Raoul Van den Berge
2016-09-02 22:37:53 +02:00
parent 85856a4eeb
commit 654078eef4
20 changed files with 187 additions and 353 deletions

View File

@@ -1,38 +1,37 @@
package refinedstorage.api.autocrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import java.util.List;
/**
* Represents a crafting pattern.
*/
public interface ICraftingPattern {
/**
* @param world The world
* @return The container where the pattern is in
*/
ICraftingPatternContainer getContainer(World world);
ICraftingPatternContainer getContainer();
/**
* @return The crafting pattern stack
*/
ItemStack getStack();
/**
* @return Whether the crafting pattern is valid
*/
boolean isValid();
/**
* @return The inputs
*/
ItemStack[] getInputs();
List<ItemStack> getInputs();
/**
* @return The outputs
*/
ItemStack[] getOutputs();
/**
* @return The byproducts
*/
ItemStack[] getByproducts();
List<ItemStack> getOutputs();
/**
* @return The id of the crafting task, as defined in the registry
@@ -44,12 +43,4 @@ public interface ICraftingPattern {
* @return The quantity returned per request
*/
int getQuantityPerRequest(ItemStack requested);
/**
* Writes this pattern to NBT.
*
* @param tag The NBT tag to write to
* @return The written NBT tag
*/
NBTTagCompound writeToNBT(NBTTagCompound tag);
}

View File

@@ -1,8 +1,7 @@
package refinedstorage.api.autocrafting;
import net.minecraft.item.ItemStack;
import javax.annotation.Nullable;
import net.minecraft.world.World;
/**
* Implement this interface on pattern items.
@@ -12,18 +11,10 @@ public interface ICraftingPatternProvider {
/**
* Creates a crafting pattern.
*
* @param world The world
* @param stack The pattern stack
* @param container The container where the pattern is in
* @return The crafting pattern
*/
ICraftingPattern create(ItemStack stack, ICraftingPatternContainer container);
/**
* Creates a crafting pattern from the pattern item stack.
*
* @param stack The item stack
* @return The crafting pattern, or null if the read failed
*/
@Nullable
ICraftingPattern create(ItemStack stack);
ICraftingPattern create(World world, ItemStack stack, ICraftingPatternContainer container);
}

View File

@@ -1,6 +1,7 @@
package refinedstorage.api.autocrafting.registry;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.task.ICraftingTask;
@@ -15,9 +16,10 @@ public interface ICraftingTaskFactory {
* Returns a crafting task for a given NBT tag and pattern.
*
* @param tag The NBT tag. If this is null it isn't reading from disk but is used for making a task on demand
* @param world The world
* @param pattern The pattern
* @return The crafting task
*/
@Nonnull
ICraftingTask create(@Nullable NBTTagCompound tag, ICraftingPattern pattern);
ICraftingTask create(@Nullable NBTTagCompound tag, World world, ICraftingPattern pattern);
}

View File

@@ -4,6 +4,7 @@ import cofh.api.energy.EnergyStorage;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.task.ICraftingTask;
@@ -83,14 +84,6 @@ public interface INetworkMaster {
*/
void addCraftingTask(@Nonnull ICraftingTask task);
/**
* Creates a crafting task from a {@link ICraftingPattern}.
*
* @param pattern The pattern to create a task for
* @return A task
*/
ICraftingTask createCraftingTask(@Nonnull ICraftingPattern pattern);
/**
* Cancels a crafting task.
*
@@ -209,4 +202,9 @@ public interface INetworkMaster {
*/
@Nullable
FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags);
/**
* @return The world where this node is in
*/
World getNetworkWorld();
}

View File

@@ -6,6 +6,7 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import refinedstorage.api.RefinedStorageAPI;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.task.ICraftingTask;
import refinedstorage.api.storage.CompareUtils;
@@ -26,6 +27,10 @@ public final class NetworkUtils {
return network.getPattern(stack, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT);
}
public static ICraftingTask createCraftingTask(INetworkMaster network, ICraftingPattern pattern) {
return RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(pattern.getId()).create(null, network.getNetworkWorld(), pattern);
}
public static boolean hasPattern(INetworkMaster network, ItemStack stack) {
return getPattern(network, stack) != null;
}
@@ -57,7 +62,7 @@ public final class NetworkUtils {
ICraftingPattern pattern = network.getPattern(stack, compare);
if (pattern != null) {
network.addCraftingTask(network.createCraftingTask(pattern));
network.addCraftingTask(createCraftingTask(network, pattern));
}
}
}

View File

@@ -1,47 +1,62 @@
package refinedstorage.apiimpl.autocrafting;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.ICraftingPatternContainer;
import refinedstorage.api.storage.CompareUtils;
import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactoryNormal;
import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactoryProcessing;
import refinedstorage.item.ItemPattern;
import refinedstorage.tile.TileCrafter;
import java.util.ArrayList;
import java.util.List;
public class CraftingPattern implements ICraftingPattern {
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 ICraftingPatternContainer container;
private ItemStack stack;
private BlockPos crafterPos;
private TileCrafter crafter;
private boolean processing;
private ItemStack[] inputs;
private ItemStack[] outputs;
private ItemStack[] byproducts;
private List<ItemStack> inputs = new ArrayList<>();
private List<ItemStack> outputs = new ArrayList<>();
private boolean processing = false;
public CraftingPattern(ItemStack stack, BlockPos crafterPos, boolean processing, ItemStack[] inputs, ItemStack[] outputs, ItemStack[] byproducts) {
public CraftingPattern(World world, ICraftingPatternContainer container, ItemStack stack) {
this.container = container;
this.stack = stack;
this.crafterPos = crafterPos;
this.processing = processing;
this.inputs = inputs;
this.outputs = outputs;
this.byproducts = byproducts;
InventoryCrafting dummyInventory = new InventoryCrafting(new Container() {
@Override
public boolean canInteractWith(EntityPlayer player) {
return false;
}
}, 3, 3);
for (int i = 0; i < 9; ++i) {
ItemStack slot = ItemPattern.getSlot(stack, i);
if (slot != null) {
for (int j = 0; j < slot.stackSize; ++j) {
inputs.add(ItemHandlerHelper.copyStackWithSize(slot, 1));
}
dummyInventory.setInventorySlotContents(i, slot);
}
}
ItemStack output = CraftingManager.getInstance().findMatchingRecipe(dummyInventory, world);
if (output != null) {
outputs.add(output);
}
}
@Override
public ICraftingPatternContainer getContainer(World world) {
if (crafter == null) {
crafter = (TileCrafter) world.getTileEntity(crafterPos);
}
return crafter;
public ICraftingPatternContainer getContainer() {
return container;
}
@Override
@@ -50,20 +65,20 @@ public class CraftingPattern implements ICraftingPattern {
}
@Override
public ItemStack[] getInputs() {
public boolean isValid() {
return !inputs.isEmpty() && !outputs.isEmpty();
}
@Override
public List<ItemStack> getInputs() {
return inputs;
}
@Override
public ItemStack[] getOutputs() {
public List<ItemStack> getOutputs() {
return outputs;
}
@Override
public ItemStack[] getByproducts() {
return byproducts;
}
@Override
public String getId() {
return processing ? CraftingTaskFactoryProcessing.ID : CraftingTaskFactoryNormal.ID;
@@ -85,41 +100,4 @@ public class CraftingPattern implements ICraftingPattern {
return quantity;
}
@Override
public NBTTagCompound 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);
if (byproducts != null) {
NBTTagList byproductsTag = new NBTTagList();
for (ItemStack byproduct : byproducts) {
byproductsTag.appendTag(byproduct.serializeNBT());
}
tag.setTag(ItemPattern.NBT_BYPRODUCTS, byproductsTag);
}
tag.setInteger(NBT_CRAFTER_X, crafterPos.getX());
tag.setInteger(NBT_CRAFTER_Y, crafterPos.getY());
tag.setInteger(NBT_CRAFTER_Z, crafterPos.getZ());
return tag;
}
}

View File

@@ -3,6 +3,7 @@ package refinedstorage.apiimpl.autocrafting.registry;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.registry.ICraftingTaskFactory;
@@ -20,7 +21,7 @@ public class CraftingTaskFactoryNormal implements ICraftingTaskFactory {
@Override
@Nonnull
public ICraftingTask create(@Nullable NBTTagCompound tag, ICraftingPattern pattern) {
public ICraftingTask create(@Nullable NBTTagCompound tag, World world, ICraftingPattern pattern) {
CraftingTaskNormal task = new CraftingTaskNormal(pattern);
if (tag != null) {
@@ -42,7 +43,7 @@ public class CraftingTaskFactoryNormal implements ICraftingTaskFactory {
task.setTook(took);
task.readChildNBT(tag);
task.readChildNBT(world, tag);
}
return task;

View File

@@ -3,6 +3,7 @@ package refinedstorage.apiimpl.autocrafting.registry;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.registry.ICraftingTaskFactory;
@@ -20,7 +21,7 @@ public class CraftingTaskFactoryProcessing implements ICraftingTaskFactory {
@Override
@Nonnull
public ICraftingTask create(@Nullable NBTTagCompound tag, ICraftingPattern pattern) {
public ICraftingTask create(@Nullable NBTTagCompound tag, World world, ICraftingPattern pattern) {
CraftingTaskProcessing task = new CraftingTaskProcessing(pattern);
if (tag != null) {
@@ -43,7 +44,7 @@ public class CraftingTaskFactoryProcessing implements ICraftingTaskFactory {
task.setTook(took);
task.readChildNBT(tag);
task.readChildNBT(world, tag);
}
return task;

View File

@@ -4,6 +4,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagIntArray;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.task.ICraftingTask;
import refinedstorage.api.network.INetworkMaster;
@@ -27,7 +28,7 @@ public abstract class CraftingTask implements ICraftingTask {
public CraftingTask(ICraftingPattern pattern) {
this.pattern = pattern;
this.childrenCreated = new boolean[pattern.getInputs().length];
this.childrenCreated = new boolean[pattern.getInputs().size()];
}
@Override
@@ -45,10 +46,10 @@ public abstract class CraftingTask implements ICraftingTask {
protected void tryCreateChild(INetworkMaster network, int i) {
if (!childrenCreated[i]) {
ICraftingPattern pattern = NetworkUtils.getPattern(network, this.pattern.getInputs()[i]);
ICraftingPattern pattern = NetworkUtils.getPattern(network, this.pattern.getInputs().get(i));
if (pattern != null) {
child = network.createCraftingTask(pattern);
child = NetworkUtils.createCraftingTask(network, pattern);
childrenCreated[i] = true;
@@ -99,9 +100,9 @@ public abstract class CraftingTask implements ICraftingTask {
return tag;
}
public void readChildNBT(NBTTagCompound tag) {
public void readChildNBT(World world, NBTTagCompound tag) {
if (tag.hasKey(NBT_CHILD)) {
child = TileController.readCraftingTask(tag.getCompoundTag(NBT_CHILD));
child = TileController.readCraftingTask(world, tag.getCompoundTag(NBT_CHILD));
}
}

View File

@@ -17,8 +17,8 @@ public class CraftingTaskNormal extends CraftingTask {
public CraftingTaskNormal(ICraftingPattern pattern) {
super(pattern);
this.satisfied = new boolean[pattern.getInputs().length];
this.checked = new boolean[pattern.getInputs().length];
this.satisfied = new boolean[pattern.getInputs().size()];
this.checked = new boolean[pattern.getInputs().size()];
}
public void setSatisfied(boolean[] satisfied) {
@@ -31,10 +31,10 @@ public class CraftingTaskNormal extends CraftingTask {
@Override
public boolean update(World world, INetworkMaster network) {
for (int i = 0; i < pattern.getInputs().length; ++i) {
for (int i = 0; i < pattern.getInputs().size(); ++i) {
checked[i] = true;
ItemStack input = pattern.getInputs()[i];
ItemStack input = pattern.getInputs().get(i);
if (!satisfied[i]) {
ItemStack received = NetworkUtils.extractItem(network, input, input.stackSize);
@@ -64,13 +64,6 @@ public class CraftingTaskNormal extends CraftingTask {
network.insertItem(output, output.stackSize, false);
}
if (pattern.getByproducts() != null) {
for (ItemStack byproduct : pattern.getByproducts()) {
// @TODO: Handle remainder
network.insertItem(byproduct, byproduct.stackSize, false);
}
}
return true;
}
@@ -90,8 +83,8 @@ public class CraftingTaskNormal extends CraftingTask {
boolean missingItems = false;
for (int i = 0; i < pattern.getInputs().length; ++i) {
ItemStack input = pattern.getInputs()[i];
for (int i = 0; i < pattern.getInputs().size(); ++i) {
ItemStack input = pattern.getInputs().get(i);
if (!satisfied[i] && !childrenCreated[i] && checked[i]) {
if (!missingItems) {
@@ -106,8 +99,8 @@ public class CraftingTaskNormal extends CraftingTask {
boolean itemsCrafting = false;
for (int i = 0; i < pattern.getInputs().length; ++i) {
ItemStack input = pattern.getInputs()[i];
for (int i = 0; i < pattern.getInputs().size(); ++i) {
ItemStack input = pattern.getInputs().get(i);
if (!satisfied[i] && childrenCreated[i] && checked[i]) {
if (!itemsCrafting) {

View File

@@ -22,9 +22,9 @@ public class CraftingTaskProcessing extends CraftingTask {
public CraftingTaskProcessing(ICraftingPattern pattern) {
super(pattern);
this.satisfied = new boolean[pattern.getInputs().length];
this.satisfiedInsertion = new boolean[pattern.getInputs().length];
this.checked = new boolean[pattern.getInputs().length];
this.satisfied = new boolean[pattern.getInputs().size()];
this.satisfiedInsertion = new boolean[pattern.getInputs().size()];
this.checked = new boolean[pattern.getInputs().size()];
}
public void setSatisfied(boolean[] satisfied) {
@@ -41,10 +41,10 @@ public class CraftingTaskProcessing extends CraftingTask {
@Override
public boolean update(World world, INetworkMaster network) {
for (int i = 0; i < pattern.getInputs().length; ++i) {
for (int i = 0; i < pattern.getInputs().size(); ++i) {
checked[i] = true;
ItemStack input = pattern.getInputs()[i];
ItemStack input = pattern.getInputs().get(i);
if (!satisfied[i]) {
ItemStack received = NetworkUtils.extractItem(network, input, input.stackSize);
@@ -68,7 +68,7 @@ public class CraftingTaskProcessing extends CraftingTask {
}
if (!took.isEmpty()) {
ICraftingPatternContainer container = pattern.getContainer(world);
ICraftingPatternContainer container = pattern.getContainer();
ItemStack toInsert = took.get(0);
@@ -97,8 +97,8 @@ public class CraftingTaskProcessing extends CraftingTask {
return false;
}
for (int i = 0; i < pattern.getOutputs().length; ++i) {
ItemStack output = pattern.getOutputs()[i];
for (int i = 0; i < pattern.getOutputs().size(); ++i) {
ItemStack output = pattern.getOutputs().get(i);
if (!satisfiedInsertion[i]) {
if (CompareUtils.compareStackNoQuantity(output, stack)) {
@@ -139,8 +139,8 @@ public class CraftingTaskProcessing extends CraftingTask {
boolean missingItems = false;
for (int i = 0; i < pattern.getInputs().length; ++i) {
ItemStack input = pattern.getInputs()[i];
for (int i = 0; i < pattern.getInputs().size(); ++i) {
ItemStack input = pattern.getInputs().get(i);
if (!satisfied[i] && !childrenCreated[i]) {
if (!missingItems) {
@@ -155,8 +155,8 @@ public class CraftingTaskProcessing extends CraftingTask {
boolean itemsCrafting = false;
for (int i = 0; i < pattern.getInputs().length; ++i) {
ItemStack input = pattern.getInputs()[i];
for (int i = 0; i < pattern.getInputs().size(); ++i) {
ItemStack input = pattern.getInputs().get(i);
if (!satisfied[i] && childrenCreated[i]) {
if (!itemsCrafting) {
@@ -172,8 +172,8 @@ public class CraftingTaskProcessing extends CraftingTask {
if (isReadyToInsert()) {
builder.append("I=gui.refinedstorage:crafting_monitor.items_processing\n");
for (int i = 0; i < pattern.getInputs().length; ++i) {
builder.append("T=").append(pattern.getInputs()[i].getUnlocalizedName()).append(".name\n");
for (int i = 0; i < pattern.getInputs().size(); ++i) {
builder.append("T=").append(pattern.getInputs().get(i).getUnlocalizedName()).append(".name\n");
}
}

View File

@@ -134,7 +134,7 @@ public class ItemGridHandler implements IItemGridHandler {
int quantityPerRequest = pattern.getQuantityPerRequest(stack);
while (quantity > 0) {
network.addCraftingTask(network.createCraftingTask(pattern));
network.addCraftingTask(NetworkUtils.createCraftingTask(network, pattern));
quantity -= quantityPerRequest;
}

View File

@@ -53,7 +53,7 @@ public final class FluidUtils {
ICraftingPattern pattern = NetworkUtils.getPattern(network, EMPTY_BUCKET);
if (pattern != null) {
network.addCraftingTask(network.createCraftingTask(pattern));
network.addCraftingTask(NetworkUtils.createCraftingTask(network, pattern));
}
}
}

View File

@@ -1,18 +1,13 @@
package refinedstorage.item;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import refinedstorage.RefinedStorageItems;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.ICraftingPatternContainer;
@@ -20,16 +15,12 @@ import refinedstorage.api.autocrafting.ICraftingPatternProvider;
import refinedstorage.api.storage.CompareUtils;
import refinedstorage.apiimpl.autocrafting.CraftingPattern;
import javax.annotation.Nullable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ItemPattern extends ItemBase implements ICraftingPatternProvider {
public static final String NBT_INPUTS = "Inputs";
public static final String NBT_OUTPUTS = "Outputs";
public static final String NBT_BYPRODUCTS = "Byproducts";
public static final String NBT_PROCESSING = "Processing";
private static final String NBT_SLOT = "Slot_%d";
public ItemPattern() {
super("pattern");
@@ -37,7 +28,7 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider {
@Override
public void addInformation(ItemStack pattern, EntityPlayer player, List<String> tooltip, boolean advanced) {
if (isValid(pattern)) {
/* @todo CraftingPattern
if (GuiScreen.isShiftKeyDown() || isProcessing(pattern)) {
tooltip.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.inputs") + TextFormatting.RESET);
@@ -47,7 +38,25 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider {
}
combineItems(tooltip, true, getOutputs(pattern));
}*/
}
public static void setSlot(ItemStack pattern, int slot, ItemStack stack) {
if (!pattern.hasTagCompound()) {
pattern.setTagCompound(new NBTTagCompound());
}
pattern.getTagCompound().setTag(String.format(NBT_SLOT, slot), stack.serializeNBT());
}
public static ItemStack getSlot(ItemStack pattern, int slot) {
String id = String.format(NBT_SLOT, slot);
if (!pattern.hasTagCompound() || !pattern.getTagCompound().hasKey(id)) {
return null;
}
return ItemStack.loadItemStackFromNBT(pattern.getTagCompound().getCompoundTag(id));
}
public static void combineItems(List<String> tooltip, boolean displayAmount, ItemStack... stacks) {
@@ -83,157 +92,8 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider {
return new ActionResult<>(EnumActionResult.PASS, stack);
}
public static void addInput(ItemStack pattern, ItemStack stack) {
add(pattern, stack, NBT_INPUTS);
}
public static void addOutput(ItemStack pattern, ItemStack stack) {
add(pattern, stack, NBT_OUTPUTS);
}
public static void addByproduct(ItemStack pattern, ItemStack stack) {
add(pattern, stack, NBT_BYPRODUCTS);
}
private static void add(ItemStack pattern, ItemStack stack, String type) {
if (pattern.getTagCompound() == null) {
pattern.setTagCompound(new NBTTagCompound());
}
if (!pattern.getTagCompound().hasKey(type)) {
pattern.getTagCompound().setTag(type, new NBTTagList());
}
pattern.getTagCompound().getTagList(type, Constants.NBT.TAG_COMPOUND).appendTag(stack.serializeNBT());
}
public static ItemStack[] getInputs(ItemStack pattern) {
return get(pattern, NBT_INPUTS);
}
public static ItemStack[] getOutputs(ItemStack pattern) {
return get(pattern, NBT_OUTPUTS);
}
public static ItemStack[] getByproducts(ItemStack pattern) {
return get(pattern, NBT_BYPRODUCTS);
}
private static ItemStack[] get(ItemStack pattern, String type) {
if (!pattern.hasTagCompound() || !pattern.getTagCompound().hasKey(type)) {
return null;
}
NBTTagList stacksList = pattern.getTagCompound().getTagList(type, Constants.NBT.TAG_COMPOUND);
ItemStack[] stacks = new ItemStack[stacksList.tagCount()];
for (int i = 0; i < stacksList.tagCount(); ++i) {
stacks[i] = ItemStack.loadItemStackFromNBT(stacksList.getCompoundTagAt(i));
}
return stacks;
}
public static boolean isValid(ItemStack pattern) {
if (pattern.getTagCompound() == null || (!pattern.getTagCompound().hasKey(NBT_INPUTS) || !pattern.getTagCompound().hasKey(NBT_OUTPUTS) || !pattern.getTagCompound().hasKey(NBT_PROCESSING))) {
return false;
}
for (ItemStack input : getInputs(pattern)) {
if (input == null) {
return false;
}
}
for (ItemStack output : getOutputs(pattern)) {
if (output == null) {
return false;
}
}
ItemStack[] byproducts = getByproducts(pattern);
if (byproducts != null) {
for (ItemStack byproduct : byproducts) {
if (byproduct == null) {
return false;
}
}
}
return true;
}
public static void setProcessing(ItemStack pattern, boolean processing) {
if (pattern.getTagCompound() == null) {
pattern.setTagCompound(new NBTTagCompound());
}
pattern.getTagCompound().setBoolean(NBT_PROCESSING, processing);
}
public static boolean isProcessing(ItemStack pattern) {
if (!pattern.hasTagCompound() || !pattern.getTagCompound().hasKey(NBT_PROCESSING)) {
return false;
}
return pattern.getTagCompound().getBoolean(NBT_PROCESSING);
}
@Override
public ICraftingPattern create(ItemStack stack, ICraftingPatternContainer container) {
return new CraftingPattern(stack, container.getPosition(), isProcessing(stack), getInputs(stack), getOutputs(stack), getByproducts(stack));
}
@Override
@Nullable
public ICraftingPattern create(ItemStack stack) {
NBTTagCompound tag = stack.getTagCompound();
BlockPos crafterPos = new BlockPos(tag.getInteger(CraftingPattern.NBT_CRAFTER_X), tag.getInteger(CraftingPattern.NBT_CRAFTER_Y), tag.getInteger(CraftingPattern.NBT_CRAFTER_Z));
boolean processing = tag.getBoolean(NBT_PROCESSING);
NBTTagList inputsTag = tag.getTagList(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));
if (inputs[i] == null) {
return null;
}
}
NBTTagList outputsTag = tag.getTagList(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));
if (outputs[i] == null) {
return null;
}
}
ItemStack byproducts[] = new ItemStack[0];
if (tag.hasKey(ItemPattern.NBT_BYPRODUCTS)) {
NBTTagList byproductsTag = tag.getTagList(NBT_BYPRODUCTS, Constants.NBT.TAG_COMPOUND);
byproducts = new ItemStack[byproductsTag.tagCount()];
for (int i = 0; i < byproductsTag.tagCount(); ++i) {
byproducts[i] = ItemStack.loadItemStackFromNBT(byproductsTag.getCompoundTagAt(i));
if (byproducts[i] == null) {
return null;
}
}
}
return new CraftingPattern(stack, crafterPos, processing, inputs, outputs, byproducts);
public ICraftingPattern create(World world, ItemStack stack, ICraftingPatternContainer container) {
return new CraftingPattern(world, container, stack);
}
}

View File

@@ -3,6 +3,8 @@ package refinedstorage.tile;
import net.minecraft.item.ItemStack;
import refinedstorage.api.autocrafting.task.ICraftingTask;
import java.util.List;
public class ClientCraftingTask {
private ItemStack output;
private int id;
@@ -11,7 +13,7 @@ public class ClientCraftingTask {
private int progress;
// Used server-side while sending
private ItemStack[] outputs;
private List<ItemStack> outputs;
private ClientCraftingTask child;
public ClientCraftingTask(ItemStack output, int id, String status, int depth, int progress) {
@@ -22,7 +24,7 @@ public class ClientCraftingTask {
this.progress = progress;
}
public ClientCraftingTask(String status, ItemStack[] outputs, int progress, ICraftingTask child) {
public ClientCraftingTask(String status, List<ItemStack> outputs, int progress, ICraftingTask child) {
this.status = status;
this.outputs = outputs;
this.progress = progress;
@@ -33,7 +35,7 @@ public class ClientCraftingTask {
return output;
}
public ItemStack[] getOutputs() {
public List<ItemStack> getOutputs() {
return outputs;
}

View File

@@ -10,8 +10,10 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fluids.FluidStack;
@@ -132,6 +134,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
private static final String NBT_CRAFTING_TASKS = "CraftingTasks";
private static final String NBT_CRAFTING_TASK_PATTERN = "Pattern";
private static final String NBT_CRAFTING_TASK_TYPE = "Type";
private static final String NBT_CRAFTING_TASK_CONTAINER = "Container";
private static final Comparator<IItemStorage> ITEM_SIZE_COMPARATOR = (left, right) -> {
if (left.getStored() == right.getStored()) {
@@ -181,6 +184,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
private List<ICraftingTask> craftingTasksToAdd = new ArrayList<>();
private List<ICraftingTask> craftingTasksToCancel = new ArrayList<>();
private List<NBTTagCompound> craftingTasksToRead = new ArrayList<>();
private EnergyStorage energy = new EnergyStorage(RefinedStorage.INSTANCE.controllerCapacity);
private IControllerEnergyIC2 energyEU;
private ControllerEnergyTesla energyTesla;
@@ -237,6 +242,18 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
if (!worldObj.isRemote) {
energyEU.update();
if (!craftingTasksToRead.isEmpty()) {
for (NBTTagCompound tag : craftingTasksToRead) {
ICraftingTask task = readCraftingTask(worldObj, tag);
if (task != null) {
addCraftingTask(task);
}
}
craftingTasksToRead.clear();
}
if (canRun()) {
Collections.sort(itemStorage.getStorages(), ITEM_SIZE_COMPARATOR);
Collections.sort(itemStorage.getStorages(), ITEM_PRIORITY_COMPARATOR);
@@ -325,7 +342,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
}
private boolean updateCraftingTask(ICraftingTask task) {
ICraftingPatternContainer container = task.getPattern().getContainer(worldObj);
ICraftingPatternContainer container = task.getPattern().getContainer();
return container != null && ticks % container.getSpeed() == 0 && task.update(worldObj, this);
}
@@ -395,11 +412,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
markDirty();
}
@Override
public ICraftingTask createCraftingTask(ICraftingPattern pattern) {
return RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(pattern.getId()).create(null, pattern);
}
@Override
public void cancelCraftingTask(ICraftingTask task) {
craftingTasksToCancel.add(task);
@@ -470,7 +482,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
ItemStack stack = container.getPatterns().getStackInSlot(i);
if (stack != null) {
patterns.add(((ICraftingPatternProvider) stack.getItem()).create(stack, container));
ICraftingPattern pattern = ((ICraftingPatternProvider) stack.getItem()).create(worldObj, stack, container);
if (pattern.isValid()) {
patterns.add(pattern);
}
}
}
}
@@ -687,6 +703,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
return newStack;
}
@Override
public World getNetworkWorld() {
return worldObj;
}
@Override
public void readFromNBT(NBTTagCompound tag) {
super.readFromNBT(tag);
@@ -701,29 +722,29 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
NBTTagList taskList = tag.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < taskList.tagCount(); ++i) {
ICraftingTask task = readCraftingTask(taskList.getCompoundTagAt(i));
if (task != null) {
addCraftingTask(task);
}
craftingTasksToRead.add(taskList.getCompoundTagAt(i));
}
}
}
public static ICraftingTask readCraftingTask(NBTTagCompound tag) {
public static ICraftingTask readCraftingTask(World world, NBTTagCompound tag) {
ItemStack stack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag(NBT_CRAFTING_TASK_PATTERN));
if (stack != null && stack.getItem() instanceof ICraftingPatternProvider) {
ICraftingPattern pattern = ((ICraftingPatternProvider) stack.getItem()).create(stack);
TileEntity container = world.getTileEntity(BlockPos.fromLong(tag.getLong(NBT_CRAFTING_TASK_CONTAINER)));
if (pattern != null) {
ICraftingTaskFactory factory = RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(tag.getString(NBT_CRAFTING_TASK_TYPE));
if (container instanceof ICraftingPatternContainer) {
ICraftingPattern pattern = ((ICraftingPatternProvider) stack.getItem()).create(world, stack, (ICraftingPatternContainer) container);
if (factory != null) {
ICraftingTask task = factory.create(tag, pattern);
if (pattern != null) {
ICraftingTaskFactory factory = RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(tag.getString(NBT_CRAFTING_TASK_TYPE));
if (task != null) {
return task;
if (factory != null) {
ICraftingTask task = factory.create(tag, world, pattern);
if (task != null) {
return task;
}
}
}
}
@@ -749,6 +770,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
taskTag.setString(NBT_CRAFTING_TASK_TYPE, task.getPattern().getId());
taskTag.setTag(NBT_CRAFTING_TASK_PATTERN, task.getPattern().getStack().serializeNBT());
taskTag.setLong(NBT_CRAFTING_TASK_CONTAINER, task.getPattern().getContainer().getPosition().toLong());
list.appendTag(taskTag);
}

View File

@@ -49,7 +49,7 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer {
public void onConnectionChange(INetworkMaster network, boolean state) {
if (!state) {
network.getCraftingTasks().stream()
.filter(task -> task.getPattern().getContainer(worldObj).getPosition().equals(pos))
.filter(task -> task.getPattern().getContainer().getPosition().equals(pos))
.forEach(network::cancelCraftingTask);
}

View File

@@ -6,11 +6,9 @@ import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorageItems;
import refinedstorage.inventory.ItemHandlerBasic;
import refinedstorage.inventory.ItemValidatorBasic;
import refinedstorage.item.ItemPattern;
public class TileProcessingPatternEncoder extends TileBase {
private ItemHandlerBasic patterns = new ItemHandlerBasic(2, this, new ItemValidatorBasic(RefinedStorageItems.PATTERN));
@@ -38,7 +36,8 @@ public class TileProcessingPatternEncoder extends TileBase {
if (canCreatePattern()) {
ItemStack pattern = new ItemStack(RefinedStorageItems.PATTERN);
ItemPattern.setProcessing(pattern, true);
// @todo
/*ItemPattern.setProcessing(pattern, true);
for (int i = 0; i < 18; ++i) {
if (configuration.getStackInSlot(i) != null) {
@@ -50,7 +49,7 @@ public class TileProcessingPatternEncoder extends TileBase {
}
}
}
}
}*/
patterns.extractItem(0, 1, false);
patterns.setStackInSlot(1, pattern);

View File

@@ -61,7 +61,7 @@ public final class RefinedStorageSerializers {
buf.writeInt(task.getProgress());
buf.writeInt(task.getOutputs().length);
buf.writeInt(task.getOutputs().size());
for (ItemStack output : task.getOutputs()) {
ByteBufUtils.writeItemStack(buf, output);

View File

@@ -308,21 +308,11 @@ public class TileGrid extends TileNode implements IGrid {
ItemStack pattern = new ItemStack(RefinedStorageItems.PATTERN);
for (ItemStack byproduct : CraftingManager.getInstance().getRemainingItems(matrix, worldObj)) {
if (byproduct != null) {
ItemPattern.addByproduct(pattern, byproduct);
}
}
ItemPattern.addOutput(pattern, result.getStackInSlot(0));
ItemPattern.setProcessing(pattern, false);
for (int i = 0; i < 9; ++i) {
ItemStack ingredient = matrix.getStackInSlot(i);
if (ingredient != null) {
ItemPattern.addInput(pattern, ingredient);
ItemPattern.setSlot(pattern, i, ingredient);
}
}