From d41d49e0342185ffd0a5ed61edce792c14748cac Mon Sep 17 00:00:00 2001 From: Integer Limit <103940576+IntegerLimit@users.noreply.github.com> Date: Sat, 4 Jan 2025 16:31:40 +1100 Subject: [PATCH] Recipe Outputs in TOP + Separate RF Producer --- README.md | 1 + .../java/com/nomiceu/nomilabs/LabsValues.java | 1 + .../nomiceu/nomilabs/config/LabsConfig.java | 24 +++ .../AccessibleAbstractRecipeLogic.java | 15 ++ .../top/LabsFluidStackElement.java | 98 +++++++++++ .../integration/top/LabsRFInfoProvider.java | 92 ++++++++++ .../integration/top/LabsTOPManager.java | 6 + .../top/RecipeOutputsProvider.java | 157 ++++++++++++++++++ .../gregtech/AbstractRecipeLogicMixin.java | 49 ++++++ .../com/nomiceu/nomilabs/util/ItemMeta.java | 6 +- .../resources/assets/nomilabs/lang/en_us.lang | 7 + .../resources/mixins.nomilabs.gregtech.json | 1 + 12 files changed, 456 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/nomiceu/nomilabs/gregtech/mixinhelper/AccessibleAbstractRecipeLogic.java create mode 100644 src/main/java/com/nomiceu/nomilabs/integration/top/LabsFluidStackElement.java create mode 100644 src/main/java/com/nomiceu/nomilabs/integration/top/LabsRFInfoProvider.java create mode 100644 src/main/java/com/nomiceu/nomilabs/integration/top/RecipeOutputsProvider.java create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/gregtech/AbstractRecipeLogicMixin.java diff --git a/README.md b/README.md index fe133785..709cbf75 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ This mod requires [GregTech CEu](https://github.com/GregTechCEu/GregTech). Other ## Credits: - [GTCEu Buildscripts](https://github.com/GregTechCEu/Buildscripts) for the amazing buildscripts +- [GregicProbeCEu](https://github.com/Supernoobv/GregicProbeCEu) for base FluidStack element and base recipe outputs implementation (integrated in Labs for localization and display improvements and easier future GT porting) - [Actually Additions](https://github.com/Ellpeck/ActuallyAdditions) for part of the custom fluid code - [Content Tweaker](https://github.com/CraftTweaker/ContentTweaker) for base textures of custom fluids - [Nomifactory](https://github.com/Nomifactory/Nomifactory) for textures of items, blocks, base code, and the original pack diff --git a/src/main/java/com/nomiceu/nomilabs/LabsValues.java b/src/main/java/com/nomiceu/nomilabs/LabsValues.java index 4a995067..550b9e59 100644 --- a/src/main/java/com/nomiceu/nomilabs/LabsValues.java +++ b/src/main/java/com/nomiceu/nomilabs/LabsValues.java @@ -47,4 +47,5 @@ public class LabsValues { public static final String THERMAL_FOUNDATION_MODID = "thermalfoundation"; public static final String BETTER_P2P_MODID = "betterp2p"; public static final String FIND_ME_MODID = "findme"; + public static final String REDSTONE_FLUX_MODID = "redstoneflux"; } diff --git a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java index 5d618e59..44da34ac 100644 --- a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java +++ b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java @@ -24,6 +24,11 @@ public class LabsConfig { @Config.Name("mod integration") public static ModIntegration modIntegration = new ModIntegration(); + @Config.Comment("The One Probe Settings") + @Config.LangKey("config.nomilabs.top") + @Config.Name("top settings") + public static TheOneProbeSettings topSettings = new TheOneProbeSettings(); + @Config.Comment("Advanced Settings") @Config.LangKey("config.nomilabs.advanced") @Config.Name("advanced") @@ -182,6 +187,25 @@ public enum GTRecipeSearchMode { } } + public static class TheOneProbeSettings { + + @Config.Comment({ + "Mode to enable Labs' RF Provider. Behaviour is the same as TOP's, but allows for rearranging the RF bar.", + "You will have to set TOP's 'RF Mode' to 0.", + "0: Disable, 1: Show as Bar, 2: Show as Text", + "[default: 0]" }) + @Config.LangKey("config.nomilabs.top.rf_provider") + @Config.RangeInt(min = 0, max = 2) + public int rfProviderMode = 0; + + @Config.Comment({ + "Enable Display of GT Recipe Outputs in TOP.", + "[default: true]" + }) + @Config.LangKey("config.nomilabs.top.gt_recipe_output") + public boolean enableGTRecipeOutput = true; + } + public static class ModIntegration { @Config.Comment({ "Whether to enable NuclearCraft Integration, which fixes its crash with GTCEu.", diff --git a/src/main/java/com/nomiceu/nomilabs/gregtech/mixinhelper/AccessibleAbstractRecipeLogic.java b/src/main/java/com/nomiceu/nomilabs/gregtech/mixinhelper/AccessibleAbstractRecipeLogic.java new file mode 100644 index 00000000..81ed9dc1 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/gregtech/mixinhelper/AccessibleAbstractRecipeLogic.java @@ -0,0 +1,15 @@ +package com.nomiceu.nomilabs.gregtech.mixinhelper; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +public interface AccessibleAbstractRecipeLogic { + + List labs$getOutputs(); + + List labs$getFluidOutputs(); + + int labs$getEUt(); +} diff --git a/src/main/java/com/nomiceu/nomilabs/integration/top/LabsFluidStackElement.java b/src/main/java/com/nomiceu/nomilabs/integration/top/LabsFluidStackElement.java new file mode 100644 index 00000000..914a6338 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/integration/top/LabsFluidStackElement.java @@ -0,0 +1,98 @@ +package com.nomiceu.nomilabs.integration.top; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import gregtech.api.util.TextFormattingUtil; +import gregtech.client.utils.RenderUtil; +import io.netty.buffer.ByteBuf; +import mcjty.theoneprobe.api.IElement; +import mcjty.theoneprobe.network.NetworkTools; + +/** + * From GregicProbe. + */ +public class LabsFluidStackElement implements IElement { + + private final String location; + private final int color; + private final int amount; + + private TextureAtlasSprite sprite = null; + + public LabsFluidStackElement(@NotNull FluidStack stack) { + this.location = stack.getFluid().getStill(stack).toString(); + this.color = stack.getFluid().getColor(stack); + this.amount = stack.amount; + } + + public LabsFluidStackElement(@NotNull ByteBuf buf) { + this.location = NetworkTools.readStringUTF8(buf); + this.color = buf.readInt(); + this.amount = buf.readInt(); + } + + @Override + public void render(int x, int y) { + String actualLocation = location; + + // Gregtech fluids added by GRS do this for some reason + // As a consequence the fluid texture from /dull will not show up on anything from GRS. + if (location.contains("material_sets/fluid/") && (location.contains("/gas") || location.contains("/plasma"))) { + actualLocation = location.replace("material_sets/fluid/", "material_sets/dull/"); + } + + if (sprite == null) { + sprite = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(actualLocation); + } + + GlStateManager.enableBlend(); + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); + + RenderUtil.setGlColorFromInt(color, 0xFF); + RenderUtil.drawFluidTexture(x + 1, y - 1, sprite, 2, 2, 0); + + if (amount > 0) { + GlStateManager.pushMatrix(); + GlStateManager.scale(0.5, 0.5, 1); + Minecraft minecraft = Minecraft.getMinecraft(); + String format = TextFormattingUtil.formatLongToCompactString(amount) + "L"; + minecraft.fontRenderer.drawStringWithShadow( + format, + (x + 16) * 2 - minecraft.fontRenderer.getStringWidth(format), + (y + 16) * 2 - minecraft.fontRenderer.FONT_HEIGHT, + 0xFFFFFF); + GlStateManager.popMatrix(); + } + + GlStateManager.disableBlend(); + } + + @Override + public int getWidth() { + return 16; + } + + @Override + public int getHeight() { + return 16; + } + + @Override + public void toBytes(@NotNull ByteBuf buf) { + NetworkTools.writeStringUTF8(buf, location); + buf.writeInt(color); + buf.writeInt(amount); + } + + @Override + public int getID() { + return LabsTOPManager.FLUID_STACK_ELEMENT; + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/integration/top/LabsRFInfoProvider.java b/src/main/java/com/nomiceu/nomilabs/integration/top/LabsRFInfoProvider.java new file mode 100644 index 00000000..d05899d0 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/integration/top/LabsRFInfoProvider.java @@ -0,0 +1,92 @@ +package com.nomiceu.nomilabs.integration.top; + +import static mcjty.theoneprobe.api.TextStyleClass.PROGRESS; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.energy.IEnergyStorage; +import net.minecraftforge.fml.common.Loader; + +import com.nomiceu.nomilabs.LabsValues; +import com.nomiceu.nomilabs.config.LabsConfig; + +import mcjty.lib.api.power.IBigPower; +import mcjty.theoneprobe.api.IProbeHitData; +import mcjty.theoneprobe.api.IProbeInfo; +import mcjty.theoneprobe.api.IProbeInfoProvider; +import mcjty.theoneprobe.api.ProbeMode; +import mcjty.theoneprobe.apiimpl.elements.ElementProgress; +import mcjty.theoneprobe.compat.RedstoneFluxTools; +import mcjty.theoneprobe.config.Config; + +/** + * A duplicate of TOP RF Info Provider Logic, but separate + * Allows for rearranging the RF bar. + */ +public class LabsRFInfoProvider implements IProbeInfoProvider { + + @Override + public String getID() { + return LabsValues.LABS_MODID + ":rf_provider"; + } + + @Override + public void addProbeInfo(ProbeMode mode, IProbeInfo info, EntityPlayer player, World world, IBlockState state, + IProbeHitData data) { + if (LabsConfig.topSettings.rfProviderMode == 0) return; + + TileEntity te = world.getTileEntity(data.getPos()); + if (te == null) return; + + if (te instanceof IBigPower) { + long energy = ((IBigPower) te).getStoredPower(); + long maxEnergy = ((IBigPower) te).getCapacity(); + addRFInfo(info, LabsConfig.topSettings.rfProviderMode, energy, maxEnergy); + return; + } + + if (Loader.isModLoaded(LabsValues.REDSTONE_FLUX_MODID) && RedstoneFluxTools.isEnergyHandler(te)) { + int energy = RedstoneFluxTools.getEnergy(te); + int maxEnergy = RedstoneFluxTools.getMaxEnergy(te); + addRFInfo(info, LabsConfig.topSettings.rfProviderMode, energy, maxEnergy); + return; + } + + if (te.hasCapability(CapabilityEnergy.ENERGY, null)) { + IEnergyStorage handler = te.getCapability(CapabilityEnergy.ENERGY, null); + if (handler != null) { + addRFInfo(info, LabsConfig.topSettings.rfProviderMode, handler.getEnergyStored(), + handler.getMaxEnergyStored()); + } + } + } + + /** + * Adds information about Redstone Flux energy based on the given configuration. + * If the RF mode in the configuration is set to 1, a progress bar is displayed with specific styling. + * Otherwise, a text representation of the RF energy is shown. + * + * @author McJty + * + * @param probeInfo The {@link IProbeInfo} object to which the RF information will be added. + * @param rfMode Mode to display RF in. + * @param energy The current amount of RF energy. + * @param maxEnergy The maximum capacity of RF energy. + */ + private void addRFInfo(IProbeInfo probeInfo, int rfMode, long energy, long maxEnergy) { + if (rfMode == 1) { + probeInfo.progress(energy, maxEnergy, + probeInfo.defaultProgressStyle() + .suffix("RF") + .filledColor(Config.rfbarFilledColor) + .alternateFilledColor(Config.rfbarAlternateFilledColor) + .borderColor(Config.rfbarBorderColor) + .numberFormat(Config.rfFormat)); + } else { + probeInfo.text(PROGRESS + "RF: " + ElementProgress.format(energy, Config.rfFormat, "RF")); + } + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/integration/top/LabsTOPManager.java b/src/main/java/com/nomiceu/nomilabs/integration/top/LabsTOPManager.java index 9a0c9aa9..121c6466 100644 --- a/src/main/java/com/nomiceu/nomilabs/integration/top/LabsTOPManager.java +++ b/src/main/java/com/nomiceu/nomilabs/integration/top/LabsTOPManager.java @@ -15,6 +15,7 @@ public class LabsTOPManager { public static int FLUID_NAME_ELEMENT; public static int CUSTOM_NAME_ELEMENT; + public static int FLUID_STACK_ELEMENT; public static void register() { ITheOneProbe TOP = TheOneProbe.theOneProbeImp; @@ -25,12 +26,17 @@ public static void register() { // GT TOP Integration TOP.registerProvider(new SteamMachineInfoProvider()); + TOP.registerProvider(new RecipeOutputsProvider()); // Labs TOP Integration TOP.registerProvider(new TOPTooltipMessage()); + // General TOP Integration + TOP.registerProvider(new LabsRFInfoProvider()); + FLUID_NAME_ELEMENT = TOP.registerElementFactory(LabsFluidNameElement::new); CUSTOM_NAME_ELEMENT = TOP.registerElementFactory(CustomNameElement::new); + FLUID_STACK_ELEMENT = TOP.registerElementFactory(LabsFluidStackElement::new); } public static class TOPTooltipMessage implements IProbeInfoProvider { diff --git a/src/main/java/com/nomiceu/nomilabs/integration/top/RecipeOutputsProvider.java b/src/main/java/com/nomiceu/nomilabs/integration/top/RecipeOutputsProvider.java new file mode 100644 index 00000000..b530aa7c --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/integration/top/RecipeOutputsProvider.java @@ -0,0 +1,157 @@ +package com.nomiceu.nomilabs.integration.top; + +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.nomiceu.nomilabs.LabsValues; +import com.nomiceu.nomilabs.config.LabsConfig; +import com.nomiceu.nomilabs.gregtech.mixinhelper.AccessibleAbstractRecipeLogic; +import com.nomiceu.nomilabs.util.ItemMeta; +import com.nomiceu.nomilabs.util.LabsTranslate; + +import gregtech.api.capability.GregtechTileCapabilities; +import gregtech.api.capability.IWorkable; +import gregtech.integration.theoneprobe.provider.CapabilityInfoProvider; +import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; +import mcjty.theoneprobe.api.*; +import mcjty.theoneprobe.apiimpl.styles.ItemStyle; +import mcjty.theoneprobe.apiimpl.styles.LayoutStyle; +import mcjty.theoneprobe.config.Config; + +public class RecipeOutputsProvider extends CapabilityInfoProvider { + + private static final int AMT_IN_ROW = 10; + + @Override + public String getID() { + return LabsValues.LABS_MODID + ":recipe_outputs"; + } + + @Override + protected @NotNull Capability getCapability() { + return GregtechTileCapabilities.CAPABILITY_WORKABLE; + } + + @Override + protected void addProbeInfo(IWorkable capability, IProbeInfo info, EntityPlayer player, TileEntity tile, + IProbeHitData data) { + if (!LabsConfig.topSettings.enableGTRecipeOutput) return; + + if (capability.getProgress() <= 0 || (!(capability instanceof AccessibleAbstractRecipeLogic recipe))) return; + + // Generators, Ignore + if (recipe.labs$getEUt() < 0) return; + + var outputs = getUniqueItems(recipe.labs$getOutputs()); + var fluidOutputs = getUniqueFluids(recipe.labs$getFluidOutputs()); + + if (outputs.isEmpty() && fluidOutputs.isEmpty()) return; + + boolean showDetailed = outputs.size() + fluidOutputs.size() <= Config.showItemDetailThresshold && + player.isSneaking(); + IProbeInfo mainPanel = info.vertical() + .text(LabsTranslate.topTranslate("nomilabs.top.recipe_outputs")) + .vertical(info.defaultLayoutStyle().borderColor(Config.chestContentsBorderColor) + .spacing(5)); + + if (showDetailed) { + for (var entry : outputs.entrySet()) { + ItemStack stack = entry.getKey().toStack(entry.getValue()); + mainPanel.horizontal(new LayoutStyle().spacing(10).alignment(ElementAlignment.ALIGN_CENTER)) + .item(stack, new ItemStyle().width(16).height(16)) + .text(TextStyleClass.INFO + stack.getDisplayName()); + } + + for (var entry : fluidOutputs.entrySet()) { + FluidStack stack = new FluidStack(entry.getKey(), entry.getValue()); + mainPanel.horizontal(new LayoutStyle().spacing(10).alignment(ElementAlignment.ALIGN_CENTER)) + .element(new LabsFluidStackElement(stack)) + .element(new LabsFluidNameElement(stack, false)); + } + return; + } + + // If outputs and fluid outputs are both of size 1, show on same row instead of over two rows + boolean condense = outputs.size() == 1 && fluidOutputs.size() == 1; + IProbeInfo sharedHorizontal = null; + + if (condense) + sharedHorizontal = createHorizontalLayout(mainPanel); + + if (!outputs.isEmpty()) { + IProbeInfo panel; + if (condense) + panel = sharedHorizontal; + else + panel = createHorizontalLayout(mainPanel); + + addOutputs(outputs, (meta, amt) -> panel.item(meta.toStack(amt), new ItemStyle().width(16).height(16))); + } + + if (!fluidOutputs.isEmpty()) { + IProbeInfo panel; + if (condense) + panel = sharedHorizontal; + else + panel = createHorizontalLayout(mainPanel); + + addOutputs(fluidOutputs, + (fluid, amount) -> panel.element(new LabsFluidStackElement(new FluidStack(fluid, amount)))); + } + } + + private void addOutputs(Map outputs, BiConsumer addToPanel) { + int idx = 0; + + for (var output : outputs.entrySet()) { + if (idx >= AMT_IN_ROW) break; + + addToPanel.accept(output.getKey(), output.getValue()); + idx++; + } + } + + private IProbeInfo createHorizontalLayout(IProbeInfo mainPanel) { + return mainPanel.horizontal(new LayoutStyle().spacing(4)); + } + + private Map getUniqueItems(List stacks) { + Map map = new Object2ObjectLinkedOpenHashMap<>(); + + for (var stack : stacks) { + if (stack.isEmpty()) continue; + + map.compute(new ItemMeta(stack), (meta, count) -> { + if (count == null) count = 0; + return count + stack.getCount(); + }); + } + + return map; + } + + private Map getUniqueFluids(List stacks) { + Map map = new Object2ObjectLinkedOpenHashMap<>(); + + for (var stack : stacks) { + if (stack.amount == 0) continue; + + map.compute(stack.getFluid(), (meta, amount) -> { + if (amount == null) amount = 0; + return amount + stack.amount; + }); + } + + return map; + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/gregtech/AbstractRecipeLogicMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/gregtech/AbstractRecipeLogicMixin.java new file mode 100644 index 00000000..38d48a08 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/gregtech/AbstractRecipeLogicMixin.java @@ -0,0 +1,49 @@ +package com.nomiceu.nomilabs.mixin.gregtech; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; +import net.minecraftforge.fluids.FluidStack; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import com.nomiceu.nomilabs.gregtech.mixinhelper.AccessibleAbstractRecipeLogic; + +import gregtech.api.capability.impl.AbstractRecipeLogic; + +/** + * Allows accessing outputs/fluid outputs. + */ +@Mixin(value = AbstractRecipeLogic.class, remap = false) +public class AbstractRecipeLogicMixin implements AccessibleAbstractRecipeLogic { + + @Shadow + protected NonNullList itemOutputs; + + @Shadow + protected List fluidOutputs; + + @Shadow + protected int recipeEUt; + + @Unique + @Override + public List labs$getOutputs() { + return itemOutputs; + } + + @Unique + @Override + public List labs$getFluidOutputs() { + return fluidOutputs; + } + + @Unique + @Override + public int labs$getEUt() { + return recipeEUt; + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/util/ItemMeta.java b/src/main/java/com/nomiceu/nomilabs/util/ItemMeta.java index a202792c..b166e09d 100644 --- a/src/main/java/com/nomiceu/nomilabs/util/ItemMeta.java +++ b/src/main/java/com/nomiceu/nomilabs/util/ItemMeta.java @@ -42,7 +42,11 @@ public static boolean compare(ItemStack a, ItemStack b) { } public ItemStack toStack() { - return new ItemStack(item, 1, meta); + return toStack(1); + } + + public ItemStack toStack(int amount) { + return new ItemStack(item, amount, meta); } public Item getItem() { diff --git a/src/main/resources/assets/nomilabs/lang/en_us.lang b/src/main/resources/assets/nomilabs/lang/en_us.lang index 912175ea..83c94efc 100644 --- a/src/main/resources/assets/nomilabs/lang/en_us.lang +++ b/src/main/resources/assets/nomilabs/lang/en_us.lang @@ -80,6 +80,11 @@ config.nomilabs.groovy.tooltip=GroovyScript Extensions and Script Helper Setting config.nomilabs.groovy.hand=Enable GroovyScript Hand Command Additions config.nomilabs.groovy.recipe_search_mode=GregTech Recipe Output Search Mode +config.nomilabs.top=The One Probe Settings +config.nomilabs.top.tooltip=The One Probe Settings +config.nomilabs.top.rf_provider=Labs RF Provider Mode +config.nomilabs.top.gt_recipe_output=Show GT Machine Recipe Outputs + config.nomilabs.mod_integration.draconicevolution=Draconic Evolution Integration Settings config.nomilabs.mod_integration.draconicevolution.tooltip=Draconic Evolution Integration Settings config.nomilabs.mod_integration.draconicevolution.enable=Enable Draconic Evolution Integration @@ -144,6 +149,8 @@ nomilabs.top.steam_cooling_down=Cooling Down nomilabs.top.steam_venting_stuck.1=Steam Vent Blocked! nomilabs.top.steam_venting_stuck.2=Use a Wrench to Change Vent Direction! +nomilabs.top.recipe_outputs=Producing: + nomilabs.gui.recipes.tooltip.ct_recipe=CraftTweaker Created Recipe nomilabs.gui.recipes.tooltip.gs_recipe=GroovyScript Created Recipe diff --git a/src/main/resources/mixins.nomilabs.gregtech.json b/src/main/resources/mixins.nomilabs.gregtech.json index f190d8a2..8a5f0e4f 100644 --- a/src/main/resources/mixins.nomilabs.gregtech.json +++ b/src/main/resources/mixins.nomilabs.gregtech.json @@ -5,6 +5,7 @@ "minVersion": "0.8", "compatibilityLevel": "JAVA_8", "mixins": [ + "AbstractRecipeLogicMixin", "AccessibleDecompositionRecipeHandler", "AccessibleMaterialInfo", "AccessibleModHandler",