diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java index 8cf4a5a1c..ffa3a5022 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.api; +import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternRenderHandler; import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementList; import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry; @@ -29,6 +30,7 @@ import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; +import java.util.List; /** * Represents a Refined Storage API implementation. @@ -166,6 +168,16 @@ public interface IRSAPI { @Nonnull IOneSixMigrationHelper getOneSixMigrationHelper(); + /** + * @param renderHandler the render handler to add + */ + void addPatternRenderHandler(ICraftingPatternRenderHandler renderHandler); + + /** + * @return a list of pattern render handlers + */ + List getPatternRenderHandlers(); + /** * Opens a wireless grid for the given player. * diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternRenderHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternRenderHandler.java new file mode 100644 index 000000000..d79a3026b --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternRenderHandler.java @@ -0,0 +1,18 @@ +package com.raoulvdberge.refinedstorage.api.autocrafting; + +import net.minecraft.item.ItemStack; + +/** + * Defines the behavior of pattern rendering. + * One can add this interface through {@link com.raoulvdberge.refinedstorage.api.IRSAPI#addPatternRenderHandler(ICraftingPatternRenderHandler)}. + */ +public interface ICraftingPatternRenderHandler { + /** + * Returns true if the pattern can render its output. + * As soon as one {@link ICraftingPatternRenderHandler} returns true for this method, it will render the output. + * + * @param pattern the pattern + * @return true if this pattern can render its output, false otherwise + */ + boolean canRenderOutput(ItemStack pattern); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java index 1dfcf32ff..b8dec6c05 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java @@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.api.IRSAPI; import com.raoulvdberge.refinedstorage.api.RSAPIInject; +import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternRenderHandler; import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementList; import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry; @@ -54,6 +55,8 @@ import net.minecraftforge.fml.common.discovery.ASMDataTable; import javax.annotation.Nonnull; import java.lang.reflect.Field; +import java.util.LinkedList; +import java.util.List; import java.util.Set; public class API implements IRSAPI { @@ -71,6 +74,7 @@ public class API implements IRSAPI { private IStorageDiskRegistry storageDiskRegistry = new StorageDiskRegistry(); private IStorageDiskSync storageDiskSync = new StorageDiskSync(); private IOneSixMigrationHelper oneSixMigrationHelper = new OneSixMigrationHelper(); + private List patternRenderHandlers = new LinkedList<>(); public static IRSAPI instance() { return INSTANCE; @@ -239,10 +243,21 @@ public class API implements IRSAPI { } @Override + @Nonnull public IOneSixMigrationHelper getOneSixMigrationHelper() { return oneSixMigrationHelper; } + @Override + public void addPatternRenderHandler(ICraftingPatternRenderHandler renderHandler) { + patternRenderHandlers.add(renderHandler); + } + + @Override + public List getPatternRenderHandlers() { + return patternRenderHandlers; + } + @Override public void openWirelessGrid(EntityPlayer player, EnumHand hand, int networkDimension, int id) { player.openGui(RS.INSTANCE, RSGui.WIRELESS_GRID, player.getEntityWorld(), hand.ordinal(), networkDimension, id); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java index eb664fcd6..e18480e4e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java @@ -28,6 +28,10 @@ import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskFactoryIt import com.raoulvdberge.refinedstorage.apiimpl.util.OneSixMigrationHelper; import com.raoulvdberge.refinedstorage.block.BlockBase; import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; +import com.raoulvdberge.refinedstorage.container.ContainerCrafter; +import com.raoulvdberge.refinedstorage.container.ContainerCrafterManager; +import com.raoulvdberge.refinedstorage.container.slot.SlotCrafterManager; +import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.gui.GuiHandler; import com.raoulvdberge.refinedstorage.integration.craftingtweaks.IntegrationCraftingTweaks; import com.raoulvdberge.refinedstorage.integration.forgeenergy.ReaderWriterHandlerForgeEnergy; @@ -47,9 +51,12 @@ import com.raoulvdberge.refinedstorage.tile.grid.portable.PortableGrid; import com.raoulvdberge.refinedstorage.tile.grid.portable.TilePortableGrid; import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentData; import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemEnchantedBook; import net.minecraft.item.ItemStack; @@ -104,6 +111,34 @@ public class ProxyCommon { API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementFluidStack.ID, CraftingPreviewElementFluidStack::fromByteBuf); API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementError.ID, CraftingPreviewElementError::fromByteBuf); + API.instance().addPatternRenderHandler(pattern -> GuiBase.isShiftKeyDown()); + API.instance().addPatternRenderHandler(pattern -> { + Container container = Minecraft.getMinecraft().player.openContainer; + + if (container instanceof ContainerCrafterManager) { + for (Slot slot : container.inventorySlots) { + if (slot instanceof SlotCrafterManager && slot.getStack() == pattern) { + return true; + } + } + } + + return false; + }); + API.instance().addPatternRenderHandler(pattern -> { + Container container = Minecraft.getMinecraft().player.openContainer; + + if (container instanceof ContainerCrafter) { + for (int i = 0; i < 9; ++i) { + if (container.getSlot(i).getStack() == pattern) { + return true; + } + } + } + + return false; + }); + API.instance().getReaderWriterHandlerRegistry().add(ReaderWriterHandlerItems.ID, ReaderWriterHandlerItems::new); API.instance().getReaderWriterHandlerRegistry().add(ReaderWriterHandlerFluids.ID, ReaderWriterHandlerFluids::new); API.instance().getReaderWriterHandlerRegistry().add(ReaderWriterHandlerRedstone.ID, tag -> new ReaderWriterHandlerRedstone()); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelPattern.java index fabb0d123..b221e2b0d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelPattern.java @@ -1,10 +1,8 @@ package com.raoulvdberge.refinedstorage.render; +import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternRenderHandler; +import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.CraftingPattern; -import com.raoulvdberge.refinedstorage.container.ContainerCrafter; -import com.raoulvdberge.refinedstorage.container.ContainerCrafterManager; -import com.raoulvdberge.refinedstorage.container.slot.SlotCrafterManager; -import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.item.ItemPattern; import com.raoulvdberge.refinedstorage.util.RenderUtils; import net.minecraft.block.state.IBlockState; @@ -15,8 +13,6 @@ import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.block.model.ItemOverrideList; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; @@ -89,21 +85,9 @@ public class BakedModelPattern implements IBakedModel { } public static boolean canDisplayPatternOutput(ItemStack patternStack, CraftingPattern pattern) { - return (GuiBase.isShiftKeyDown() || isPatternInDisplaySlot(patternStack)) && pattern.isValid() && pattern.getOutputs().size() == 1; - } - - public static boolean isPatternInDisplaySlot(ItemStack stack) { - Container container = Minecraft.getMinecraft().player.openContainer; - - if (container instanceof ContainerCrafterManager) { - for (Slot slot : container.inventorySlots) { - if (slot instanceof SlotCrafterManager && slot.getStack() == stack) { - return true; - } - } - } else if (container instanceof ContainerCrafter) { - for (int i = 0; i < 9; ++i) { - if (container.getSlot(i).getStack() == stack) { + if (pattern.isValid() && pattern.getOutputs().size() == 1) { + for (ICraftingPatternRenderHandler renderHandler : API.instance().getPatternRenderHandlers()) { + if (renderHandler.canRenderOutput(patternStack)) { return true; } }