Stuffs
This commit is contained in:
parent
573c771924
commit
0fc9b53212
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue