This commit is contained in:
pahimar 2013-09-10 16:09:11 -04:00
parent 573c771924
commit 0fc9b53212
6 changed files with 614 additions and 647 deletions

View file

@ -1,192 +1,185 @@
package com.pahimar.ee3;
import java.io.File;
import java.util.Arrays;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraftforge.common.MinecraftForge;
import com.pahimar.ee3.block.ModBlocks;
import com.pahimar.ee3.command.CommandHandler;
import com.pahimar.ee3.configuration.ConfigurationHandler;
import com.pahimar.ee3.core.handlers.ActionRequestHandler;
import com.pahimar.ee3.core.handlers.AddonHandler;
import com.pahimar.ee3.core.handlers.CraftingHandler;
import com.pahimar.ee3.core.handlers.EntityLivingHandler;
import com.pahimar.ee3.core.handlers.FuelHandler;
import com.pahimar.ee3.core.handlers.InterModCommsHandler;
import com.pahimar.ee3.core.handlers.ItemEventHandler;
import com.pahimar.ee3.core.handlers.PlayerDestroyItemHandler;
import com.pahimar.ee3.core.handlers.VersionCheckTickHandler;
import com.pahimar.ee3.core.handlers.WorldTransmutationHandler;
import com.pahimar.ee3.core.proxy.CommonProxy;
import com.pahimar.ee3.core.util.LogHelper;
import com.pahimar.ee3.core.util.VersionHelper;
import com.pahimar.ee3.creativetab.CreativeTabEE3;
import com.pahimar.ee3.emc.DynEMC;
import com.pahimar.ee3.emc.EmcRegistry;
import com.pahimar.ee3.item.CustomWrappedStack;
import com.pahimar.ee3.item.ModItems;
import com.pahimar.ee3.item.crafting.RecipesAlchemicalBagDyes;
import com.pahimar.ee3.lib.InterModComms;
import com.pahimar.ee3.lib.Reference;
import com.pahimar.ee3.lib.Strings;
import com.pahimar.ee3.nbt.NBTHelper;
import com.pahimar.ee3.network.PacketHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLFingerprintViolationEvent;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLInterModComms;
import cpw.mods.fml.common.event.FMLInterModComms.IMCEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.TickRegistry;
import cpw.mods.fml.relauncher.Side;
/**
* Equivalent-Exchange-3
*
* EquivalentExchange3
*
* @author pahimar
* @license Lesser GNU Public License v3 (http://www.gnu.org/licenses/lgpl.html)
*
*/
@Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, version = Reference.VERSION_NUMBER, dependencies = Reference.DEPENDENCIES, certificateFingerprint = Reference.FINGERPRINT)
@NetworkMod(channels = { Reference.CHANNEL_NAME }, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketHandler.class)
public class EquivalentExchange3 {
@Instance(Reference.MOD_ID)
public static EquivalentExchange3 instance;
@SidedProxy(clientSide = Reference.CLIENT_PROXY_CLASS, serverSide = Reference.SERVER_PROXY_CLASS)
public static CommonProxy proxy;
public static CreativeTabs tabsEE3 = new CreativeTabEE3(CreativeTabs.getNextID(), Reference.MOD_ID);
@EventHandler
public void invalidFingerprint(FMLFingerprintViolationEvent event) {
// Report (log) to the user that the version of Equivalent Exchange 3
// they are using has been changed/tampered with
if (Reference.FINGERPRINT.equals("@FINGERPRINT@")) {
LogHelper.warning(Strings.NO_FINGERPRINT_MESSAGE);
}
else {
LogHelper.severe(Strings.INVALID_FINGERPRINT_MESSAGE);
}
}
@EventHandler
public void serverStarting(FMLServerStartingEvent event) {
// Initialize the custom commands
CommandHandler.initCommands(event);
}
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
// Initialize the log helper
LogHelper.init();
// Initialize the configuration
ConfigurationHandler.init(new File(event.getModConfigurationDirectory().getAbsolutePath() + File.separator + Reference.CHANNEL_NAME + File.separator + Reference.MOD_ID + ".cfg"));
// Conduct the version check and log the result
VersionHelper.execute();
// Initialize the Version Check Tick Handler (Client only)
TickRegistry.registerTickHandler(new VersionCheckTickHandler(), Side.CLIENT);
// Initialize the Render Tick Handler (Client only)
proxy.registerRenderTickHandler();
// Register the KeyBinding Handler (Client only)
proxy.registerKeyBindingHandler();
// Register the Sound Handler (Client only)
proxy.registerSoundHandler();
// Initialize mod blocks
ModBlocks.init();
// Initialize mod items
ModItems.init();
}
@EventHandler
@SuppressWarnings("unchecked")
public void load(FMLInitializationEvent event) {
// Register the GUI Handler
NetworkRegistry.instance().registerGuiHandler(instance, proxy);
// Register the PlayerDestroyItem Handler
MinecraftForge.EVENT_BUS.register(new PlayerDestroyItemHandler());
// Register the Item Pickup Handler
MinecraftForge.EVENT_BUS.register(new ItemEventHandler());
// Register the EntityLiving Handler
MinecraftForge.EVENT_BUS.register(new EntityLivingHandler());
MinecraftForge.EVENT_BUS.register(new ActionRequestHandler());
MinecraftForge.EVENT_BUS.register(new WorldTransmutationHandler());
GameRegistry.registerCraftingHandler(new CraftingHandler());
// Register the DrawBlockHighlight Handler
proxy.registerDrawBlockHighlightHandler();
// Initialize mod tile entities
proxy.registerTileEntities();
// Initialize custom rendering and pre-load textures (Client only)
proxy.initRenderingAndTextures();
// Add in the ability to dye Alchemical Bags
CraftingManager.getInstance().getRecipeList().add(new RecipesAlchemicalBagDyes());
// Register the Fuel Handler
GameRegistry.registerFuelHandler(new FuelHandler());
// Quick test to see that sending an encoded recipe to be added to the
// recipe registry works
FMLInterModComms.sendMessage(Reference.MOD_ID, InterModComms.ADD_RECIPE, NBTHelper.encodeRecipeAsNBT(Item.bucketWater, Arrays.asList(Item.bucketEmpty, Block.waterStill)));
FMLInterModComms.sendMessage(Reference.MOD_ID, InterModComms.ADD_RECIPE, NBTHelper.encodeRecipeAsNBT(Item.bucketLava, Arrays.asList(Item.bucketEmpty, Block.lavaStill)));
}
@EventHandler
public void modsLoaded(FMLPostInitializationEvent event) {
// Initialize the Addon Handler
AddonHandler.init();
// Initialize the DynEMC system
DynEMC dynEMC = DynEMC.getInstance();
// Just some temporary test code
if (EmcRegistry.getInstance().hasEmcValue(new CustomWrappedStack(Block.cobblestone))) {
LogHelper.debug(EmcRegistry.getInstance().getEmcValue(new CustomWrappedStack(Block.cobblestone)).toString());
}
}
@EventHandler
public void handleIMCMessages(IMCEvent event) {
InterModCommsHandler.processIMCMessages(event);
}
}
package com.pahimar.ee3;
import java.io.File;
import java.util.Arrays;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraftforge.common.MinecraftForge;
import com.pahimar.ee3.block.ModBlocks;
import com.pahimar.ee3.command.CommandHandler;
import com.pahimar.ee3.configuration.ConfigurationHandler;
import com.pahimar.ee3.core.handlers.ActionRequestHandler;
import com.pahimar.ee3.core.handlers.AddonHandler;
import com.pahimar.ee3.core.handlers.CraftingHandler;
import com.pahimar.ee3.core.handlers.EntityLivingHandler;
import com.pahimar.ee3.core.handlers.FuelHandler;
import com.pahimar.ee3.core.handlers.InterModCommsHandler;
import com.pahimar.ee3.core.handlers.ItemEventHandler;
import com.pahimar.ee3.core.handlers.PlayerDestroyItemHandler;
import com.pahimar.ee3.core.handlers.VersionCheckTickHandler;
import com.pahimar.ee3.core.handlers.WorldTransmutationHandler;
import com.pahimar.ee3.core.proxy.CommonProxy;
import com.pahimar.ee3.core.util.LogHelper;
import com.pahimar.ee3.core.util.VersionHelper;
import com.pahimar.ee3.creativetab.CreativeTabEE3;
import com.pahimar.ee3.emc.DynEMC;
import com.pahimar.ee3.item.ModItems;
import com.pahimar.ee3.item.crafting.RecipesAlchemicalBagDyes;
import com.pahimar.ee3.lib.InterModComms;
import com.pahimar.ee3.lib.Reference;
import com.pahimar.ee3.lib.Strings;
import com.pahimar.ee3.nbt.NBTHelper;
import com.pahimar.ee3.network.PacketHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLFingerprintViolationEvent;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLInterModComms;
import cpw.mods.fml.common.event.FMLInterModComms.IMCEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.TickRegistry;
import cpw.mods.fml.relauncher.Side;
/**
* Equivalent-Exchange-3
*
* EquivalentExchange3
*
* @author pahimar
* @license Lesser GNU Public License v3 (http://www.gnu.org/licenses/lgpl.html)
*
*/
@Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, version = Reference.VERSION_NUMBER, dependencies = Reference.DEPENDENCIES, certificateFingerprint = Reference.FINGERPRINT)
@NetworkMod(channels = { Reference.CHANNEL_NAME }, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketHandler.class)
public class EquivalentExchange3 {
@Instance(Reference.MOD_ID)
public static EquivalentExchange3 instance;
@SidedProxy(clientSide = Reference.CLIENT_PROXY_CLASS, serverSide = Reference.SERVER_PROXY_CLASS)
public static CommonProxy proxy;
public static CreativeTabs tabsEE3 = new CreativeTabEE3(CreativeTabs.getNextID(), Reference.MOD_ID);
@EventHandler
public void invalidFingerprint(FMLFingerprintViolationEvent event) {
// Report (log) to the user that the version of Equivalent Exchange 3
// they are using has been changed/tampered with
if (Reference.FINGERPRINT.equals("@FINGERPRINT@")) {
LogHelper.warning(Strings.NO_FINGERPRINT_MESSAGE);
}
else {
LogHelper.severe(Strings.INVALID_FINGERPRINT_MESSAGE);
}
}
@EventHandler
public void serverStarting(FMLServerStartingEvent event) {
// Initialize the custom commands
CommandHandler.initCommands(event);
}
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
// Initialize the log helper
LogHelper.init();
// Initialize the configuration
ConfigurationHandler.init(new File(event.getModConfigurationDirectory().getAbsolutePath() + File.separator + Reference.CHANNEL_NAME + File.separator + Reference.MOD_ID + ".cfg"));
// Conduct the version check and log the result
VersionHelper.execute();
// Initialize the Version Check Tick Handler (Client only)
TickRegistry.registerTickHandler(new VersionCheckTickHandler(), Side.CLIENT);
// Initialize the Render Tick Handler (Client only)
proxy.registerRenderTickHandler();
// Register the KeyBinding Handler (Client only)
proxy.registerKeyBindingHandler();
// Register the Sound Handler (Client only)
proxy.registerSoundHandler();
// Initialize mod blocks
ModBlocks.init();
// Initialize mod items
ModItems.init();
}
@EventHandler
@SuppressWarnings("unchecked")
public void load(FMLInitializationEvent event) {
// Register the GUI Handler
NetworkRegistry.instance().registerGuiHandler(instance, proxy);
// Register the PlayerDestroyItem Handler
MinecraftForge.EVENT_BUS.register(new PlayerDestroyItemHandler());
// Register the Item Pickup Handler
MinecraftForge.EVENT_BUS.register(new ItemEventHandler());
// Register the EntityLiving Handler
MinecraftForge.EVENT_BUS.register(new EntityLivingHandler());
MinecraftForge.EVENT_BUS.register(new ActionRequestHandler());
MinecraftForge.EVENT_BUS.register(new WorldTransmutationHandler());
GameRegistry.registerCraftingHandler(new CraftingHandler());
// Register the DrawBlockHighlight Handler
proxy.registerDrawBlockHighlightHandler();
// Initialize mod tile entities
proxy.registerTileEntities();
// Initialize custom rendering and pre-load textures (Client only)
proxy.initRenderingAndTextures();
// Add in the ability to dye Alchemical Bags
CraftingManager.getInstance().getRecipeList().add(new RecipesAlchemicalBagDyes());
// Register the Fuel Handler
GameRegistry.registerFuelHandler(new FuelHandler());
// Quick test to see that sending an encoded recipe to be added to the
// recipe registry works
FMLInterModComms.sendMessage(Reference.MOD_ID, InterModComms.ADD_RECIPE, NBTHelper.encodeRecipeAsNBT(Item.bucketWater, Arrays.asList(Item.bucketEmpty, Block.waterStill)));
FMLInterModComms.sendMessage(Reference.MOD_ID, InterModComms.ADD_RECIPE, NBTHelper.encodeRecipeAsNBT(Item.bucketLava, Arrays.asList(Item.bucketEmpty, Block.lavaStill)));
}
@EventHandler
public void modsLoaded(FMLPostInitializationEvent event) {
// Initialize the Addon Handler
AddonHandler.init();
// Initialize the DynEMC system
DynEMC dynEMC = DynEMC.getInstance();
}
@EventHandler
public void handleIMCMessages(IMCEvent event) {
InterModCommsHandler.processIMCMessages(event);
}
}

