package me.shedaniel.impl; import me.shedaniel.Core; import me.shedaniel.api.IDisplayCategory; import me.shedaniel.api.IREIPlugin; import me.shedaniel.api.IRecipe; import me.shedaniel.api.IRecipeManager; import me.shedaniel.gui.RecipeGui; import net.minecraft.client.MinecraftClient; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.recipe.RecipeManager; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * Created by James on 8/7/2018. */ public class REIRecipeManager implements IRecipeManager { private Map> recipeList; private List displayAdapters; public static RecipeManager recipeManager; private static REIRecipeManager myInstance; private REIRecipeManager() { recipeList = new HashMap<>(); displayAdapters = new LinkedList<>(); } public List getDisplayAdapters() { return displayAdapters; } public static REIRecipeManager instance() { if (myInstance == null) { System.out.println("Newing me up."); myInstance = new REIRecipeManager(); } return myInstance; } @Override public void addRecipe(String id, IRecipe recipe) { if (recipeList.containsKey(id)) { recipeList.get(id).add(recipe); } else { List recipes = new LinkedList<>(); recipeList.put(id, recipes); recipes.add(recipe); } } @Override public void addRecipe(String id, List recipes) { if (recipeList.containsKey(id)) { recipeList.get(id).addAll(recipes); } else { List newRecipeList = new LinkedList<>(); recipeList.put(id, newRecipeList); newRecipeList.addAll(recipes); } } @Override public void addDisplayAdapter(IDisplayCategory adapter) { displayAdapters.add(adapter); } @Override public Map> getRecipesFor(ItemStack stack) { Map> categories = new HashMap<>(); displayAdapters.forEach(f -> categories.put(f, new LinkedList<>())); for(List value : recipeList.values()) { for(IRecipe iRecipe : value) { for(Object o : iRecipe.getOutput()) { if (o instanceof ItemStack) { if (ItemStack.areEqualIgnoreTags(stack, (ItemStack) o)) { for(IDisplayCategory iDisplayCategory : categories.keySet()) { if (iDisplayCategory.getId() == iRecipe.getId()) { categories.get(iDisplayCategory).add(iRecipe); } } } } } } } categories.keySet().removeIf(f -> categories.get(f).isEmpty()); return categories; } public Map> getUsesFor(ItemStack stack) { Map> categories = new HashMap<>(); displayAdapters.forEach(f -> categories.put(f, new LinkedList<>())); for(List value : recipeList.values()) { for(IRecipe iRecipe : value) { boolean found = false; for(Object o : iRecipe.getInput()) { List input = (List) o; for(ItemStack itemStack : input) { if (ItemStack.areEqualIgnoreTags(itemStack, stack)) { for(IDisplayCategory iDisplayCategory : categories.keySet()) { if (iDisplayCategory.getId() == iRecipe.getId()) { categories.get(iDisplayCategory).add(iRecipe); found = true; } } if (found) break; } } if (found) break; } } } categories.keySet().removeIf(f -> categories.get(f).isEmpty()); return categories; } public List getAdatapersForOutput(ItemStack stack) { return null; } public List getAdaptersForOutput(Item item) { return null; } public void RecipesLoaded(RecipeManager manager) { recipeList.clear(); displayAdapters.clear(); REIRecipeManager.instance().recipeManager = manager; Core.getListeners(IREIPlugin.class).forEach(IREIPlugin::register); } public void displayRecipesFor(ItemStack stack) { Map> recipes = REIRecipeManager.instance().getRecipesFor(stack); if (recipes.isEmpty()) return; RecipeGui gui = new RecipeGui(null, MinecraftClient.getInstance().currentGui, recipes); MinecraftClient.getInstance().openGui(gui); } public void displayUsesFor(ItemStack stack) { Map> recipes = REIRecipeManager.instance().getUsesFor(stack); if (recipes.isEmpty()) return; RecipeGui gui = new RecipeGui(null, MinecraftClient.getInstance().currentGui, recipes); MinecraftClient.getInstance().openGui(gui); } }