Skip to content

Commit

Permalink
Show melter recipes in their own JEI tab by default
Browse files Browse the repository at this point in the history
This makes the overrides and blacklist more clear to the end user, which should help with #31. Also, it makes it more clear when solid fuel can be used for a recipe. This feature can be disabled if desired, as most times its redundant.
  • Loading branch information
KnightMiner committed Jan 6, 2019
1 parent df3f288 commit 223f44b
Show file tree
Hide file tree
Showing 8 changed files with 259 additions and 4 deletions.
5 changes: 5 additions & 0 deletions src/main/java/knightminer/tcomplement/common/Config.java
Expand Up @@ -18,6 +18,7 @@ public class Config {

public static float oreToIngotRatio = 1.0f;
public static boolean blacklistMelterStone = true;
public static boolean separateMelterTab = true;


static Configuration configFile;
Expand All @@ -31,6 +32,10 @@ public static void load(FMLPreInitializationEvent event) {
oreToIngotRatio = configFile.getFloat("oreToIngotRatio", "melter", 1.0f, 0f, 16.0f,
"Ratio of ore to material produced in the melter.");

// jei
separateMelterTab = configFile.getBoolean("separateMelterTab", "jei", true,
"If true, puts the melter in its own recipe tab in JEI to make the blacklist and overrides more clear. If false, the melter is just added to the normal Tinkers tab.");

if(configFile.hasChanged()) {
configFile.save();
}
Expand Down
53 changes: 53 additions & 0 deletions src/main/java/knightminer/tcomplement/library/TCompRegistry.java
Expand Up @@ -4,6 +4,7 @@

import org.apache.logging.log4j.Logger;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;

import knightminer.tcomplement.library.events.TCompRegisterEvent;
Expand Down Expand Up @@ -32,6 +33,10 @@ public class TCompRegistry {

private static List<IBlacklist> meltingBlacklist = Lists.newLinkedList();

/**
* Registers a melter override recipe. This is a recipe that exists only in the melter, typically used to replace a smeltery recipe
* @param recipe Recipe to register
*/
public static void registerMelterOverride(MeltingRecipe recipe) {
if(new TCompRegisterEvent.MelterOverrideRegisterEvent(recipe).fire()) {
meltingOverrides.add(recipe);
Expand All @@ -46,6 +51,18 @@ public static void registerMelterOverride(MeltingRecipe recipe) {
}
}

/**
* Gets all melter overrides
* @return Immutable list of all melter overrides
*/
public static List<MeltingRecipe> getAllMeltingOverrides() {
return ImmutableList.copyOf(meltingOverrides);
}

/**
* Blacklists an input from being used for a normal smeltery recipe. This is not needed if an override is added with that input
* @param blacklist Blacklist entry
*/
public static void registerMelterBlacklist(IBlacklist blacklist) {
if(new TCompRegisterEvent.MelterBlackListRegisterEvent(blacklist).fire()) {
meltingBlacklist.add(blacklist);
Expand All @@ -59,10 +76,46 @@ public static void registerMelterBlacklist(IBlacklist blacklist) {
}
}

/**
* Registers a blacklist entry using a RecipeMatch entry
* @param blacklist RecipeMatch to blacklist
*/
public static void registerMelterBlacklist(RecipeMatch blacklist) {
registerMelterBlacklist(new RecipeMatchBlacklist(blacklist));
}

/**
* Checks if a melting recipe is hidden by the melter overrides or blacklist
* @param recipe Recipe to check
* @return true if the recipe would be hidden, false otherwise
*/
public static boolean isSmeltingHidden(MeltingRecipe recipe) {
List<ItemStack> inputs = recipe.input.getInputs();

// TODO: should probably validate that all inputs match for cases of list inputs, but probably not an issue
// check blacklist first, its probably quicker
for(IBlacklist blacklist : meltingBlacklist) {
if(inputs.stream().anyMatch(blacklist::matches)) {
return true;
}
}

// next try overrides
for(MeltingRecipe override : meltingOverrides) {
if(inputs.stream().anyMatch(override::matches)) {
return true;
}
}

return false;
}

/**
* Gets the melting recipe for a given item stack.
* This checks the overrides first, then runs though the blacklist before checking the smeltery registry
* @param stack Input stack
* @return recipe instance
*/
public static MeltingRecipe getMelting(ItemStack stack) {
// check if the recipe exists in our overrides
for(MeltingRecipe recipe : meltingOverrides) {
Expand Down
29 changes: 26 additions & 3 deletions src/main/java/knightminer/tcomplement/plugin/jei/JEIPlugin.java
Expand Up @@ -6,37 +6,60 @@
import com.google.common.collect.ImmutableList;

import knightminer.tcomplement.TinkersComplement;
import knightminer.tcomplement.common.Config;
import knightminer.tcomplement.feature.ModuleFeature;
import knightminer.tcomplement.feature.client.GuiMelter;
import knightminer.tcomplement.plugin.chisel.ChiselPlugin;
import knightminer.tcomplement.plugin.exnihilo.ExNihiloPlugin;
import knightminer.tcomplement.plugin.jei.melter.MeltingRecipeCategory;
import knightminer.tcomplement.plugin.jei.melter.MeltingRecipeChecker;
import knightminer.tcomplement.plugin.jei.melter.MeltingRecipeWrapper;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.IModRegistry;
import mezz.jei.api.gui.IAdvancedGuiHandler;
import mezz.jei.api.recipe.IRecipeCategoryRegistration;
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
import slimeknights.tconstruct.library.smeltery.MeltingRecipe;
import slimeknights.tconstruct.smeltery.client.IGuiLiquidTank;
import slimeknights.tconstruct.tools.TinkerMaterials;


@mezz.jei.api.JEIPlugin
public class JEIPlugin implements IModPlugin {
private static final String FURNACE_FUEL = VanillaRecipeCategoryUid.FUEL;
private static final String TINKERS_SMELTERY = "tconstruct.smeltery";
private static final String EXNIHILO_HAMMER = "exnihilocreatio:hammer";
private static final String CHISEL_CHISELING = "chisel.chiseling";
public static MeltingRecipeCategory meltingCategory;

@Override
public void registerCategories(IRecipeCategoryRegistration registry) {
final IGuiHelper guiHelper = registry.getJeiHelpers().getGuiHelper();

// Melter
if(Config.separateMelterTab && TinkersComplement.pulseManager.isPulseLoaded(ModuleFeature.pulseID)) {
registry.addRecipeCategories(meltingCategory = new MeltingRecipeCategory(guiHelper));
}
}

@Override
public void register(IModRegistry registry) {
if(TinkersComplement.pulseManager.isPulseLoaded(ModuleFeature.pulseID)) {
String melterCategory = TINKERS_SMELTERY;
if(Config.separateMelterTab) {
melterCategory = MeltingRecipeCategory.CATEGORY;
registry.handleRecipes(MeltingRecipe.class, MeltingRecipeWrapper::new, MeltingRecipeCategory.CATEGORY);
registry.addRecipes(MeltingRecipeChecker.getMeltingRecipes(), MeltingRecipeCategory.CATEGORY);
}
// smeltery alternatives
if(ModuleFeature.melter != null) {
registry.addRecipeCatalyst(new ItemStack(ModuleFeature.melter), TINKERS_SMELTERY);
registry.addRecipeCatalyst(new ItemStack(ModuleFeature.melter), melterCategory);
registry.addRecipeCatalyst(new ItemStack(ModuleFeature.melter, 1, 8), FURNACE_FUEL);
}
if(ModuleFeature.porcelainMelter != null) {
registry.addRecipeCatalyst(new ItemStack(ModuleFeature.porcelainMelter), TINKERS_SMELTERY);
registry.addRecipeCatalyst(new ItemStack(ModuleFeature.porcelainMelter), melterCategory);
registry.addRecipeCatalyst(new ItemStack(ModuleFeature.porcelainMelter, 1, 8), FURNACE_FUEL);
}

Expand Down
@@ -0,0 +1,105 @@
package knightminer.tcomplement.plugin.jei.melter;

import java.util.List;

import javax.annotation.Nonnull;

import com.google.common.collect.ImmutableList;

import knightminer.tcomplement.TinkersComplement;
import knightminer.tcomplement.library.Util;
import mezz.jei.api.IGuiHelper;
import mezz.jei.api.gui.IDrawable;
import mezz.jei.api.gui.IDrawableAnimated;
import mezz.jei.api.gui.IDrawableStatic;
import mezz.jei.api.gui.IGuiFluidStackGroup;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.IRecipeCategory;
import net.minecraft.client.Minecraft;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import slimeknights.tconstruct.library.client.GuiUtil;
import slimeknights.tconstruct.library.materials.Material;

public class MeltingRecipeCategory implements IRecipeCategory<MeltingRecipeWrapper> {

public static final String CATEGORY = Util.resource("melter");
public static final ResourceLocation BACKGROUND = Util.getResource("textures/gui/jei/melter.png");
private static List<ItemStack> furnaceFuels;

private final IDrawable background;
protected final IDrawable solidCover;
protected final IDrawableAnimated flame;
private final IDrawableAnimated progress;

public MeltingRecipeCategory(IGuiHelper guiHelper) {
background = guiHelper.createDrawable(BACKGROUND, 0, 0, 160, 46, 0, 0, 0, 0);
solidCover = guiHelper.createDrawable(BACKGROUND, 174, 0, 18, 33);

IDrawableStatic flameDrawable = guiHelper.createDrawable(BACKGROUND, 160, 0, 14, 14);
flame = guiHelper.createAnimatedDrawable(flameDrawable, 200, IDrawableAnimated.StartDirection.TOP, true);
IDrawableStatic progressDrawable = guiHelper.createDrawable(BACKGROUND, 160, 14, 3, 16);
progress = guiHelper.createAnimatedDrawable(progressDrawable, 200, IDrawableAnimated.StartDirection.BOTTOM, false);
}

@Nonnull
@Override
public String getUid() {
return CATEGORY;
}

@Nonnull
@Override
public String getTitle() {
return Util.translate("gui.jei.melter.title");
}

@Nonnull
@Override
public IDrawable getBackground() {
return background;
}

@Override
public void drawExtras(Minecraft minecraft) {
progress.draw(minecraft, 49, 21);
}

@Override
public void setRecipe(IRecipeLayout recipeLayout, MeltingRecipeWrapper recipe, IIngredients ingredients) {
IGuiItemStackGroup items = recipeLayout.getItemStacks();
items.init(0, true, 52, 20);
items.set(ingredients);

// if solid fuels are available, add a standard subset
if(recipe.isSolid) {
items.init(1, true, 6, 22);
items.set(1, getFurnaceFuels());
}

IGuiFluidStackGroup fluids = recipeLayout.getFluidStacks();
fluids.addTooltipCallback(GuiUtil::onFluidTooltip);

fluids.init(0, false, 121, 7, 32, 32, Material.VALUE_Block, false, null);
fluids.set(ingredients);

fluids.init(1, true, 29, 7, 12, 32, 1000, false, null);
fluids.set(1, recipe.getLiquidFuels());
}

@Override
public String getModName() {
return TinkersComplement.modName;
}

private static List<ItemStack> getFurnaceFuels() {
if (furnaceFuels != null) {
return furnaceFuels;
}
return furnaceFuels = ImmutableList.of(new ItemStack(Items.COAL), new ItemStack(Items.COAL, 1, 1), new ItemStack(Blocks.LOG), new ItemStack(Blocks.PLANKS), new ItemStack(Blocks.COAL_BLOCK));
}
}
@@ -0,0 +1,30 @@
package knightminer.tcomplement.plugin.jei.melter;

import java.util.ArrayList;
import java.util.List;

import knightminer.tcomplement.library.TCompRegistry;
import slimeknights.tconstruct.library.smeltery.MeltingRecipe;
import slimeknights.tconstruct.plugin.jei.smelting.SmeltingRecipeChecker;

public class MeltingRecipeChecker {
public static List<MeltingRecipe> getMeltingRecipes() {
List<MeltingRecipe> recipes = new ArrayList<>();

// first, add all overrides
for(MeltingRecipe recipe : TCompRegistry.getAllMeltingOverrides()) {
if(recipe.output != null && recipe.input != null && recipe.input.getInputs() != null && recipe.input.getInputs().size() > 0) {
recipes.add(recipe);
}
}

// next, add all normal melting recipes if not hidden by the blacklist or overrides
for(MeltingRecipe recipe : SmeltingRecipeChecker.getSmeltingRecipes()) {
if (!TCompRegistry.isSmeltingHidden(recipe)) {
recipes.add(recipe);
}
}

return recipes;//recipes.stream().map(MeltingRecipeWrapper::new).collect(Collectors.toList());
}
}
@@ -0,0 +1,37 @@
package knightminer.tcomplement.plugin.jei.melter;

import java.util.List;

import javax.annotation.Nonnull;

import knightminer.tcomplement.plugin.jei.JEIPlugin;
import net.minecraft.client.Minecraft;
import net.minecraftforge.fluids.FluidStack;
import slimeknights.tconstruct.library.smeltery.MeltingRecipe;
import slimeknights.tconstruct.plugin.jei.smelting.SmeltingRecipeWrapper;

public class MeltingRecipeWrapper extends SmeltingRecipeWrapper {

protected boolean isSolid;
public MeltingRecipeWrapper(MeltingRecipe recipe) {
super(recipe);
// if true, we can use solid fuels
isSolid = recipe.getTemperature() <= 500;
}

public List<FluidStack> getLiquidFuels() {
return fuels;
}


@Override
public void drawInfo(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) {
// if solid fuel is available, draw the flame icon, otherwise cover the slot
if(isSolid) {
JEIPlugin.meltingCategory.flame.draw(minecraft, 8, 7);
} else {
JEIPlugin.meltingCategory.solidCover.draw(minecraft, 6, 7);
}
super.drawInfo(minecraft, recipeWidth, recipeHeight, mouseX, mouseY);
}
}
4 changes: 3 additions & 1 deletion src/main/resources/assets/tcomplement/lang/en_us.lang
Expand Up @@ -67,4 +67,6 @@ gui.tcomplement.melter.progress.wrong_fluid=Resulting fluid is different than fl
gui.tcomplement.melter.solid_fuel=Heater
gui.tcomplement.melter.solid_fuel.amount=%s units

gui.tcomplement.heater.name=Heater
gui.tcomplement.heater.name=Heater

gui.jei.melter.title=Melter
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 223f44b

Please sign in to comment.