Move the recipe stuff to the more logical location (RecipeRegistry vs DynEMC)
This commit is contained in:
parent
9a482adcff
commit
05be819d18
2 changed files with 134 additions and 162 deletions
|
@ -1,42 +1,22 @@
|
||||||
package com.pahimar.ee3.emc;
|
package com.pahimar.ee3.emc;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
|
||||||
import java.util.NoSuchElementException;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.item.crafting.IRecipe;
|
|
||||||
import net.minecraftforge.oredict.OreDictionary;
|
|
||||||
|
|
||||||
import com.google.common.collect.HashMultimap;
|
|
||||||
import com.google.common.collect.Multimap;
|
|
||||||
import com.pahimar.ee3.core.util.LogHelper;
|
import com.pahimar.ee3.core.util.LogHelper;
|
||||||
import com.pahimar.ee3.core.util.OreStack;
|
|
||||||
import com.pahimar.ee3.core.util.RecipeHelper;
|
|
||||||
import com.pahimar.ee3.emc.graph.WeightedDirectedGraph;
|
import com.pahimar.ee3.emc.graph.WeightedDirectedGraph;
|
||||||
import com.pahimar.ee3.emc.graph.WeightedEdge;
|
import com.pahimar.ee3.emc.graph.WeightedEdge;
|
||||||
import com.pahimar.ee3.item.CustomWrappedStack;
|
import com.pahimar.ee3.item.CustomWrappedStack;
|
||||||
import com.pahimar.ee3.item.crafting.RecipeRegistry;
|
import com.pahimar.ee3.item.crafting.RecipeRegistry;
|
||||||
import com.pahimar.ee3.item.crafting.RecipesPotions;
|
|
||||||
import com.pahimar.ee3.item.crafting.RecipesSmelting;
|
|
||||||
import com.pahimar.ee3.item.crafting.RecipesVanilla;
|
|
||||||
|
|
||||||
public class DynEMC {
|
public class DynEMC {
|
||||||
|
|
||||||
private static DynEMC dynEMC = null;
|
private static DynEMC dynEMC = null;
|
||||||
|
|
||||||
private ArrayList<CustomWrappedStack> discoveredStacks;
|
|
||||||
private ArrayList<CustomWrappedStack> stacksWithoutRecipes;
|
|
||||||
|
|
||||||
private WeightedDirectedGraph<CustomWrappedStack> graph;
|
private WeightedDirectedGraph<CustomWrappedStack> graph;
|
||||||
|
|
||||||
private DynEMC() {
|
private DynEMC() {
|
||||||
|
|
||||||
discoveredStacks = new ArrayList<CustomWrappedStack>();
|
|
||||||
stacksWithoutRecipes = new ArrayList<CustomWrappedStack>();
|
|
||||||
graph = new WeightedDirectedGraph<CustomWrappedStack>();
|
graph = new WeightedDirectedGraph<CustomWrappedStack>();
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
@ -53,143 +33,14 @@ public class DynEMC {
|
||||||
|
|
||||||
private void init() {
|
private void init() {
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
RecipeRegistry recipeManager = RecipeRegistry.getInstance();
|
RecipeRegistry recipeManager = RecipeRegistry.getInstance();
|
||||||
|
|
||||||
Multimap<CustomWrappedStack, List<CustomWrappedStack>> recipes = HashMultimap.create();
|
populateGraph();
|
||||||
|
|
||||||
// Add potion recipes
|
|
||||||
recipes.putAll(RecipesPotions.getPotionRecipes());
|
|
||||||
|
|
||||||
// Add smelting recipes in the vanilla smelting manager
|
|
||||||
recipes.putAll(RecipesSmelting.getSmeltingRecipes());
|
|
||||||
|
|
||||||
// Add recipes in the vanilla crafting manager
|
|
||||||
recipes.putAll(RecipesVanilla.getVanillaRecipes());
|
|
||||||
|
|
||||||
// Add recipes gathered via IMC
|
|
||||||
// TODO Gather IMC recipes
|
|
||||||
|
|
||||||
// Populate the discovered stacks list with all stacks that we are involved in a recipe we are aware of
|
|
||||||
discoverStacks(recipes);
|
|
||||||
|
|
||||||
// Add items that have no recipe, using the list of discovered stacks to determine if it's in a recipe or not
|
|
||||||
for (CustomWrappedStack stack : stacksWithoutRecipes) {
|
|
||||||
recipes.put(stack, new ArrayList<CustomWrappedStack>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterate through every recipe in the map, and add them to the registry
|
|
||||||
Set<CustomWrappedStack> recipeKeySet = recipes.keySet();
|
|
||||||
Iterator<CustomWrappedStack> recipeKeySetIterator = recipeKeySet.iterator();
|
|
||||||
CustomWrappedStack recipeOutput = null;
|
|
||||||
|
|
||||||
while (recipeKeySetIterator.hasNext()) {
|
|
||||||
recipeOutput = recipeKeySetIterator.next();
|
|
||||||
|
|
||||||
for (List<CustomWrappedStack> recipeInputs : recipes.get(recipeOutput)) {
|
|
||||||
recipeManager.addRecipe(recipeOutput, recipeInputs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void discoverStacks(Multimap<CustomWrappedStack, List<CustomWrappedStack>> recipes) {
|
|
||||||
|
|
||||||
Set<CustomWrappedStack> recipeKeySet = recipes.keySet();
|
|
||||||
Iterator<CustomWrappedStack> recipeKeySetIterator = recipeKeySet.iterator();
|
|
||||||
CustomWrappedStack recipeOutput = null;
|
|
||||||
|
|
||||||
while (recipeKeySetIterator.hasNext()) {
|
|
||||||
recipeOutput = recipeKeySetIterator.next();
|
|
||||||
|
|
||||||
if (!discoveredStacks.contains(new CustomWrappedStack(recipeOutput.getWrappedStack()))) {
|
|
||||||
discoveredStacks.add(new CustomWrappedStack(recipeOutput.getWrappedStack()));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (List<CustomWrappedStack> recipeInputs : recipes.get(recipeOutput)) {
|
|
||||||
for (CustomWrappedStack recipeInput : recipeInputs) {
|
|
||||||
|
|
||||||
if (!discoveredStacks.contains(new CustomWrappedStack(recipeInput.getWrappedStack()))) {
|
|
||||||
discoveredStacks.add(new CustomWrappedStack(recipeInput.getWrappedStack()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayList<ItemStack> subItemList = new ArrayList<ItemStack>();
|
|
||||||
|
|
||||||
for (int i = 0; i < Item.itemsList.length; i++) {
|
|
||||||
if (Item.itemsList[i] != null) {
|
|
||||||
if (Item.itemsList[i].getHasSubtypes()) {
|
|
||||||
|
|
||||||
subItemList.clear();
|
|
||||||
Item.itemsList[i].getSubItems(i, Item.itemsList[i].getCreativeTab(), subItemList);
|
|
||||||
|
|
||||||
for (ItemStack itemStack : subItemList) {
|
|
||||||
if (itemStack != null) {
|
|
||||||
|
|
||||||
CustomWrappedStack customWrappedStack = new CustomWrappedStack(itemStack);
|
|
||||||
|
|
||||||
if (!discoveredStacks.contains(customWrappedStack)) {
|
|
||||||
discoveredStacks.add(customWrappedStack);
|
|
||||||
stacksWithoutRecipes.add(customWrappedStack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
CustomWrappedStack customWrappedStack = new CustomWrappedStack(new ItemStack(Item.itemsList[i]));
|
|
||||||
|
|
||||||
if (!discoveredStacks.contains(customWrappedStack)) {
|
|
||||||
discoveredStacks.add(customWrappedStack);
|
|
||||||
stacksWithoutRecipes.add(customWrappedStack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
private void populateGraph() {
|
private void populateGraph() {
|
||||||
|
|
||||||
for (CustomWrappedStack customWrappedStack : discoveredStacks) {
|
|
||||||
|
|
||||||
ArrayList<IRecipe> recipes = RecipeHelper.getReverseRecipes(customWrappedStack);
|
|
||||||
|
|
||||||
for (IRecipe recipe : recipes) {
|
|
||||||
|
|
||||||
ArrayList<CustomWrappedStack> recipeInputs = RecipeHelper.getCollatedRecipeInputs(recipe);
|
|
||||||
|
|
||||||
for (CustomWrappedStack wrappedRecipeInput : recipeInputs) {
|
|
||||||
|
|
||||||
float weight = wrappedRecipeInput.getStackSize();
|
|
||||||
|
|
||||||
CustomWrappedStack recipeInput = null;
|
|
||||||
|
|
||||||
if (wrappedRecipeInput.getWrappedStack() instanceof ItemStack) {
|
|
||||||
ItemStack itemStack = (ItemStack) wrappedRecipeInput.getWrappedStack();
|
|
||||||
|
|
||||||
if (OreDictionary.getOreID(itemStack) != -1) {
|
|
||||||
recipeInput = new CustomWrappedStack(new OreStack(itemStack));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
recipeInput = new CustomWrappedStack(itemStack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (wrappedRecipeInput.getWrappedStack() instanceof OreStack) {
|
|
||||||
recipeInput = new CustomWrappedStack((OreStack) wrappedRecipeInput.getWrappedStack());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (recipeInput != null) {
|
|
||||||
graph.addEdge(customWrappedStack, recipeInput, weight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (NoSuchElementException e) {
|
|
||||||
LogHelper.severe(e.getMessage() + ";\nFrom: [" + customWrappedStack + "]\nTo: [" + wrappedRecipeInput + "]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int size() {
|
public int size() {
|
||||||
|
|
|
@ -4,7 +4,9 @@ import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
import com.google.common.collect.HashMultimap;
|
import com.google.common.collect.HashMultimap;
|
||||||
|
@ -20,24 +22,123 @@ public class RecipeRegistry {
|
||||||
private static RecipeRegistry recipeRegistry = null;
|
private static RecipeRegistry recipeRegistry = null;
|
||||||
|
|
||||||
private Multimap<CustomWrappedStack, List<CustomWrappedStack>> recipeMap;
|
private Multimap<CustomWrappedStack, List<CustomWrappedStack>> recipeMap;
|
||||||
|
private ArrayList<CustomWrappedStack> discoveredStacks;
|
||||||
public List<CustomWrappedStack> wildCardList;
|
private ArrayList<CustomWrappedStack> recipelessStacks;
|
||||||
|
private List<CustomWrappedStack> wildCardStacks;
|
||||||
|
|
||||||
private RecipeRegistry() {
|
private RecipeRegistry() {
|
||||||
|
|
||||||
recipeMap = HashMultimap.create();
|
recipeMap = HashMultimap.create();
|
||||||
wildCardList = RecipeHelper.populateWildCards();
|
wildCardStacks = RecipeHelper.populateWildCards();
|
||||||
|
discoveredStacks = new ArrayList<CustomWrappedStack>();
|
||||||
|
recipelessStacks = new ArrayList<CustomWrappedStack>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RecipeRegistry getInstance() {
|
public static RecipeRegistry getInstance() {
|
||||||
|
|
||||||
if (recipeRegistry == null) {
|
if (recipeRegistry == null) {
|
||||||
recipeRegistry = new RecipeRegistry();
|
recipeRegistry = new RecipeRegistry();
|
||||||
|
recipeRegistry.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
return recipeRegistry;
|
return recipeRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void init() {
|
||||||
|
|
||||||
|
Multimap<CustomWrappedStack, List<CustomWrappedStack>> recipes = HashMultimap.create();
|
||||||
|
|
||||||
|
// Add potion recipes
|
||||||
|
recipes.putAll(RecipesPotions.getPotionRecipes());
|
||||||
|
|
||||||
|
// Add smelting recipes in the vanilla smelting manager
|
||||||
|
recipes.putAll(RecipesSmelting.getSmeltingRecipes());
|
||||||
|
|
||||||
|
// Add recipes in the vanilla crafting manager
|
||||||
|
recipes.putAll(RecipesVanilla.getVanillaRecipes());
|
||||||
|
|
||||||
|
// Add recipes gathered via IMC
|
||||||
|
// TODO Gather IMC recipes
|
||||||
|
|
||||||
|
// Populate the discovered stacks list with all stacks that we are involved in a recipe we are aware of
|
||||||
|
discoverStacks(recipes);
|
||||||
|
|
||||||
|
// Add items that have no recipe, using the list of discovered stacks to determine if it's in a recipe or not
|
||||||
|
for (CustomWrappedStack stack : recipelessStacks) {
|
||||||
|
recipes.put(stack, new ArrayList<CustomWrappedStack>());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate through every recipe in the map, and add them to the registry
|
||||||
|
Set<CustomWrappedStack> recipeKeySet = recipes.keySet();
|
||||||
|
Iterator<CustomWrappedStack> recipeKeySetIterator = recipeKeySet.iterator();
|
||||||
|
CustomWrappedStack recipeOutput = null;
|
||||||
|
|
||||||
|
while (recipeKeySetIterator.hasNext()) {
|
||||||
|
recipeOutput = recipeKeySetIterator.next();
|
||||||
|
|
||||||
|
for (List<CustomWrappedStack> recipeInputs : recipes.get(recipeOutput)) {
|
||||||
|
addRecipe(recipeOutput, recipeInputs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void discoverStacks(Multimap<CustomWrappedStack, List<CustomWrappedStack>> recipes) {
|
||||||
|
|
||||||
|
Set<CustomWrappedStack> recipeKeySet = recipes.keySet();
|
||||||
|
Iterator<CustomWrappedStack> recipeKeySetIterator = recipeKeySet.iterator();
|
||||||
|
CustomWrappedStack recipeOutput = null;
|
||||||
|
|
||||||
|
while (recipeKeySetIterator.hasNext()) {
|
||||||
|
recipeOutput = recipeKeySetIterator.next();
|
||||||
|
|
||||||
|
if (!discoveredStacks.contains(new CustomWrappedStack(recipeOutput.getWrappedStack()))) {
|
||||||
|
discoveredStacks.add(new CustomWrappedStack(recipeOutput.getWrappedStack()));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (List<CustomWrappedStack> recipeInputs : recipes.get(recipeOutput)) {
|
||||||
|
for (CustomWrappedStack recipeInput : recipeInputs) {
|
||||||
|
|
||||||
|
if (!discoveredStacks.contains(new CustomWrappedStack(recipeInput.getWrappedStack()))) {
|
||||||
|
discoveredStacks.add(new CustomWrappedStack(recipeInput.getWrappedStack()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<ItemStack> subItemList = new ArrayList<ItemStack>();
|
||||||
|
|
||||||
|
for (int i = 0; i < Item.itemsList.length; i++) {
|
||||||
|
if (Item.itemsList[i] != null) {
|
||||||
|
if (Item.itemsList[i].getHasSubtypes()) {
|
||||||
|
|
||||||
|
subItemList.clear();
|
||||||
|
Item.itemsList[i].getSubItems(i, Item.itemsList[i].getCreativeTab(), subItemList);
|
||||||
|
|
||||||
|
for (ItemStack itemStack : subItemList) {
|
||||||
|
if (itemStack != null) {
|
||||||
|
|
||||||
|
CustomWrappedStack customWrappedStack = new CustomWrappedStack(itemStack);
|
||||||
|
|
||||||
|
if (!discoveredStacks.contains(customWrappedStack)) {
|
||||||
|
discoveredStacks.add(customWrappedStack);
|
||||||
|
recipelessStacks.add(customWrappedStack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
CustomWrappedStack customWrappedStack = new CustomWrappedStack(new ItemStack(Item.itemsList[i]));
|
||||||
|
|
||||||
|
if (!discoveredStacks.contains(customWrappedStack)) {
|
||||||
|
discoveredStacks.add(customWrappedStack);
|
||||||
|
recipelessStacks.add(customWrappedStack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean hasRecipe(CustomWrappedStack customWrappedStack) {
|
public boolean hasRecipe(CustomWrappedStack customWrappedStack) {
|
||||||
|
|
||||||
return recipeMap.containsKey(customWrappedStack);
|
return recipeMap.containsKey(customWrappedStack);
|
||||||
|
@ -48,26 +149,26 @@ public class RecipeRegistry {
|
||||||
return hasRecipe(new CustomWrappedStack(itemStack));
|
return hasRecipe(new CustomWrappedStack(itemStack));
|
||||||
}
|
}
|
||||||
|
|
||||||
public int countRecipes(CustomWrappedStack customWrappedStack) {
|
public int countRecipesFor(CustomWrappedStack customWrappedStack) {
|
||||||
|
|
||||||
Collection<List<CustomWrappedStack>> keys = recipeMap.get(customWrappedStack);
|
Collection<List<CustomWrappedStack>> keys = recipeMap.get(customWrappedStack);
|
||||||
|
|
||||||
return keys.size();
|
return keys.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int countRecipes(ItemStack itemStack) {
|
public int countRecipesFor(ItemStack itemStack) {
|
||||||
|
|
||||||
return countRecipes(new CustomWrappedStack(itemStack));
|
return countRecipesFor(new CustomWrappedStack(itemStack));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<List<CustomWrappedStack>> getRecipes(CustomWrappedStack customWrappedStack) {
|
public Collection<List<CustomWrappedStack>> getRecipesFor(CustomWrappedStack customWrappedStack) {
|
||||||
|
|
||||||
return recipeMap.get(customWrappedStack);
|
return recipeMap.get(customWrappedStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<List<CustomWrappedStack>> getRecipes(ItemStack itemStack) {
|
public Collection<List<CustomWrappedStack>> getRecipesFor(ItemStack itemStack) {
|
||||||
|
|
||||||
return getRecipes(new CustomWrappedStack(itemStack));
|
return getRecipesFor(new CustomWrappedStack(itemStack));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -94,8 +195,8 @@ public class RecipeRegistry {
|
||||||
wrappedInputStack = (CustomWrappedStack) object;
|
wrappedInputStack = (CustomWrappedStack) object;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wildCardList.contains(wrappedInputStack)) {
|
if (wildCardStacks.contains(wrappedInputStack)) {
|
||||||
Iterator<CustomWrappedStack> wildIter = wildCardList.iterator();
|
Iterator<CustomWrappedStack> wildIter = wildCardStacks.iterator();
|
||||||
while (wildIter.hasNext()) {
|
while (wildIter.hasNext()) {
|
||||||
CustomWrappedStack wildCard = wildIter.next();
|
CustomWrappedStack wildCard = wildIter.next();
|
||||||
if (wildCard.equals(wrappedInputStack)) {
|
if (wildCard.equals(wrappedInputStack)) {
|
||||||
|
@ -166,4 +267,24 @@ public class RecipeRegistry {
|
||||||
|
|
||||||
return stringBuilder.toString();
|
return stringBuilder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Multimap<CustomWrappedStack, List<CustomWrappedStack>> getRecipeMappings() {
|
||||||
|
|
||||||
|
return recipeMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CustomWrappedStack> getDiscoveredStacks() {
|
||||||
|
|
||||||
|
return discoveredStacks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CustomWrappedStack> getRecipelessStacks() {
|
||||||
|
|
||||||
|
return recipelessStacks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CustomWrappedStack> getWildCardStacks() {
|
||||||
|
|
||||||
|
return wildCardStacks;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue