Skip to content

Commit

Permalink
Improve stack trace for broken recipes added to JEI
Browse files Browse the repository at this point in the history
  • Loading branch information
mezz committed Oct 25, 2021
1 parent 5af70ab commit 8ef409e
Show file tree
Hide file tree
Showing 14 changed files with 93 additions and 153 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import java.util.Collections;
import java.util.List;

import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.resources.ResourceLocation;

import mezz.jei.api.constants.VanillaRecipeCategoryUid;
Expand Down
1 change: 0 additions & 1 deletion src/main/java/mezz/jei/JustEnoughItems.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
Expand Down
1 change: 0 additions & 1 deletion src/main/java/mezz/jei/gui/overlay/IngredientGrid.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import mezz.jei.api.ingredients.IIngredientType;
import mezz.jei.config.ClientConfig;
import mezz.jei.config.IClientConfig;
import mezz.jei.config.IEditModeConfig;
import mezz.jei.config.IIngredientFilterConfig;
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/mezz/jei/input/CombinedMouseHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
import net.minecraft.client.gui.screens.Screen;

import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CombinedMouseHandler implements IMouseHandler {
private final Int2ObjectMap<IMouseHandler> mousedDown = new Int2ObjectArrayMap<>();
Expand Down
125 changes: 53 additions & 72 deletions src/main/java/mezz/jei/load/PluginLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableTable;
import mezz.jei.Internal;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.helpers.IModIdHelper;
import mezz.jei.api.recipe.IRecipeManager;
import mezz.jei.api.recipe.advanced.IRecipeManagerPlugin;
import mezz.jei.api.recipe.category.IRecipeCategory;
import mezz.jei.api.recipe.transfer.IRecipeTransferHandler;
import mezz.jei.api.recipe.transfer.IRecipeTransferHandlerHelper;
import mezz.jei.bookmarks.BookmarkList;
import mezz.jei.config.BookmarkConfig;
Expand All @@ -17,6 +18,7 @@
import mezz.jei.config.IIngredientFilterConfig;
import mezz.jei.config.sorting.RecipeCategorySortingConfig;
import mezz.jei.gui.GuiHelper;
import mezz.jei.gui.GuiScreenHelper;
import mezz.jei.gui.ingredients.IIngredientListElement;
import mezz.jei.gui.textures.Textures;
import mezz.jei.ingredients.IIngredientSorter;
Expand Down Expand Up @@ -48,36 +50,23 @@
import net.minecraft.core.NonNullList;
import net.minecraft.resources.ResourceLocation;

import javax.annotation.Nullable;
import java.util.List;

public class PluginLoader {
private final LoggedTimer timer;
private final IModIdHelper modIdHelper;
private final IngredientBlacklistInternal blacklist;
private final AdvancedRegistration advancedRegistration;
private final IngredientManager ingredientManager;
private final IClientConfig clientConfig;
private final RecipeTransferRegistration recipeTransferRegistration;
private final GuiHandlerRegistration guiHandlerRegistration;
private final ImmutableList<IRecipeCategory<?>> recipeCategories;
private final ImmutableListMultimap<ResourceLocation, Object> recipeCatalysts;
private final ImmutableListMultimap<ResourceLocation, Object> recipes;
private final ImmutableList<IRecipeManagerPlugin> recipeManagerPlugins;
@Nullable
private IRecipeManager recipeManager;
@Nullable
private IngredientFilter ingredientFilter;
@Nullable
private BookmarkList bookmarkList;
private final JeiHelpers jeiHelpers;

public PluginLoader(
List<IModPlugin> plugins,
VanillaPlugin vanillaPlugin,
Textures textures,
IClientConfig clientConfig,
IModIdHelper modIdHelper,
boolean debugMode) {
boolean debugMode
) {
this.clientConfig = clientConfig;
this.timer = new LoggedTimer();
this.modIdHelper = modIdHelper;
Expand All @@ -95,76 +84,70 @@ public PluginLoader(
Internal.setIngredientManager(ingredientManager);

StackHelper stackHelper = new StackHelper(subtypeManager);
Internal.setTextures(textures);
GuiHelper guiHelper = new GuiHelper(ingredientManager, textures);
JeiHelpers jeiHelpers = new JeiHelpers(guiHelper, stackHelper, modIdHelper);
jeiHelpers = new JeiHelpers(guiHelper, stackHelper, modIdHelper);
Internal.setHelpers(jeiHelpers);
}

VanillaRecipeFactory vanillaRecipeFactory = new VanillaRecipeFactory(ingredientManager);
IRecipeTransferHandlerHelper handlerHelper = new RecipeTransferHandlerHelper();
recipeTransferRegistration = new RecipeTransferRegistration(jeiHelpers.getStackHelper(), handlerHelper, jeiHelpers);

private ImmutableList<IRecipeCategory<?>> createRecipeCategories(List<IModPlugin> plugins, VanillaPlugin vanillaPlugin) {
RecipeCategoryRegistration recipeCategoryRegistration = new RecipeCategoryRegistration(jeiHelpers);
PluginCaller.callOnPlugins("Registering categories", plugins, p -> p.registerCategories(recipeCategoryRegistration));
CraftingRecipeCategory craftingCategory = vanillaPlugin.getCraftingCategory();
ErrorUtil.checkNotNull(craftingCategory, "vanilla crafting category");
VanillaCategoryExtensionRegistration vanillaCategoryExtensionRegistration = new VanillaCategoryExtensionRegistration(craftingCategory);
PluginCaller.callOnPlugins("Registering vanilla category extensions", plugins, p -> p.registerVanillaCategoryExtensions(vanillaCategoryExtensionRegistration));
ImmutableMap<ResourceLocation, IRecipeCategory<?>> recipeCategoriesByUid = recipeCategoryRegistration.getRecipeCategoriesByUid();
recipeCategories = recipeCategoryRegistration.getRecipeCategories();
return recipeCategoryRegistration.getRecipeCategories();
}

RecipeRegistration recipeRegistration = new RecipeRegistration(recipeCategoriesByUid, jeiHelpers, ingredientManager, vanillaRecipeFactory);
PluginCaller.callOnPlugins("Registering recipes", plugins, p -> p.registerRecipes(recipeRegistration));
public GuiScreenHelper createGuiScreenHelper(List<IModPlugin> plugins) {
GuiHandlerRegistration guiHandlerRegistration = new GuiHandlerRegistration();
PluginCaller.callOnPlugins("Registering gui handlers", plugins, p -> p.registerGuiHandlers(guiHandlerRegistration));
return guiHandlerRegistration.createGuiScreenHelper(ingredientManager);
}

public ImmutableTable<Class<?>, ResourceLocation, IRecipeTransferHandler<?, ?>> createRecipeTransferHandlers(List<IModPlugin> plugins) {
IRecipeTransferHandlerHelper handlerHelper = new RecipeTransferHandlerHelper();
RecipeTransferRegistration recipeTransferRegistration = new RecipeTransferRegistration(jeiHelpers.getStackHelper(), handlerHelper, jeiHelpers);
PluginCaller.callOnPlugins("Registering recipes transfer handlers", plugins, p -> p.registerRecipeTransferHandlers(recipeTransferRegistration));
recipes = recipeRegistration.getRecipes();
return recipeTransferRegistration.getRecipeTransferHandlers();
}

public IRecipeManager createRecipeManager(List<IModPlugin> plugins, VanillaPlugin vanillaPlugin, RecipeCategorySortingConfig recipeCategorySortingConfig) {
ImmutableList<IRecipeCategory<?>> recipeCategories = createRecipeCategories(plugins, vanillaPlugin);

RecipeCatalystRegistration recipeCatalystRegistration = new RecipeCatalystRegistration();
PluginCaller.callOnPlugins("Registering recipe catalysts", plugins, p -> p.registerRecipeCatalysts(recipeCatalystRegistration));
recipeCatalysts = recipeCatalystRegistration.getRecipeCatalysts();
ImmutableListMultimap<ResourceLocation, Object> recipeCatalysts = recipeCatalystRegistration.getRecipeCatalysts();

guiHandlerRegistration = new GuiHandlerRegistration();
PluginCaller.callOnPlugins("Registering gui handlers", plugins, p -> p.registerGuiHandlers(guiHandlerRegistration));

advancedRegistration = new AdvancedRegistration(jeiHelpers);
AdvancedRegistration advancedRegistration = new AdvancedRegistration(jeiHelpers);
PluginCaller.callOnPlugins("Registering advanced plugins", plugins, p -> p.registerAdvanced(advancedRegistration));
recipeManagerPlugins = advancedRegistration.getRecipeManagerPlugins();
}
ImmutableList<IRecipeManagerPlugin> recipeManagerPlugins = advancedRegistration.getRecipeManagerPlugins();

timer.start("Building recipe registry");
RecipeManagerInternal recipeManagerInternal = new RecipeManagerInternal(
recipeCategories,
recipeCatalysts,
ingredientManager,
recipeManagerPlugins,
recipeCategorySortingConfig
);
timer.stop();

public GuiHandlerRegistration getGuiHandlerRegistration() {
return guiHandlerRegistration;
}

public RecipeTransferRegistration getRecipeTransferRegistration() {
return recipeTransferRegistration;
}
VanillaRecipeFactory vanillaRecipeFactory = new VanillaRecipeFactory(ingredientManager);
RecipeRegistration recipeRegistration = new RecipeRegistration(jeiHelpers, ingredientManager, vanillaRecipeFactory, recipeManagerInternal);
PluginCaller.callOnPlugins("Registering recipes", plugins, p -> p.registerRecipes(recipeRegistration));

public IRecipeManager getRecipeManager(RecipeCategorySortingConfig recipeCategorySortingConfig) {
if (recipeManager == null) {
timer.start("Building recipe registry");
RecipeManagerInternal recipeManagerInternal = new RecipeManagerInternal(
recipeCategories,
recipes,
recipeCatalysts,
ingredientManager,
recipeManagerPlugins,
recipeCategorySortingConfig
);
this.recipeManager = new RecipeManager(recipeManagerInternal, modIdHelper);
timer.stop();
}
return recipeManager;
return new RecipeManager(recipeManagerInternal, modIdHelper);
}

public IngredientFilter createIngredientFilter(IIngredientSorter ingredientSorter, IEditModeConfig editModeConfig, IIngredientFilterConfig ingredientFilterConfig) {
if (ingredientFilter == null) {
timer.start("Building ingredient list");
NonNullList<IIngredientListElement<?>> ingredientList = IngredientListElementFactory.createBaseList(ingredientManager);
timer.stop();
timer.start("Building ingredient filter");
ingredientFilter = new IngredientFilter(blacklist, clientConfig, ingredientFilterConfig, editModeConfig, ingredientManager, ingredientSorter, ingredientList, modIdHelper);
Internal.setIngredientFilter(ingredientFilter);
timer.stop();
}
timer.start("Building ingredient list");
NonNullList<IIngredientListElement<?>> ingredientList = IngredientListElementFactory.createBaseList(ingredientManager);
timer.stop();
timer.start("Building ingredient filter");
IngredientFilter ingredientFilter = new IngredientFilter(blacklist, clientConfig, ingredientFilterConfig, editModeConfig, ingredientManager, ingredientSorter, ingredientList, modIdHelper);
Internal.setIngredientFilter(ingredientFilter);
timer.stop();
return ingredientFilter;
}

Expand All @@ -173,12 +156,10 @@ public IngredientManager getIngredientManager() {
}

public BookmarkList createBookmarkList(BookmarkConfig bookmarkConfig) {
if (bookmarkList == null) {
timer.start("Building bookmarks");
bookmarkList = new BookmarkList(ingredientManager, bookmarkConfig);
bookmarkConfig.loadBookmarks(ingredientManager, bookmarkList);
timer.stop();
}
timer.start("Building bookmarks");
BookmarkList bookmarkList = new BookmarkList(ingredientManager, bookmarkConfig);
bookmarkConfig.loadBookmarks(ingredientManager, bookmarkList);
timer.stop();
return bookmarkList;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import mezz.jei.api.helpers.IJeiHelpers;
import mezz.jei.api.recipe.category.IRecipeCategory;
import mezz.jei.api.registration.IRecipeCategoryRegistration;
Expand Down Expand Up @@ -52,8 +51,4 @@ public IJeiHelpers getJeiHelpers() {
public ImmutableList<IRecipeCategory<?>> getRecipeCategories() {
return ImmutableList.copyOf(recipeCategories);
}

public ImmutableMap<ResourceLocation, IRecipeCategory<?>> getRecipeCategoriesByUid() {
return ImmutableMap.copyOf(recipeCategoriesByUid);
}
}
37 changes: 11 additions & 26 deletions src/main/java/mezz/jei/load/registration/RecipeRegistration.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,35 @@
import java.util.Collections;
import java.util.List;

import mezz.jei.recipes.RecipeManagerInternal;
import net.minecraft.resources.ResourceLocation;

import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import mezz.jei.api.constants.VanillaRecipeCategoryUid;
import mezz.jei.api.helpers.IJeiHelpers;
import mezz.jei.api.ingredients.IIngredientType;
import mezz.jei.api.recipe.category.IRecipeCategory;
import mezz.jei.api.recipe.vanilla.IVanillaRecipeFactory;
import mezz.jei.api.registration.IRecipeRegistration;
import mezz.jei.api.runtime.IIngredientManager;
import mezz.jei.collect.ListMultiMap;
import mezz.jei.plugins.jei.info.IngredientInfoRecipe;
import mezz.jei.util.ErrorUtil;
import net.minecraft.network.chat.Component;

public class RecipeRegistration implements IRecipeRegistration {
private final ListMultiMap<ResourceLocation, Object> recipes = new ListMultiMap<>();
private final ImmutableMap<ResourceLocation, IRecipeCategory<?>> recipeCategoriesByUid;
private final IJeiHelpers jeiHelpers;
private final IIngredientManager ingredientManager;
private final IVanillaRecipeFactory vanillaRecipeFactory;

public RecipeRegistration(ImmutableMap<ResourceLocation, IRecipeCategory<?>> recipeCategoriesByUid, IJeiHelpers jeiHelpers, IIngredientManager ingredientManager, IVanillaRecipeFactory vanillaRecipeFactory) {
this.recipeCategoriesByUid = recipeCategoriesByUid;
private final RecipeManagerInternal recipeManager;

public RecipeRegistration(
IJeiHelpers jeiHelpers,
IIngredientManager ingredientManager,
IVanillaRecipeFactory vanillaRecipeFactory,
RecipeManagerInternal recipeManager
) {
this.jeiHelpers = jeiHelpers;
this.ingredientManager = ingredientManager;
this.vanillaRecipeFactory = vanillaRecipeFactory;
this.recipeManager = recipeManager;
}

@Override
Expand All @@ -54,19 +55,7 @@ public void addRecipes(Collection<?> recipes, ResourceLocation recipeCategoryUid
ErrorUtil.checkNotNull(recipes, "recipes");
ErrorUtil.checkNotNull(recipeCategoryUid, "recipeCategoryUid");

IRecipeCategory<?> recipeCategory = this.recipeCategoriesByUid.get(recipeCategoryUid);
if (recipeCategory == null) {
throw new NullPointerException("No recipe category has been registered for recipeCategoryUid " + recipeCategoryUid);
}
Class<?> recipeClass = recipeCategory.getRecipeClass();

for (Object recipe : recipes) {
ErrorUtil.checkNotNull(recipe, "recipe");
if (!recipeClass.isInstance(recipe)) {
throw new IllegalArgumentException(recipeCategory.getUid() + " recipes must be an instance of " + recipeClass + ". Instead got: " + recipe.getClass());
}
this.recipes.put(recipeCategoryUid, recipe);
}
this.recipeManager.addRecipes(recipes, recipeCategoryUid);
}

@Override
Expand All @@ -90,8 +79,4 @@ public <T> void addIngredientInfo(List<T> ingredients, IIngredientType<T> ingred
List<IngredientInfoRecipe<T>> recipes = IngredientInfoRecipe.create(ingredients, ingredientType, descriptionComponents);
addRecipes(recipes, VanillaRecipeCategoryUid.INFORMATION);
}

public ImmutableListMultimap<ResourceLocation, Object> getRecipes() {
return recipes.toImmutable();
}
}
2 changes: 0 additions & 2 deletions src/main/java/mezz/jei/plugins/debug/DebugRecipeCategory.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package mezz.jei.plugins.debug;

import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;

import java.util.ArrayList;
Expand All @@ -12,7 +11,6 @@
import mezz.jei.api.ingredients.IIngredientType;
import mezz.jei.api.ingredients.subtypes.UidContext;
import mezz.jei.api.runtime.IBookmarkOverlay;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraftforge.fluids.FluidAttributes;
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/mezz/jei/recipes/RecipeCategoryDataMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,14 @@ public <T> RecipeCategoryData<T> get(T recipe, ResourceLocation recipeCategoryUi
public RecipeCategoryData<?> get(ResourceLocation recipeCategoryUid) {
RecipeCategoryData<?> recipeCategoryData = map.get(recipeCategoryUid);
if (recipeCategoryData == null) {
throw new IllegalStateException("Failed to find recipe category data for: " + recipeCategoryUid);
throw new IllegalStateException("There is no recipe category registered for: " + recipeCategoryUid);
}
return recipeCategoryData;
}

public void validate(ResourceLocation recipeCategoryUid) {
if (!map.containsKey(recipeCategoryUid)) {
throw new IllegalStateException("Failed to find recipe category data for: " + recipeCategoryUid);
throw new IllegalStateException("There is no recipe category registered for: " + recipeCategoryUid);
}
}
}
Loading

0 comments on commit 8ef409e

Please sign in to comment.