From 6645f41db73f7aff7f9146c9b35cf7a104e80266 Mon Sep 17 00:00:00 2001 From: way2muchnoise Date: Sat, 15 Oct 2016 23:59:48 +0200 Subject: [PATCH] rewrite most the autocraft calculations (#472) * rewrite most the autocraft calculations, mainly to improve the preview generation * fix impl being in the api and general code style * fix code style * remove breakpoint line --- .../api/autocrafting/ICraftingPattern.java | 2 +- .../preview/ICraftingPreviewStack.java | 33 +++ .../api/autocrafting/task/ICraftingTask.java | 22 ++ .../apiimpl/autocrafting/CraftingPattern.java | 13 +- .../preview/CraftingPreviewStack.java | 77 ++++++ .../autocrafting/task/CraftingTask.java | 261 +++++++++++------- .../apiimpl/network/grid/ItemGridHandler.java | 38 +-- .../gui/GuiCraftingPreview.java | 40 +-- .../MessageGridCraftingPreviewResponse.java | 13 +- .../refinedstorage/proxy/ClientProxy.java | 10 +- .../refinedstorage/proxy/CommonProxy.java | 2 +- .../refinedstorage/tile/TileController.java | 4 +- 12 files changed, 353 insertions(+), 162 deletions(-) create mode 100644 src/main/java/refinedstorage/api/autocrafting/preview/ICraftingPreviewStack.java create mode 100644 src/main/java/refinedstorage/apiimpl/autocrafting/preview/CraftingPreviewStack.java diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java index df2e12214..a7873f603 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java @@ -34,7 +34,7 @@ public interface ICraftingPattern { boolean isOredict(); /** - * @return the inputs + * @return the inputs, can contain nulls */ List getInputs(); diff --git a/src/main/java/refinedstorage/api/autocrafting/preview/ICraftingPreviewStack.java b/src/main/java/refinedstorage/api/autocrafting/preview/ICraftingPreviewStack.java new file mode 100644 index 000000000..f8212905b --- /dev/null +++ b/src/main/java/refinedstorage/api/autocrafting/preview/ICraftingPreviewStack.java @@ -0,0 +1,33 @@ +package refinedstorage.api.autocrafting.preview; + +import io.netty.buffer.ByteBuf; +import net.minecraft.item.ItemStack; + +public interface ICraftingPreviewStack { + /** + * @return the stack to display + */ + ItemStack getStack(); + + /** + * @return available amount of the {@link #getStack()} + */ + int getAvailable(); + + /** + * @return toCraft or missing (depends on {@link #hasMissing()} amount of the {@link #getStack()} + */ + int getToCraft(); + + /** + * When this is true {@link #getToCraft()} will be the missing items + * + * @return true when items are missing + */ + boolean hasMissing(); + + /** + * @param buf byte buf to write to + */ + void writeToByteBuf(ByteBuf buf); +} diff --git a/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java index 24133ebf4..652f50c16 100755 --- a/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java +++ b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java @@ -3,6 +3,7 @@ package refinedstorage.api.autocrafting.task; import net.minecraft.nbt.NBTTagCompound; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; +import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack; import java.util.List; @@ -27,6 +28,7 @@ public interface ICraftingTask { /** * Updates this task. Gets called every few ticks, depending on the speed of the pattern container. + * {@link ICraftingTask#calculate()} must be run before this * * @return true if this crafting task is finished and can be deleted from the list, false otherwise */ @@ -46,6 +48,8 @@ public interface ICraftingTask { NBTTagCompound writeToNBT(NBTTagCompound tag); /** + * {@link ICraftingTask#calculate()} must be run before this + * * @return the elements of this task for display in the crafting monitor */ List getCraftingMonitorElements(); @@ -56,7 +60,25 @@ public interface ICraftingTask { ICraftingPattern getPattern(); /** + * {@link ICraftingTask#calculate()} must be run before this + * * @return the processable items in this task */ List getToProcess(); + + /** + * Used to check if the crafting task has recursive elements + * (eg. block needs 9 ingots, ingots are crafted by a block) + * {@link ICraftingTask#calculate()} must be run before this + * + * @return true if no recursion was found + */ + boolean isValid(); + + /** + * {@link ICraftingTask#calculate()} must be run before this + * + * @return get a list of {@link ICraftingPreviewStack}s + */ + List getPreviewStacks(); } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index 77b576c74..dec5b08a0 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -15,6 +15,7 @@ import refinedstorage.item.ItemPattern; import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class CraftingPattern implements ICraftingPattern { private World world; @@ -38,14 +39,8 @@ public class CraftingPattern implements ICraftingPattern { 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)); - } - - inv.setInventorySlotContents(i, slot); - } + inputs.add(slot); + inv.setInventorySlotContents(i, slot); } if (!ItemPattern.isProcessing(stack)) { @@ -77,7 +72,7 @@ public class CraftingPattern implements ICraftingPattern { @Override public boolean isValid() { - return !inputs.isEmpty() && !outputs.isEmpty(); + return inputs.stream().filter(Objects::nonNull).count() > 0 && !outputs.isEmpty(); } @Override diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/preview/CraftingPreviewStack.java b/src/main/java/refinedstorage/apiimpl/autocrafting/preview/CraftingPreviewStack.java new file mode 100644 index 000000000..d48c8a281 --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/preview/CraftingPreviewStack.java @@ -0,0 +1,77 @@ +package refinedstorage.apiimpl.autocrafting.preview; + +import io.netty.buffer.ByteBuf; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.ItemHandlerHelper; +import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack; + +public class CraftingPreviewStack implements ICraftingPreviewStack { + private ItemStack stack; + private int available; + private boolean missing; + private int toCraft; + // if missing is true then toCraft is the missing amount + + public CraftingPreviewStack(ItemStack stack) { + this.stack = ItemHandlerHelper.copyStackWithSize(stack, 1); + } + + public CraftingPreviewStack(ItemStack stack, int available, boolean missing, int toCraft) { + this.stack = stack; + this.available = available; + this.missing = missing; + this.toCraft = toCraft; + } + + @Override + public void writeToByteBuf(ByteBuf buf) { + buf.writeInt(Item.getIdFromItem(stack.getItem())); + buf.writeInt(stack.getMetadata()); + buf.writeInt(available); + buf.writeBoolean(missing); + buf.writeInt(toCraft); + } + + public static CraftingPreviewStack fromByteBuf(ByteBuf buf) { + Item item = Item.getItemById(buf.readInt()); + int meta = buf.readInt(); + int available = buf.readInt(); + boolean missing = buf.readBoolean(); + int toCraft = buf.readInt(); + + return new CraftingPreviewStack(new ItemStack(item, 1, meta), available, missing, toCraft); + } + + @Override + public ItemStack getStack() { + return stack; + } + + public void addAvailable(int amount) { + this.available += amount; + } + + @Override + public int getAvailable() { + return available; + } + + public void addToCraft(int amount) { + this.toCraft += amount; + } + + @Override + public int getToCraft() { + return this.toCraft; + } + + public void setMissing(boolean missing) { + this.missing = missing; + } + + @Override + public boolean hasMissing() { + return missing; + } +} diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index 58b33bd98..b68f38a24 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -8,6 +8,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RSUtils; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; +import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack; import refinedstorage.api.autocrafting.task.ICraftingTask; import refinedstorage.api.autocrafting.task.IProcessable; import refinedstorage.api.network.INetworkMaster; @@ -18,11 +19,9 @@ import refinedstorage.apiimpl.API; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementFluidRender; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementItemRender; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementText; +import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewStack; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Deque; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; public class CraftingTask implements ICraftingTask { @@ -32,10 +31,11 @@ public class CraftingTask implements ICraftingTask { private int quantity; private List toProcess = new ArrayList<>(); private IItemStackList toTake = API.instance().createItemStackList(); - private IFluidStackList toTakeFluids = API.instance().createFluidStackList(); private IItemStackList toCraft = API.instance().createItemStackList(); + private IFluidStackList toTakeFluids = API.instance().createFluidStackList(); private IItemStackList missing = API.instance().createItemStackList(); - private IItemStackList extras = API.instance().createItemStackList(); + private Set usedPatterns = new HashSet<>(); + private boolean recurseFound = false; private Deque toInsert = new ArrayDeque<>(); private int compare = IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT; private List took = new ArrayList<>(); @@ -52,109 +52,132 @@ public class CraftingTask implements ICraftingTask { } } + @Override public void calculate() { - IItemStackList list = network.getItemStorageCache().getList().copy(); + IItemStackList networkList = network.getItemStorageCache().getList().copy(); + IItemStackList toInsert = API.instance().createItemStackList(); - int newQuantity = quantity; - - while (newQuantity > 0) { - calculate(list, pattern, true); - - for (ItemStack output : pattern.getOutputs()) { - toInsert.add(output.copy()); - } - - newQuantity -= requested == null ? newQuantity : pattern.getQuantityPerRequest(requested); + toCraft.add(ItemHandlerHelper.copyStackWithSize(requested, quantity)); + int quantity = this.quantity; + while (quantity > 0 && !recurseFound) { + calculate(networkList, pattern, toInsert); + quantity -= pattern.getQuantityPerRequest(requested); } - for (ItemStack extra : extras.getStacks()) { - toInsert.add(extra); + if (!recurseFound) { + this.toInsert.addAll(toInsert.getStacks()); } + usedPatterns.clear(); } - private void calculate(IItemStackList list, ICraftingPattern pattern, boolean basePattern) { + private void calculate(IItemStackList networkList, ICraftingPattern pattern, IItemStackList toInsert) { + recurseFound = !usedPatterns.add(pattern); + if (recurseFound) { + return; + } + ItemStack[] took = new ItemStack[9]; if (pattern.isProcessing()) { toProcess.add(new Processable(pattern)); } - if (!basePattern) { - pattern.getOutputs().stream() - .filter(o -> o.stackSize > 1) - .forEach(o -> extras.add(ItemHandlerHelper.copyStackWithSize(o, o.stackSize - 1))); - } - - for (int i = 0; i < pattern.getInputs().size(); ++i) { - ItemStack input = pattern.getInputs().get(i); - - ItemStack inputInNetwork = list.get(input, compare); - - if (inputInNetwork == null || inputInNetwork.stackSize == 0) { - ItemStack extra = extras.get(input, compare); - - if (extra != null) { - ItemStack extraToRemove = ItemHandlerHelper.copyStackWithSize(extra, 1); - - if (!pattern.isProcessing()) { - took[i] = extraToRemove; - } - - extras.remove(extraToRemove, true); - } else { - ICraftingPattern inputPattern = network.getPattern(input, compare); - - if (inputPattern != null) { - for (ItemStack output : inputPattern.getOutputs()) { - toCraft.add(output); - } - - calculate(list, inputPattern, false); - } else { - FluidStack fluidInItem = RSUtils.getFluidFromStack(input, true); - - if (fluidInItem != null && RSUtils.hasFluidBucket(fluidInItem)) { - FluidStack fluidInStorage = network.getFluidStorageCache().getList().get(fluidInItem); - - if (fluidInStorage == null || fluidInStorage.amount < fluidInItem.amount) { - missing.add(input); - } else { - boolean hasBucket = network.getItemStorageCache().getList().get(RSUtils.EMPTY_BUCKET) != null; - ICraftingPattern bucketPattern = network.getPattern(RSUtils.EMPTY_BUCKET); - - if (!hasBucket) { - if (bucketPattern == null) { - missing.add(RSUtils.EMPTY_BUCKET.copy()); - } else { - calculate(list, bucketPattern, false); - } - } - - if (hasBucket || bucketPattern != null) { - toTakeFluids.add(fluidInItem.copy()); - } - } - } else { - missing.add(input); - } - } - } - } else { - if (!pattern.isProcessing()) { - ItemStack take = ItemHandlerHelper.copyStackWithSize(inputInNetwork, 1); - - toTake.add(take); - - took[i] = take; - } - - list.remove(inputInNetwork, 1, true); + IItemStackList inputs = API.instance().createItemStackList(); + IItemStackList actualInputs = API.instance().createItemStackList(); + for (ItemStack input : pattern.getInputs()) { + if (input != null) { + inputs.add(input.copy()); } } - for (ItemStack byproduct : (pattern.isOredict() ? pattern.getByproducts(took) : pattern.getByproducts())) { - extras.add(byproduct.copy()); + for (ItemStack input : inputs.getStacks()) { + ItemStack extraStack = toInsert.get(input, compare); + ItemStack networkStack = networkList.get(input, compare); + + while (input.stackSize > 0) { + if (extraStack != null && extraStack.stackSize > 0) { + int takeQuantity = Math.min(extraStack.stackSize, input.stackSize); + ItemStack inputStack = ItemHandlerHelper.copyStackWithSize(extraStack, takeQuantity); + actualInputs.add(inputStack.copy()); + input.stackSize -= takeQuantity; + toInsert.remove(inputStack, true); + } else if (networkStack != null && networkStack.stackSize > 0) { + int takeQuantity = Math.min(networkStack.stackSize, input.stackSize); + ItemStack inputStack = ItemHandlerHelper.copyStackWithSize(networkStack, takeQuantity); + toTake.add(inputStack.copy()); + actualInputs.add(inputStack.copy()); + input.stackSize -= takeQuantity; + networkList.remove(inputStack, true); + } else { + ICraftingPattern inputPattern = network.getPattern(input, compare); + if (inputPattern != null) { + int craftQuantity = Math.min(inputPattern.getQuantityPerRequest(input), input.stackSize); + ItemStack inputCrafted = ItemHandlerHelper.copyStackWithSize(input, craftQuantity); + toCraft.add(inputCrafted.copy()); + actualInputs.add(inputCrafted.copy()); + calculate(networkList, inputPattern, toInsert); + input.stackSize -= craftQuantity; + // Calculate added all the crafted outputs toInsert + // So we remove the ones we use from toInsert + toInsert.remove(inputCrafted, true); + } else if (!doFluidCalculation(networkList, input, toInsert)) { + missing.add(input.copy()); + input.stackSize = 0; + } + } + } } + + if (missing.isEmpty()) { + for (int i = 0; i < pattern.getInputs().size(); i++) { + ItemStack input = pattern.getInputs().get(i); + if (input != null) { + ItemStack actualInput = actualInputs.get(input, compare); + ItemStack taken = ItemHandlerHelper.copyStackWithSize(actualInput, input.stackSize); + took[i] = taken; + actualInputs.remove(taken, true); + } + } + + for (ItemStack byproduct : (pattern.isOredict() ? pattern.getByproducts(took) : pattern.getByproducts())) { + toInsert.add(byproduct.copy()); + } + + for (ItemStack output : pattern.getOutputs()) { + toInsert.add(output.copy()); + } + } + usedPatterns.remove(pattern); + } + + private boolean doFluidCalculation(IItemStackList networkList, ItemStack input, IItemStackList toInsert) { + FluidStack fluidInItem = RSUtils.getFluidFromStack(input, true); + + if (fluidInItem != null && RSUtils.hasFluidBucket(fluidInItem)) { + FluidStack fluidInStorage = network.getFluidStorageCache().getList().get(fluidInItem); + + if (fluidInStorage == null || fluidInStorage.amount < fluidInItem.amount) { + missing.add(input); + } else { + boolean hasBucket = networkList.get(RSUtils.EMPTY_BUCKET) != null; + ICraftingPattern bucketPattern = network.getPattern(RSUtils.EMPTY_BUCKET); + + if (!hasBucket) { + if (bucketPattern == null) { + missing.add(RSUtils.EMPTY_BUCKET.copy()); + } else { + toCraft.add(RSUtils.EMPTY_BUCKET.copy()); + calculate(networkList, bucketPattern, toInsert); + } + } + + if (hasBucket || bucketPattern != null) { + toTakeFluids.add(fluidInItem.copy()); + } + } + return true; + } + return false; } @Override @@ -173,14 +196,13 @@ public class CraftingTask implements ICraftingTask { return "\nCraftingTask{quantity=" + quantity + "\n, toTake=" + toTake + "\n, toTakeFluids=" + toTakeFluids + - "\n, toCraft=" + toCraft + "\n, toProcess=" + toProcess + - "\n, extras=" + extras + + "\n, toCraft=" + toProcess + "\n, toInsert=" + toInsert + - "\n, missing=" + missing + '}'; } + @Override public boolean update() { for (IProcessable processable : toProcess) { IItemHandler inventory = processable.getPattern().getContainer().getFacingInventory(); @@ -226,7 +248,7 @@ public class CraftingTask implements ICraftingTask { if (isFinished()) { ItemStack insert = toInsert.peek(); - if (network.insertItem(insert, insert.stackSize, true) == null) { + if (insert != null && network.insertItem(insert, insert.stackSize, true) == null) { network.insertItem(insert, insert.stackSize, false); toInsert.pop(); @@ -330,6 +352,53 @@ public class CraftingTask implements ICraftingTask { return toProcess; } + @Override + public boolean isValid() { + return !recurseFound; + } + + @Override + public List getPreviewStacks() { + if (!isValid()) { + return Collections.emptyList(); + } + + Map map = new LinkedHashMap<>(); + + for (ItemStack stack : toCraft.getStacks()) { + int hash = API.instance().getItemStackHashCode(stack); + CraftingPreviewStack previewStack = map.get(hash); + if (previewStack == null) { + previewStack = new CraftingPreviewStack(stack); + } + previewStack.addToCraft(stack.stackSize); + map.put(hash, previewStack); + } + + for (ItemStack stack : toTake.getStacks()) { + int hash = API.instance().getItemStackHashCode(stack); + CraftingPreviewStack previewStack = map.get(hash); + if (previewStack == null) { + previewStack = new CraftingPreviewStack(stack); + } + previewStack.addAvailable(stack.stackSize); + map.put(hash, previewStack); + } + + for (ItemStack stack : missing.getStacks()) { + int hash = API.instance().getItemStackHashCode(stack); + CraftingPreviewStack previewStack = map.get(hash); + if (previewStack == null) { + previewStack = new CraftingPreviewStack(stack); + } + previewStack.setMissing(true); + previewStack.addToCraft(stack.stackSize); + map.put(hash, previewStack); + } + + return new ArrayList<>(map.values()); + } + private boolean isFinished() { return toTake.isEmpty() && toTakeFluids.isEmpty() && missing.isEmpty() && hasProcessedItems(); } diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java index b60693f48..b0c9e131c 100755 --- a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java @@ -6,11 +6,13 @@ import net.minecraft.util.EnumFacing; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RS; +import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.task.ICraftingTask; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.grid.IItemGridHandler; import refinedstorage.apiimpl.API; import refinedstorage.apiimpl.autocrafting.task.CraftingTask; +import refinedstorage.network.MessageGridCraftingPreviewResponse; public class ItemGridHandler implements IItemGridHandler { private INetworkMaster network; @@ -122,45 +124,25 @@ public class ItemGridHandler implements IItemGridHandler { ItemStack stack = network.getItemStorageCache().getList().get(hash); if (stack != null) { - CraftingTask task = new CraftingTask(network, stack, network.getPattern(stack), quantity); - + ICraftingTask task = new CraftingTask(network, stack, network.getPattern(stack), quantity); task.calculate(); - - System.out.println(task.toString()); - - network.addCraftingTask(task); - - /*CraftingPreviewData previewData = new CraftingPreviewData(network); - - previewData.calculate(stack, quantity); - - RefinedStorage.INSTANCE.network.sendTo(new MessageGridCraftingPreviewResponse(previewData.values(), hash, quantity), player);*/ + RS.INSTANCE.network.sendTo(new MessageGridCraftingPreviewResponse(task.getPreviewStacks(), hash, quantity), player); } } @Override public void onCraftingRequested(int hash, int quantity) { - /*if (quantity <= 0) { + if (quantity <= 0) { return; } - ItemStack stack = network.getItemStorage().get(hash); + ItemStack stack = network.getItemStorageCache().getList().get(hash); - if (stack == null) { - return; + if (stack != null) { + ICraftingTask task = new CraftingTask(network, stack, network.getPattern(stack), quantity); + task.calculate(); + network.addCraftingTask(task); } - - ICraftingPattern pattern = NetworkUtils.getPattern(network, stack); - - if (pattern != null) { - int quantityPerRequest = pattern.getQuantityPerRequest(stack); - - while (quantity > 0) { - network.addCraftingTask(NetworkUtils.createCraftingTask(network, 0, pattern)); - - quantity -= quantityPerRequest; - } - }*/ } @Override diff --git a/src/main/java/refinedstorage/gui/GuiCraftingPreview.java b/src/main/java/refinedstorage/gui/GuiCraftingPreview.java index dfc40a60b..a5476e213 100755 --- a/src/main/java/refinedstorage/gui/GuiCraftingPreview.java +++ b/src/main/java/refinedstorage/gui/GuiCraftingPreview.java @@ -1,20 +1,27 @@ package refinedstorage.gui; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; import net.minecraftforge.fml.client.FMLClientHandler; import org.lwjgl.input.Keyboard; import refinedstorage.RS; +import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack; import refinedstorage.network.MessageGridCraftingStart; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class GuiCraftingPreview extends GuiBase { private static final int VISIBLE_ROWS = 4; - //private List stacks; + private List stacks; private GuiScreen parent; private int hash; @@ -23,7 +30,7 @@ public class GuiCraftingPreview extends GuiBase { private GuiButton startButton; private GuiButton cancelButton; - public GuiCraftingPreview(GuiScreen parent, /*Collection stacks, */int hash, int quantity) { + public GuiCraftingPreview(GuiScreen parent, List stacks, int hash, int quantity) { super(new Container() { @Override public boolean canInteractWith(EntityPlayer player) { @@ -31,7 +38,7 @@ public class GuiCraftingPreview extends GuiBase { } }, 168, 171); - //this.stacks = new ArrayList<>(stacks); + this.stacks = new ArrayList<>(stacks); this.parent = parent; this.hash = hash; @@ -44,7 +51,7 @@ public class GuiCraftingPreview extends GuiBase { public void init(int x, int y) { cancelButton = addButton(x + 16, y + 144, 50, 20, t("gui.cancel")); startButton = addButton(x + 85, y + 144, 50, 20, t("misc.refinedstorage:start")); - //startButton.enabled = !stacks.isEmpty(); + startButton.enabled = !stacks.isEmpty(); } @Override @@ -59,7 +66,7 @@ public class GuiCraftingPreview extends GuiBase { drawTexture(x, y, 0, 0, width, height); - /*if (stacks.isEmpty()) { + if (stacks.isEmpty()) { drawRect(x + 7, y + 20, x + 142, y + 139, 0xFFDBDBDB); } else { @@ -70,9 +77,9 @@ public class GuiCraftingPreview extends GuiBase { for (int i = 0; i < 8; ++i) { if (slot < stacks.size()) { - CraftingPreviewStack stack = stacks.get(slot); + ICraftingPreviewStack stack = stacks.get(slot); - if (stack.cantCraft()) { + if (stack.hasMissing()) { drawTexture(x, y, 189, 0, 67, 29); } } @@ -86,7 +93,7 @@ public class GuiCraftingPreview extends GuiBase { slot++; } - }*/ + } } @Override @@ -97,7 +104,7 @@ public class GuiCraftingPreview extends GuiBase { int y = 22; float scale = 0.5f; - /*if (stacks.isEmpty()) { + if (stacks.isEmpty()) { GlStateManager.pushMatrix(); GlStateManager.scale(scale, scale, 1); @@ -115,7 +122,7 @@ public class GuiCraftingPreview extends GuiBase { for (int i = 0; i < 8; ++i) { if (slot < stacks.size()) { - CraftingPreviewStack stack = stacks.get(slot); + ICraftingPreviewStack stack = stacks.get(slot); drawItem(x, y + 5, stack.getStack()); @@ -124,15 +131,15 @@ public class GuiCraftingPreview extends GuiBase { int yy = y + 8; - if (stack.needsCrafting()) { - String format = stack.cantCraft() ? "gui.refinedstorage:crafting_preview.missing" : "gui.refinedstorage:crafting_preview.to_craft"; + if (stack.getToCraft() > 0) { + String format = stack.hasMissing() ? "gui.refinedstorage:crafting_preview.missing" : "gui.refinedstorage:crafting_preview.to_craft"; drawString(calculateOffsetOnScale(x + 23, scale), calculateOffsetOnScale(yy, scale), t(format, stack.getToCraft())); yy += 7; } - if (stack.getStock() > 0) { - drawString(calculateOffsetOnScale(x + 23, scale), calculateOffsetOnScale(yy, scale), t("gui.refinedstorage:crafting_preview.available", stack.getStock())); + if (stack.getAvailable() > 0) { + drawString(calculateOffsetOnScale(x + 23, scale), calculateOffsetOnScale(yy, scale), t("gui.refinedstorage:crafting_preview.available", stack.getAvailable())); } GlStateManager.popMatrix(); @@ -155,7 +162,7 @@ public class GuiCraftingPreview extends GuiBase { if (hoveringStack != null) { drawTooltip(mouseX, mouseY, hoveringStack.getTooltip(Minecraft.getMinecraft().thePlayer, false)); } - }*/ + } } @Override @@ -187,8 +194,7 @@ public class GuiCraftingPreview extends GuiBase { } private int getRows() { - /*return Math.max(0, (int) Math.ceil((float) stacks.size() / 2F));*/ - return 0; + return Math.max(0, (int) Math.ceil((float) stacks.size() / 2F)); } private void close() { diff --git a/src/main/java/refinedstorage/network/MessageGridCraftingPreviewResponse.java b/src/main/java/refinedstorage/network/MessageGridCraftingPreviewResponse.java index 3d3f4ee39..ca1f0852a 100755 --- a/src/main/java/refinedstorage/network/MessageGridCraftingPreviewResponse.java +++ b/src/main/java/refinedstorage/network/MessageGridCraftingPreviewResponse.java @@ -1,25 +1,25 @@ package refinedstorage.network; -/* import io.netty.buffer.ByteBuf; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack; import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewStack; import refinedstorage.proxy.ClientProxy; -import java.util.Collection; import java.util.LinkedList; +import java.util.List; public class MessageGridCraftingPreviewResponse implements IMessage, IMessageHandler { - public Collection stacks; + public List stacks; public int hash; public int quantity; public MessageGridCraftingPreviewResponse() { } - public MessageGridCraftingPreviewResponse(Collection stacks, int hash, int quantity) { + public MessageGridCraftingPreviewResponse(List stacks, int hash, int quantity) { this.stacks = stacks; this.hash = hash; this.quantity = quantity; @@ -46,7 +46,7 @@ public class MessageGridCraftingPreviewResponse implements IMessage, IMessageHan buf.writeInt(stacks.size()); - for (CraftingPreviewStack stack : stacks) { + for (ICraftingPreviewStack stack : stacks) { stack.writeToByteBuf(buf); } } @@ -57,5 +57,4 @@ public class MessageGridCraftingPreviewResponse implements IMessage, IMessageHan return null; } -} -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/refinedstorage/proxy/ClientProxy.java b/src/main/java/refinedstorage/proxy/ClientProxy.java index 905393fe3..183698647 100755 --- a/src/main/java/refinedstorage/proxy/ClientProxy.java +++ b/src/main/java/refinedstorage/proxy/ClientProxy.java @@ -4,6 +4,8 @@ import mcmultipart.client.multipart.ModelMultipartContainer; import mcmultipart.raytrace.PartMOP; import mcmultipart.raytrace.RayTraceUtils; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; @@ -20,6 +22,7 @@ import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -28,7 +31,10 @@ import refinedstorage.RS; import refinedstorage.RSBlocks; import refinedstorage.RSItems; import refinedstorage.block.*; +import refinedstorage.gui.GuiCraftingPreview; +import refinedstorage.gui.grid.GuiCraftingStart; import refinedstorage.item.*; +import refinedstorage.network.MessageGridCraftingPreviewResponse; import refinedstorage.tile.TileController; import java.util.List; @@ -297,7 +303,7 @@ public class ClientProxy extends CommonProxy { }); } - /*public static void onReceiveCraftingPreviewResponse(MessageGridCraftingPreviewResponse message) { + public static void onReceiveCraftingPreviewResponse(MessageGridCraftingPreviewResponse message) { Minecraft.getMinecraft().addScheduledTask(() -> { GuiScreen screen = Minecraft.getMinecraft().currentScreen; @@ -307,5 +313,5 @@ public class ClientProxy extends CommonProxy { FMLCommonHandler.instance().showGuiScreen(new GuiCraftingPreview(screen, message.stacks, message.hash, message.quantity)); }); - }*/ + } } diff --git a/src/main/java/refinedstorage/proxy/CommonProxy.java b/src/main/java/refinedstorage/proxy/CommonProxy.java index a3c289282..1bd7767b9 100755 --- a/src/main/java/refinedstorage/proxy/CommonProxy.java +++ b/src/main/java/refinedstorage/proxy/CommonProxy.java @@ -78,7 +78,7 @@ public class CommonProxy { RS.INSTANCE.network.registerMessage(MessageProcessingPatternEncoderClear.class, MessageProcessingPatternEncoderClear.class, id++, Side.SERVER); RS.INSTANCE.network.registerMessage(MessageGridFilterUpdate.class, MessageGridFilterUpdate.class, id++, Side.SERVER); RS.INSTANCE.network.registerMessage(MessageGridCraftingPreview.class, MessageGridCraftingPreview.class, id++, Side.SERVER); - //RefinedStorage.INSTANCE.network.registerMessage(MessageGridCraftingPreviewResponse.class, MessageGridCraftingPreviewResponse.class, id++, Side.CLIENT); + RS.INSTANCE.network.registerMessage(MessageGridCraftingPreviewResponse.class, MessageGridCraftingPreviewResponse.class, id++, Side.CLIENT); RS.INSTANCE.network.registerMessage(MessageProcessingPatternEncoderTransfer.class, MessageProcessingPatternEncoderTransfer.class, id++, Side.SERVER); NetworkRegistry.INSTANCE.registerGuiHandler(RS.INSTANCE, new GuiHandler()); diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index 7d0380417..896a48e51 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -273,7 +273,9 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR craftingTasksToCancel.clear(); for (ICraftingTask task : craftingTasksToAdd) { - craftingTasks.add(task); + if (task.isValid()) { + craftingTasks.add(task); + } } craftingTasksToAdd.clear();