diff --git a/CHANGELOG.md b/CHANGELOG.md index 47f17aa82..98a86b449 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### 1.0.1 - Fixed advanced tooltips showing in Grid when not configured to do so (raoulvdberge) - Added "autocrafting mode" in Detector, to check if an item is being crafted. If no item is specified, it'll emit a signal if anything is crafting (raoulvdberge) +- Added an option for the Crafter to trigger autocrafting with a redstone signal (raoulvdberge) ### 1.0 **NOTE:** Due to the new crafting system, all Crafting Patterns made before 1.0 have to be re-made. diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java index 039774ed3..ea787b03c 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java @@ -3,6 +3,8 @@ package refinedstorage.api.autocrafting; import net.minecraft.util.math.BlockPos; import net.minecraftforge.items.IItemHandler; +import java.util.List; + /** * Represents the container where a crafting pattern is in. */ @@ -22,7 +24,7 @@ public interface ICraftingPatternContainer { /** * @return the patterns stored in this container */ - IItemHandler getPatterns(); + List getPatterns(); /** * @return the position of this container diff --git a/src/main/java/refinedstorage/container/ContainerCrafter.java b/src/main/java/refinedstorage/container/ContainerCrafter.java index c7d44e702..46354df4c 100755 --- a/src/main/java/refinedstorage/container/ContainerCrafter.java +++ b/src/main/java/refinedstorage/container/ContainerCrafter.java @@ -11,7 +11,7 @@ public class ContainerCrafter extends ContainerBase { super(crafter, player); for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotItemHandler(crafter.getPatterns(), i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotItemHandler(crafter.getPatternItems(), i, 8 + (18 * i), 20)); } for (int i = 0; i < 4; ++i) { diff --git a/src/main/java/refinedstorage/gui/GuiCrafter.java b/src/main/java/refinedstorage/gui/GuiCrafter.java index 7f578ebb3..c25f9d12d 100755 --- a/src/main/java/refinedstorage/gui/GuiCrafter.java +++ b/src/main/java/refinedstorage/gui/GuiCrafter.java @@ -1,6 +1,7 @@ package refinedstorage.gui; import refinedstorage.container.ContainerCrafter; +import refinedstorage.gui.sidebutton.SideButtonCrafterAutocraftSignal; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.tile.TileCrafter; @@ -12,6 +13,7 @@ public class GuiCrafter extends GuiBase { @Override public void init(int x, int y) { addSideButton(new SideButtonRedstoneMode(TileCrafter.REDSTONE_MODE)); + addSideButton(new SideButtonCrafterAutocraftSignal()); } @Override diff --git a/src/main/java/refinedstorage/gui/sidebutton/SideButtonCrafterAutocraftSignal.java b/src/main/java/refinedstorage/gui/sidebutton/SideButtonCrafterAutocraftSignal.java new file mode 100755 index 000000000..dc1fb957f --- /dev/null +++ b/src/main/java/refinedstorage/gui/sidebutton/SideButtonCrafterAutocraftSignal.java @@ -0,0 +1,24 @@ +package refinedstorage.gui.sidebutton; + +import net.minecraft.util.text.TextFormatting; +import refinedstorage.gui.GuiBase; +import refinedstorage.tile.TileCrafter; +import refinedstorage.tile.data.TileDataManager; + +public class SideButtonCrafterAutocraftSignal extends SideButton { + @Override + public String getTooltip(GuiBase gui) { + return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:crafter.autocraft_signal") + TextFormatting.RESET + "\n" + gui.t("gui." + (TileCrafter.AUTOCRAFT_SIGNAL.getValue() ? "yes" : "no")); + } + + @Override + public void draw(GuiBase gui, int x, int y) { + gui.bindTexture("icons.png"); + gui.drawTexture(x, y + 2 - 1, 0, 144, 16, 16); + } + + @Override + public void actionPerformed() { + TileDataManager.setParameter(TileCrafter.AUTOCRAFT_SIGNAL, !TileCrafter.AUTOCRAFT_SIGNAL.getValue()); + } +} diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index 2c0692628..77aca3aee 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -466,19 +466,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR for (INetworkNode node : nodeGraph.all()) { if (node instanceof ICraftingPatternContainer && node.canUpdate()) { - ICraftingPatternContainer container = (ICraftingPatternContainer) node; - - for (int i = 0; i < container.getPatterns().getSlots(); ++i) { - ItemStack stack = container.getPatterns().getStackInSlot(i); - - if (stack != null) { - ICraftingPattern pattern = ((ICraftingPatternProvider) stack.getItem()).create(worldObj, stack, container); - - if (pattern.isValid()) { - patterns.add(pattern); - } - } - } + patterns.addAll(((ICraftingPatternContainer) node).getPatterns()); } } diff --git a/src/main/java/refinedstorage/tile/TileCrafter.java b/src/main/java/refinedstorage/tile/TileCrafter.java index 231be5fc2..3754aa245 100755 --- a/src/main/java/refinedstorage/tile/TileCrafter.java +++ b/src/main/java/refinedstorage/tile/TileCrafter.java @@ -1,33 +1,88 @@ package refinedstorage.tile; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; 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.wrapper.CombinedInvWrapper; import refinedstorage.RefinedStorage; +import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingPatternContainer; import refinedstorage.api.autocrafting.ICraftingPatternProvider; import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.inventory.ItemHandlerBasic; import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemUpgrade; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; + +import java.util.ArrayList; +import java.util.List; public class TileCrafter extends TileNode implements ICraftingPatternContainer { + public static final TileDataParameter AUTOCRAFT_SIGNAL = new TileDataParameter<>(DataSerializers.BOOLEAN, false, new ITileDataProducer() { + @Override + public Boolean getValue(TileCrafter tile) { + return tile.autocraftSignal; + } + }, new ITileDataConsumer() { + @Override + public void setValue(TileCrafter tile, Boolean value) { + tile.autocraftSignal = value; + + tile.markDirty(); + } + }); + + private static final String NBT_AUTOCRAFT_SIGNAL = "AutocraftSignal"; + private ItemHandlerBasic patterns = new ItemHandlerBasic(9, this, stack -> stack.getItem() instanceof ICraftingPatternProvider) { @Override protected void onContentsChanged(int slot) { super.onContentsChanged(slot); + if (worldObj != null) { + rebuildPatterns(); + } + if (network != null) { network.rebuildPatterns(); } } }; + private List actualPatterns = new ArrayList<>(); + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED); + private boolean autocraftSignal = false; + + public TileCrafter() { + dataManager.addWatchedParameter(AUTOCRAFT_SIGNAL); + } + + private void rebuildPatterns() { + actualPatterns.clear(); + + for (int i = 0; i < patterns.getSlots(); ++i) { + ItemStack patternStack = patterns.getStackInSlot(i); + + if (patternStack != null) { + ICraftingPattern pattern = ((ICraftingPatternProvider) patternStack.getItem()).create(worldObj, patternStack, this); + + if (pattern.isValid()) { + actualPatterns.add(pattern); + } + } + } + } + @Override public int getEnergyUsage() { int usage = RefinedStorage.INSTANCE.crafterUsage + upgrades.getEnergyUsage(); @@ -41,8 +96,24 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer { return usage; } + @Override + public void update() { + if (ticks == 0) { + rebuildPatterns(); + } + + super.update(); + } + @Override public void updateNode() { + if (autocraftSignal && worldObj.isBlockPowered(pos)) { + for (ICraftingPattern pattern : actualPatterns) { + for (ItemStack output : pattern.getOutputs()) { + NetworkUtils.scheduleCraftingTaskIfUnscheduled(network, output, 1, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); + } + } + } } @Override @@ -60,6 +131,10 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer { public void read(NBTTagCompound tag) { super.read(tag); + if (tag.hasKey(NBT_AUTOCRAFT_SIGNAL)) { + autocraftSignal = tag.getBoolean(NBT_AUTOCRAFT_SIGNAL); + } + readItems(patterns, 0, tag); readItems(upgrades, 1, tag); } @@ -68,6 +143,8 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer { public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); + tag.setBoolean(NBT_AUTOCRAFT_SIGNAL, autocraftSignal); + writeItems(patterns, 0, tag); writeItems(upgrades, 1, tag); @@ -85,7 +162,11 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer { } @Override - public IItemHandler getPatterns() { + public List getPatterns() { + return actualPatterns; + } + + public IItemHandler getPatternItems() { return patterns; } diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 3bf9f90c2..29863d3b6 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -104,6 +104,8 @@ sidebutton.refinedstorage:detector.mode.1=Emit signal when on the amount sidebutton.refinedstorage:detector.mode.2=Emit signal when above the amount sidebutton.refinedstorage:detector.mode.3=Emit signal when is autocrafting +sidebutton.refinedstorage:crafter.autocraft_signal=Trigger autocrafting with redstone signal + block.refinedstorage:controller.0.name=Controller block.refinedstorage:controller.1.name=Creative Controller block.refinedstorage:cable.name=Cable diff --git a/src/main/resources/assets/refinedstorage/textures/icons.png b/src/main/resources/assets/refinedstorage/textures/icons.png index 4ebdc05d5..21389c3c3 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/icons.png and b/src/main/resources/assets/refinedstorage/textures/icons.png differ