equivalent-exchange-3/src/main/java/com/pahimar/ee3/recipe/RecipeRegistry.java

99 lines
3.7 KiB
Java

package com.pahimar.ee3.recipe;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.TreeMultimap;
import com.pahimar.ee3.exchange.WrappedStack;
import com.pahimar.ee3.reference.Comparators;
import com.pahimar.ee3.util.LoaderHelper;
import com.pahimar.ee3.util.LogHelper;
import cpw.mods.fml.common.Loader;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import java.util.Collection;
import java.util.Set;
import java.util.TreeSet;
public class RecipeRegistry {
public static final Marker RECIPE_MARKER = MarkerManager.getMarker("EE3_RECIPE", LogHelper.MOD_MARKER);
public static final RecipeRegistry INSTANCE = new RecipeRegistry();
private Multimap<WrappedStack, Set<WrappedStack>> recipeMap;
private ImmutableMultimap<WrappedStack, Set<WrappedStack>> immutableRecipeMap;
private RecipeRegistry() {
recipeMap = TreeMultimap.create(WrappedStack.COMPARATOR, Comparators.WRAPPED_STACK_SET_COMPARATOR);
}
public void addRecipe(Object recipeOutput, Collection<?> recipeInputList) {
// Wrap the recipe output
WrappedStack wrappedRecipeOutput = WrappedStack.wrap(recipeOutput);
if (wrappedRecipeOutput == null) {
return;
}
Set<WrappedStack> wrappedRecipeInputList = new TreeSet<>();
StringBuilder stringBuilder = new StringBuilder();
for (Object recipeInputObject : recipeInputList) {
WrappedStack wrappedInputObject = WrappedStack.wrap(recipeInputObject);
if (wrappedInputObject != null) {
wrappedRecipeInputList.add(wrappedInputObject);
stringBuilder.append(wrappedInputObject);
stringBuilder.append(" ");
}
else {
return;
}
}
// Check to see if we already have this recipe in the map
boolean existsAlready = false;
for (Set<WrappedStack> recipeInputs : recipeMap.get(wrappedRecipeOutput)) {
if (recipeInputs.containsAll(wrappedRecipeInputList) && wrappedRecipeInputList.containsAll(recipeInputs)) {
existsAlready = true;
}
}
// Add the recipe mapping only if we don't already have it
if (!existsAlready) {
LogHelper.trace(RECIPE_MARKER, "[{}] Mod with ID '{}' added recipe (Output: {}, Inputs: {})", LoaderHelper.getLoaderState(), Loader.instance().activeModContainer().getModId(), wrappedRecipeOutput, stringBuilder.toString().trim());
recipeMap.put(wrappedRecipeOutput, wrappedRecipeInputList);
}
}
public void registerVanillaRecipes() {
new RecipesVanilla().registerRecipes();
new RecipesFluidContainers().registerRecipes();
new RecipesPotions().registerRecipes();
}
public Multimap<WrappedStack, Set<WrappedStack>> getRecipeMappings() {
if (immutableRecipeMap == null) {
immutableRecipeMap = ImmutableMultimap.copyOf(INSTANCE.recipeMap);
}
return immutableRecipeMap;
}
public void dumpRecipeRegistryToLog() {
for (WrappedStack wrappedStack : getRecipeMappings().keySet()) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.format("Output: %s, Inputs: ", wrappedStack.toString()));
for (Set<WrappedStack> listStacks : getRecipeMappings().get(wrappedStack)) {
for (WrappedStack listStack : listStacks) {
stringBuilder.append(listStack.toString() + " ");
}
}
LogHelper.info(RECIPE_MARKER, stringBuilder.toString());
}
}
}