View file

@ -25,48 +25,48 @@ public class LogHelper {
eeLogger.setParent(FMLLog.getLogger());
}
public static void log(Level logLevel, String message) {
public static void log(Level logLevel, Object object) {
eeLogger.log(logLevel, message);
eeLogger.log(logLevel, object.toString());
}
public static void severe(String message) {
public static void severe(Object object) {
log(Level.SEVERE, message);
log(Level.SEVERE, object.toString());
}
public static void debug(String message) {
public static void debug(Object object) {
log(Level.WARNING, "[DEBUG] " + message);
log(Level.WARNING, "[DEBUG] " + object.toString());
}
public static void warning(String message) {
public static void warning(Object object) {
log(Level.WARNING, message);
log(Level.WARNING, object.toString());
}
public static void info(String message) {
public static void info(Object object) {
log(Level.INFO, message);
log(Level.INFO, object.toString());
}
public static void config(String message) {
public static void config(Object object) {
log(Level.CONFIG, message);
log(Level.CONFIG, object.toString());
}
public static void fine(String message) {
public static void fine(Object object) {
log(Level.FINE, message);
log(Level.FINE, object.toString());
}
public static void finer(String message) {
public static void finer(Object object) {
log(Level.FINER, message);
log(Level.FINER, object.toString());
}
public static void finest(String message) {
public static void finest(Object object) {
log(Level.FINEST, message);
log(Level.FINEST, object.toString());
}
}

View file

@ -1,163 +1,140 @@
package com.pahimar.ee3.emc;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
import com.pahimar.ee3.core.util.LogHelper;
import com.pahimar.ee3.emc.graph.WeightedDirectedGraph;
import com.pahimar.ee3.emc.graph.WeightedEdge;
import com.pahimar.ee3.item.CustomWrappedStack;
import com.pahimar.ee3.item.crafting.RecipeRegistry;
public class DynEMC {
private static DynEMC dynEMC = null;
private RecipeRegistry recipeRegistry;
private WeightedDirectedGraph<CustomWrappedStack> graph;
private DynEMC() {
recipeRegistry = RecipeRegistry.getInstance();
graph = new WeightedDirectedGraph<CustomWrappedStack>();
init();
}
public static DynEMC getInstance() {
if (dynEMC == null) {
dynEMC = new DynEMC();
}
return dynEMC;
}
private void init() {
populateGraph();
}
private void populateGraph() {
for (CustomWrappedStack discoveredStack : recipeRegistry.getDiscoveredStacks()) {
graph.addNode(discoveredStack);
}
Multimap<CustomWrappedStack, List<CustomWrappedStack>> recipeMappings = recipeRegistry.getRecipeMappings();
Set<CustomWrappedStack> recipeKeySet = recipeMappings.keySet();
Iterator<CustomWrappedStack> recipeKeySetIterator = recipeKeySet.iterator();
CustomWrappedStack recipeOutput = null;
while (recipeKeySetIterator.hasNext()) {
recipeOutput = recipeKeySetIterator.next();
for (List<CustomWrappedStack> recipeInputs : recipeMappings.get(recipeOutput)) {
CustomWrappedStack unWrappedRecipeOutput = new CustomWrappedStack(recipeOutput.getWrappedStack());
if (graph.containsNode(unWrappedRecipeOutput)) {
for (CustomWrappedStack recipeInput : recipeInputs) {
// Unwrapped the wrapped stacks so that we actually find them in the graph
CustomWrappedStack unWrappedRecipeInput = new CustomWrappedStack(recipeInput.getWrappedStack());
if (graph.containsNode(unWrappedRecipeInput)) {
if (recipeOutput.getStackSize() != 0) {
try {
graph.addEdge(unWrappedRecipeOutput, unWrappedRecipeInput, (recipeInput.getStackSize() * 1.0f) / recipeOutput.getStackSize());
}
catch (NoSuchElementException e) {
LogHelper.severe(e.getLocalizedMessage());
}
}
}
else {
LogHelper.debug("Recipe output '" + unWrappedRecipeOutput.toString() + "' exists in the crafting relationship graph");
LogHelper.debug("Recipe input '" + unWrappedRecipeInput.toString() + "' does not exist in the crafting relationship graph");
}
}
}
else {
LogHelper.debug("Recipe output '" + unWrappedRecipeOutput.toString() + "' does not exist in the crafting relationship graph");
}
}
}
}
public List<CustomWrappedStack> getCriticalNodes() {
return graph.getCriticalNodes();
}
public int size() {
return graph.size();
}
public void printDebugDump() {
LogHelper.debug("Total node count: " + graph.getAllNodes().size());
LogHelper.debug("Critical node count: " + graph.getCriticalNodes().size());
LogHelper.debug("Orphan node count: " + graph.getOrphanNodes().size());
List<CustomWrappedStack> critsMinusOrphans = graph.getCriticalNodes();
critsMinusOrphans.removeAll(graph.getOrphanNodes());
LogHelper.debug("[Critical - Orphans] node count: " + critsMinusOrphans.size());
LogHelper.debug("***** START NODES *****");
Iterator<CustomWrappedStack> nodeIter = graph.iterator();
while (nodeIter.hasNext()) {
CustomWrappedStack node = nodeIter.next();
LogHelper.debug("Node: " + node);
}
LogHelper.debug("***** END NODES *****");
LogHelper.debug("***** START EDGES FROM *****");
nodeIter = graph.iterator();
while (nodeIter.hasNext()) {
CustomWrappedStack node = nodeIter.next();
ImmutableList<WeightedEdge<CustomWrappedStack>> edgesFrom = graph.edgesFrom(node);
for (WeightedEdge<CustomWrappedStack> edge : edgesFrom) {
LogHelper.debug("Crafting Output: " + node);
LogHelper.debug("Crafting Input: " + edge.target);
LogHelper.debug("Weight: " + edge.weight);
LogHelper.debug("");
}
}
LogHelper.debug("***** END EDGES FROM *****");
LogHelper.debug("***** START EDGES TO *****");
nodeIter = graph.iterator();
while (nodeIter.hasNext()) {
CustomWrappedStack node = nodeIter.next();
ImmutableList<WeightedEdge<CustomWrappedStack>> edgesTo = graph.edgesTo(node);
Iterator<WeightedEdge<CustomWrappedStack>> edgeIter = edgesTo.iterator();
while (edgeIter.hasNext()) {
WeightedEdge<CustomWrappedStack> edge = edgeIter.next();
LogHelper.debug("From: " + node);
LogHelper.debug("To: " + edge.target);
LogHelper.debug("Weight: " + edge.weight);
LogHelper.debug("");
}
}
LogHelper.debug("***** END EDGES TO *****");
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.format("DynEMC Node Count: %s", graph.size()));
return stringBuilder.toString();
}
}
package com.pahimar.ee3.emc;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
import com.pahimar.ee3.core.util.LogHelper;
import com.pahimar.ee3.emc.graph.WeightedDirectedGraph;
import com.pahimar.ee3.emc.graph.WeightedEdge;
import com.pahimar.ee3.item.CustomWrappedStack;
import com.pahimar.ee3.item.crafting.RecipeRegistry;
public class DynEMC {
private static DynEMC dynEMC = null;
private RecipeRegistry recipeRegistry;
public final WeightedDirectedGraph<CustomWrappedStack> graph;
private DynEMC() {
recipeRegistry = RecipeRegistry.getInstance();
graph = new WeightedDirectedGraph<CustomWrappedStack>();
init();
}
public static DynEMC getInstance() {
if (dynEMC == null) {
dynEMC = new DynEMC();
}
return dynEMC;
}
private void init() {
populateGraph();
}
private void populateGraph() {
for (CustomWrappedStack discoveredStack : recipeRegistry.getDiscoveredStacks()) {
graph.addNode(discoveredStack);
}
Multimap<CustomWrappedStack, List<CustomWrappedStack>> recipeMappings = recipeRegistry.getRecipeMappings();
Set<CustomWrappedStack> recipeKeySet = recipeMappings.keySet();
Iterator<CustomWrappedStack> recipeKeySetIterator = recipeKeySet.iterator();
CustomWrappedStack recipeOutput = null;
while (recipeKeySetIterator.hasNext()) {
recipeOutput = recipeKeySetIterator.next();
for (List<CustomWrappedStack> recipeInputs : recipeMappings.get(recipeOutput)) {
CustomWrappedStack unWrappedRecipeOutput = new CustomWrappedStack(recipeOutput.getWrappedStack());
if (graph.containsNode(unWrappedRecipeOutput)) {
for (CustomWrappedStack recipeInput : recipeInputs) {
// Unwrapped the wrapped stacks so that we actually find them in the graph
CustomWrappedStack unWrappedRecipeInput = new CustomWrappedStack(recipeInput.getWrappedStack());
if (graph.containsNode(unWrappedRecipeInput)) {
if (recipeOutput.getStackSize() != 0) {
try {
graph.addEdge(unWrappedRecipeOutput, unWrappedRecipeInput, (recipeInput.getStackSize() * 1.0f) / recipeOutput.getStackSize());
}
catch (NoSuchElementException e) {
LogHelper.severe(e.getLocalizedMessage());
}
}
}
else {
LogHelper.debug("Recipe output '" + unWrappedRecipeOutput.toString() + "' exists in the crafting relationship graph");
LogHelper.debug("Recipe input '" + unWrappedRecipeInput.toString() + "' does not exist in the crafting relationship graph");
}
}
}
else {
LogHelper.debug("Recipe output '" + unWrappedRecipeOutput.toString() + "' does not exist in the crafting relationship graph");
}
}
}
}
public void printDebugDump() {
LogHelper.debug("Total node count: " + graph.getAllNodes().size());
LogHelper.debug("Critical node count: " + graph.getCriticalNodes().size());
LogHelper.debug("Orphan node count: " + graph.getOrphanNodes().size());
LogHelper.debug("");
LogHelper.debug("***** START NODES *****");
Iterator<CustomWrappedStack> nodeIter = graph.iterator();
while (nodeIter.hasNext()) {
CustomWrappedStack node = nodeIter.next();
LogHelper.debug("Node: " + node);
}
LogHelper.debug("***** END NODES *****");
LogHelper.debug("");
LogHelper.debug("***** START EDGES FROM *****");
nodeIter = graph.iterator();
while (nodeIter.hasNext()) {
CustomWrappedStack node = nodeIter.next();
ImmutableList<WeightedEdge<CustomWrappedStack>> edgesFrom = graph.edgesFrom(node);
for (WeightedEdge<CustomWrappedStack> edge : edgesFrom) {
LogHelper.debug("Crafting Output: " + node + ", Crafting Input: " + edge.target + ", Weight: " + edge.weight);
}
}
LogHelper.debug("***** END EDGES FROM *****");
LogHelper.debug("");
LogHelper.debug("***** START EDGES TO *****");
nodeIter = graph.iterator();
while (nodeIter.hasNext()) {
CustomWrappedStack node = nodeIter.next();
ImmutableList<WeightedEdge<CustomWrappedStack>> edgesTo = graph.edgesTo(node);
for (WeightedEdge<CustomWrappedStack> edge : edgesTo) {
LogHelper.debug("Crafting Input: " + node + ", Crafting Output: " + edge.target + ", Weight: " + edge.weight);
}
}
LogHelper.debug("***** END EDGES TO *****");
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.format("DynEMC Node Count: %s", graph.size()));
return stringBuilder.toString();
}
}

View file

@ -1,272 +1,265 @@
package com.pahimar.ee3.emc.graph;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import com.google.common.collect.ImmutableList;
public class WeightedDirectedGraph<T> implements Iterable<T> {
private final Map<T, SortedSet<WeightedEdge<T>>> graph = new HashMap<T, SortedSet<WeightedEdge<T>>>();
public boolean addNode(T node) {
if (containsNode(node)) {
return false;
}
graph.put(node, new TreeSet<WeightedEdge<T>>());
return true;
}
public void addEdge(T from, T to) {
addEdge(from, to, 1);
}
public void addEdge(T from, T to, float weight) {
if (containsNode(from) && containsNode(to) && !containsWeightedEdge(from, to, weight)) {
graph.get(from).add(new WeightedEdge<T>(to, weight));
}
}
/***
*
* @param node
* The node we are checking for
* @return True if specified node exists in the graph, false otherwise
*/
public boolean containsNode(T node) {
return graph.containsKey(node);
}
/***
*
* @param from
* The 'from' node in the graph
* @param to
* The 'to' node in the graph
* @return True if there exists at least one WeightedEdge from the 'from'
* node going to the 'to' node
*/
public boolean containsAnyEdge(T from, T to) {
if (containsNode(from)) {
Iterator<WeightedEdge<T>> edgeIterator = graph.get(from).iterator();
while (edgeIterator.hasNext()) {
if (edgeIterator.next().target.equals(to)) {
return true;
}
}
}
return false;
}
/***
*
* @param from
* The 'from' node in the graph
* @param to
* The 'to' node in the graph
* @param weight
* The weight of the WeightedEdge we are looking for
* @return
*/
public boolean containsWeightedEdge(T from, T to, float weight) {
if (containsNode(from)) {
return graph.get(from).contains(new WeightedEdge<T>(to, weight));
}
return false;
}
/***
*
* @param node
* @return An ImmutableSet of WeightedEdges from the specified node
*/
public ImmutableList<WeightedEdge<T>> edgesFrom(T node) {
if (containsNode(node)) {
return ImmutableList.copyOf(graph.get(node));
}
return ImmutableList.of();
}
public ImmutableList<WeightedEdge<T>> edgesTo(T targetNode) {
ImmutableList.Builder<WeightedEdge<T>> edgesToTargetNodeList = ImmutableList.builder();
if (containsNode(targetNode)) {
for (T graphNode : graph.keySet()) {
if (!graphNode.equals(targetNode)) {
ImmutableList<WeightedEdge<T>> edgesFromGraphNode = edgesFrom(graphNode);
for (WeightedEdge<T> edgeFromGraphNode : edgesFromGraphNode) {
if (edgeFromGraphNode.target.equals(targetNode)) {
edgesToTargetNodeList.add(new WeightedEdge<T>(graphNode, edgeFromGraphNode.weight));
}
}
}
}
}
return edgesToTargetNodeList.build();
}
public void removeNode(T node) {
if (containsNode(node)) {
// Remove all edges from and to the node
removeEdgesFrom(node);
removeEdgesTo(node);
// Remove the node
graph.remove(node);
}
}
public void removeEdge(T from, T to) {
removeEdge(from, to, 1);
}
public void removeEdge(T from, T to, float weight) {
if (containsNode(from) && containsNode(to)) {
graph.get(from).remove(new WeightedEdge<T>(to, weight));
}
}
public void removeEdgesFrom(T node) {
if (containsNode(node)) {
graph.get(node).clear();
}
}
public void removeEdgesTo(T targetNode) {
if (containsNode(targetNode)) {
for (T graphNode : graph.keySet()) {
ImmutableList<WeightedEdge<T>> edgesFromGraphNode = edgesFrom(graphNode);
for (WeightedEdge<T> edgeFromGraphNode : edgesFromGraphNode) {
if (edgeFromGraphNode.target.equals(targetNode)) {
graph.get(graphNode).remove(edgeFromGraphNode);
}
}
}
}
}
public void removeAllEdgesBetween(T firstNode, T secondNode) {
if (containsNode(firstNode) && containsNode(secondNode)) {
for (WeightedEdge<T> edgeFromFirstNode : edgesFrom(firstNode)) {
if (edgeFromFirstNode.target.equals(secondNode)) {
graph.get(firstNode).remove(edgeFromFirstNode);
}
}
for (WeightedEdge<T> edgeFromSecondNode : edgesFrom(secondNode)) {
if (edgeFromSecondNode.target.equals(firstNode)) {
graph.get(secondNode).remove(edgeFromSecondNode);
}
}
}
}
public ImmutableList<T> getAllNodes() {
if (graph.keySet() != null) {
return ImmutableList.copyOf(graph.keySet());
}
else {
return ImmutableList.of();
}
}
public ImmutableList<T> getCriticalNodes() {
ImmutableList.Builder<T> criticalNodesList = ImmutableList.builder();
Iterator<T> nodeIterator = this.iterator();
while (nodeIterator.hasNext()) {
T currentNode = nodeIterator.next();
if (this.edgesFrom(currentNode).size() == 0) {
criticalNodesList.add(currentNode);
}
}
return criticalNodesList.build();
}
public ImmutableList<T> getOrphanNodes() {
ImmutableList.Builder<T> orphanNodesList = ImmutableList.builder();
Iterator<T> nodeIterator = this.iterator();
while (nodeIterator.hasNext()) {
T currentNode = nodeIterator.next();
if (this.edgesFrom(currentNode).size() == 0 && this.edgesTo(currentNode).size() == 0) {
orphanNodesList.add(currentNode);
}
}
return orphanNodesList.build();
}
@Override
public Iterator<T> iterator() {
return this.getAllNodes().iterator();
}
public int size() {
return graph.size();
}
public boolean isEmpty() {
return graph.isEmpty();
}
@Override
public String toString() {
return graph.toString();
}
// TODO Finish
public WeightedDirectedGraph<T> DepthFirstSearch(Set<T> nodes) {
for (T node : nodes) {
}
return null;
}
}
package com.pahimar.ee3.emc.graph;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import com.google.common.collect.ImmutableList;
public class WeightedDirectedGraph<T> implements Iterable<T> {
private final Map<T, SortedSet<WeightedEdge<T>>> graph = new HashMap<T, SortedSet<WeightedEdge<T>>>();
public boolean addNode(T node) {
if (containsNode(node)) {
return false;
}
graph.put(node, new TreeSet<WeightedEdge<T>>());
return true;
}
public void addEdge(T from, T to) {
addEdge(from, to, 1);
}
public void addEdge(T from, T to, float weight) {
if (containsNode(from) && containsNode(to) && !containsWeightedEdge(from, to, weight)) {
graph.get(from).add(new WeightedEdge<T>(to, weight));
}
}
/***
*
* @param node
* The node we are checking for
* @return True if specified node exists in the graph, false otherwise
*/
public boolean containsNode(T node) {
return graph.containsKey(node);
}
/***
*
* @param from
* The 'from' node in the graph
* @param to
* The 'to' node in the graph
* @return True if there exists at least one WeightedEdge from the 'from'
* node going to the 'to' node
*/
public boolean containsAnyEdge(T from, T to) {
if (containsNode(from)) {
Iterator<WeightedEdge<T>> edgeIterator = graph.get(from).iterator();
while (edgeIterator.hasNext()) {
if (edgeIterator.next().target.equals(to)) {
return true;
}
}
}
return false;
}
/***
*
* @param from
* The 'from' node in the graph
* @param to
* The 'to' node in the graph
* @param weight
* The weight of the WeightedEdge we are looking for
* @return
*/
public boolean containsWeightedEdge(T from, T to, float weight) {
if (containsNode(from)) {
return graph.get(from).contains(new WeightedEdge<T>(to, weight));
}
return false;
}
/***
*
* @param node
* @return An ImmutableSet of WeightedEdges from the specified node
*/
public ImmutableList<WeightedEdge<T>> edgesFrom(T node) {
if (containsNode(node)) {
return ImmutableList.copyOf(graph.get(node));
}
return ImmutableList.of();
}
public ImmutableList<WeightedEdge<T>> edgesTo(T targetNode) {
ImmutableList.Builder<WeightedEdge<T>> edgesToTargetNodeList = ImmutableList.builder();
if (containsNode(targetNode)) {
for (T graphNode : getAllNodes()) {
if (!graphNode.equals(targetNode)) {
ImmutableList<WeightedEdge<T>> edgesFromGraphNode = edgesFrom(graphNode);
for (WeightedEdge<T> edgeFromGraphNode : edgesFromGraphNode) {
if (edgeFromGraphNode.target.equals(targetNode)) {
edgesToTargetNodeList.add(new WeightedEdge<T>(graphNode, edgeFromGraphNode.weight));
}
}
}
}
}
return edgesToTargetNodeList.build();
}
public void removeNode(T node) {
if (containsNode(node)) {
// Remove all edges from and to the node
removeEdgesFrom(node);
removeEdgesTo(node);
// Remove the node
graph.remove(node);
}
}
public void removeEdge(T from, T to) {
removeEdge(from, to, 1);
}
public void removeEdge(T from, T to, float weight) {
if (containsNode(from) && containsNode(to)) {
graph.get(from).remove(new WeightedEdge<T>(to, weight));
}
}
public void removeEdgesFrom(T node) {
if (containsNode(node)) {
graph.get(node).clear();
}
}
public void removeEdgesTo(T targetNode) {
if (containsNode(targetNode)) {
for (T graphNode : graph.keySet()) {
ImmutableList<WeightedEdge<T>> edgesFromGraphNode = edgesFrom(graphNode);
for (WeightedEdge<T> edgeFromGraphNode : edgesFromGraphNode) {
if (edgeFromGraphNode.target.equals(targetNode)) {
graph.get(graphNode).remove(edgeFromGraphNode);
}
}
}
}
}
public void removeAllEdgesBetween(T firstNode, T secondNode) {
if (containsNode(firstNode) && containsNode(secondNode)) {
for (WeightedEdge<T> edgeFromFirstNode : edgesFrom(firstNode)) {
if (edgeFromFirstNode.target.equals(secondNode)) {
graph.get(firstNode).remove(edgeFromFirstNode);
}
}
for (WeightedEdge<T> edgeFromSecondNode : edgesFrom(secondNode)) {
if (edgeFromSecondNode.target.equals(firstNode)) {
graph.get(secondNode).remove(edgeFromSecondNode);
}
}
}
}
public ImmutableList<T> getAllNodes() {
if (graph.keySet() != null) {
return ImmutableList.copyOf(graph.keySet());
}
else {
return ImmutableList.of();
}
}
public ImmutableList<T> getCriticalNodes() {
ImmutableList.Builder<T> criticalNodesList = ImmutableList.builder();
Iterator<T> nodeIterator = this.iterator();
while (nodeIterator.hasNext()) {
T currentNode = nodeIterator.next();
if (this.edgesFrom(currentNode).size() == 0) {
criticalNodesList.add(currentNode);
}
}
return criticalNodesList.build();
}
public ImmutableList<T> getOrphanNodes() {
ImmutableList.Builder<T> orphanNodesList = ImmutableList.builder();
Iterator<T> nodeIterator = this.iterator();
while (nodeIterator.hasNext()) {
T currentNode = nodeIterator.next();
if (this.edgesFrom(currentNode).size() == 0 && this.edgesTo(currentNode).size() == 0) {
orphanNodesList.add(currentNode);
}
}
return orphanNodesList.build();
}
@Override
public Iterator<T> iterator() {
return this.getAllNodes().iterator();
}
public int size() {
return graph.size();
}
public boolean isEmpty() {
return graph.isEmpty();
}
@Override
public String toString() {
return graph.toString();
}
public void DepthFirstSearch(T node) {
// TODO
}
}

View file

@ -53,7 +53,7 @@ public class WeightedEdge<T> implements Comparable<WeightedEdge<T>> {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.format("Target: %s, Weight: %s ", target, weight));
stringBuilder.append(String.format("Target: %s, Weight: %s", target, weight));
return stringBuilder.toString();
}

View file

@ -200,7 +200,11 @@ public class CustomWrappedStack implements Comparable<CustomWrappedStack> {
StringBuilder stringBuilder = new StringBuilder();
if (itemStack != null) {
stringBuilder.append(String.format("%sxitemStack[%s:%s:%s:%s]", stackSize, itemStack.itemID, itemStack.getItemDamage(), itemStack.getUnlocalizedName(), itemStack.getItem().getClass().getCanonicalName()));
try {
stringBuilder.append(String.format("%sxitemStack[%s:%s:%s:%s]", stackSize, itemStack.itemID, itemStack.getItemDamage(), itemStack.getUnlocalizedName(), itemStack.getItem().getClass().getCanonicalName()));
} catch (ArrayIndexOutOfBoundsException e) {
}
}
else if (oreStack != null) {
stringBuilder.append(String.format("%dxoreDictionary.%s", stackSize, oreStack.oreName));