diff --git a/api/buildcraft/api/core/BlockMetaPair.java b/api/buildcraft/api/core/BlockMetaPair.java index f4f2cf01..d83c1da8 100644 --- a/api/buildcraft/api/core/BlockMetaPair.java +++ b/api/buildcraft/api/core/BlockMetaPair.java @@ -1,6 +1,7 @@ package buildcraft.api.core; import net.minecraft.block.Block; +import net.minecraftforge.oredict.OreDictionary; public class BlockMetaPair implements Comparable { private int id, meta; @@ -40,4 +41,13 @@ public class BlockMetaPair implements Comparable { return meta - arg.meta; } } + + @Override + public String toString() { + if (this.getBlock() == null) { + return "invalid"; + } + + return Block.blockRegistry.getNameForObject(this.getBlock()) + ":" + (this.meta == OreDictionary.WILDCARD_VALUE ? "*" : this.meta); + } } diff --git a/common/buildcraft/BuildCraftBuilders.java b/common/buildcraft/BuildCraftBuilders.java index 084d3dd0..f02832c1 100644 --- a/common/buildcraft/BuildCraftBuilders.java +++ b/common/buildcraft/BuildCraftBuilders.java @@ -11,6 +11,7 @@ package buildcraft; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; +import java.io.PrintWriter; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.item.EntityMinecartChest; @@ -39,6 +40,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.config.Property; import buildcraft.api.blueprints.BlueprintDeployer; import buildcraft.api.blueprints.BuilderAPI; import buildcraft.api.blueprints.ISchematicRegistry; @@ -47,6 +49,7 @@ import buildcraft.api.blueprints.SchematicEntity; import buildcraft.api.blueprints.SchematicFactory; import buildcraft.api.blueprints.SchematicMask; import buildcraft.api.core.BCLog; +import buildcraft.api.core.BlockMetaPair; import buildcraft.api.core.JavaTools; import buildcraft.api.filler.FillerManager; import buildcraft.api.filler.IFillerPattern; @@ -158,6 +161,8 @@ public class BuildCraftBuilders extends BuildCraftMod { public static BlueprintDatabase serverDB; public static BlueprintDatabase clientDB; + public static boolean debugPrintSchematicList = false; + @Mod.EventHandler public void loadConfiguration(FMLPreInitializationEvent evt) { String blueprintServerDir = BuildCraftCore.mainConfiguration.get(Configuration.CATEGORY_GENERAL, @@ -187,6 +192,9 @@ public class BuildCraftBuilders extends BuildCraftMod { for (int i = 0; i < blueprintLibraryInput.length; ++i) { blueprintLibraryInput[i] = JavaTools.stripSurroundingQuotes(replacePathVariables(blueprintLibraryInput[i])); } + + Property printSchematicList = BuildCraftCore.mainConfiguration.get("debug", "blueprints.printSchematicList", false); + debugPrintSchematicList = printSchematicList.getBoolean(); if (BuildCraftCore.mainConfiguration.hasChanged()) { BuildCraftCore.mainConfiguration.save(); @@ -247,6 +255,20 @@ public class BuildCraftBuilders extends BuildCraftMod { @Mod.EventHandler public void postInit(FMLPostInitializationEvent evt) { HeuristicBlockDetection.start(); + + if (debugPrintSchematicList) { + try { + PrintWriter writer = new PrintWriter("SchematicDebug.txt", "UTF-8"); + writer.println("*** REGISTERED SCHEMATICS ***"); + SchematicRegistry reg = ((SchematicRegistry) BuilderAPI.schematicRegistry); + for (BlockMetaPair p : reg.schematicBlocks.keySet()) { + writer.println(p.toString() + " -> " + reg.schematicBlocks.get(p).clazz.getCanonicalName()); + } + writer.close(); + } catch(Exception e) { + e.printStackTrace(); + } + } } @Mod.EventHandler diff --git a/common/buildcraft/BuildCraftCore.java b/common/buildcraft/BuildCraftCore.java index a4960d18..3152932c 100644 --- a/common/buildcraft/BuildCraftCore.java +++ b/common/buildcraft/BuildCraftCore.java @@ -139,7 +139,7 @@ public class BuildCraftCore extends BuildCraftMod { Full, NoDynamic } public static RenderMode render = RenderMode.Full; - public static boolean debugMode = false; + public static boolean debugWorldgen = false; public static boolean modifyWorld = false; public static boolean colorBlindMode = false; public static boolean dropBrokenBlocks = true; // Set to false to prevent the filler from dropping broken blocks. diff --git a/common/buildcraft/BuildCraftTransport.java b/common/buildcraft/BuildCraftTransport.java index 48bb86f2..b1433624 100644 --- a/common/buildcraft/BuildCraftTransport.java +++ b/common/buildcraft/BuildCraftTransport.java @@ -8,6 +8,7 @@ */ package buildcraft; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -34,6 +35,7 @@ import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.RecipeSorter; import buildcraft.api.blueprints.BuilderAPI; +import buildcraft.api.core.BlockMetaPair; import buildcraft.api.core.EnumColor; import buildcraft.api.core.IIconProvider; import buildcraft.api.core.JavaTools; @@ -51,6 +53,7 @@ import buildcraft.core.InterModComms; import buildcraft.core.ItemBuildCraft; import buildcraft.core.PowerMode; import buildcraft.core.Version; +import buildcraft.core.blueprints.SchematicRegistry; import buildcraft.core.network.BuildCraftChannelHandler; import buildcraft.core.proxy.CoreProxy; import buildcraft.silicon.ItemRedstoneChipset.Chipset; @@ -217,6 +220,8 @@ public class BuildCraftTransport extends BuildCraftMod { public static IActionInternal actionExtractionPresetYellow = new ActionExtractionPreset(EnumColor.YELLOW); public static IActionInternal[] actionValve = new IActionInternal[4]; + public static boolean debugPrintFacadeList = false; + private static LinkedList pipeRecipes = new LinkedList(); public IIconProvider pipeIconProvider = new PipeIconProvider(); @@ -281,6 +286,8 @@ public class BuildCraftTransport extends BuildCraftMod { Property baseFlowRate = BuildCraftCore.mainConfiguration.get(Configuration.CATEGORY_GENERAL, "pipes.fluids.baseFlowRate", DefaultProps.PIPES_FLUIDS_BASE_FLOW_RATE); pipeFluidsBaseFlowRate = baseFlowRate.getInt(); + Property printFacadeList = BuildCraftCore.mainConfiguration.get("debug", "facades.printFacadeList", false); + debugPrintFacadeList = printFacadeList.getBoolean(); Property exclusionItemList = BuildCraftCore.mainConfiguration.get(Configuration.CATEGORY_GENERAL, "woodenPipe.item.exclusion", new String[0]); @@ -505,6 +512,22 @@ public class BuildCraftTransport extends BuildCraftMod { @Mod.EventHandler public void postInit(FMLPostInitializationEvent evt) { facadeItem.initialize(); + + if (debugPrintFacadeList) { + try { + PrintWriter writer = new PrintWriter("FacadeDebug.txt", "UTF-8"); + writer.println("*** REGISTERED FACADES ***"); + for (ItemStack stack : facadeItem.allFacades) { + if (facadeItem.getBlocksForFacade(stack).length > 0) { + BlockMetaPair bmp = new BlockMetaPair(facadeItem.getBlocksForFacade(stack)[0], facadeItem.getMetaValuesForFacade(stack)[0]); + writer.println(bmp.toString()); + } + } + writer.close(); + } catch(Exception e) { + e.printStackTrace(); + } + } } public void loadRecipes() { diff --git a/common/buildcraft/builders/HeuristicBlockDetection.java b/common/buildcraft/builders/HeuristicBlockDetection.java index e9554403..8c4439cc 100644 --- a/common/buildcraft/builders/HeuristicBlockDetection.java +++ b/common/buildcraft/builders/HeuristicBlockDetection.java @@ -1,15 +1,20 @@ package buildcraft.builders; +import java.util.BitSet; + import net.minecraft.block.Block; import net.minecraft.item.Item; - +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; - import buildcraft.api.blueprints.SchematicBlock; import buildcraft.api.blueprints.SchematicFluid; import buildcraft.builders.schematics.SchematicBlockCreative; +import buildcraft.builders.schematics.SchematicTileCreative; import buildcraft.core.blueprints.SchematicRegistry; public final class HeuristicBlockDetection { @@ -18,7 +23,24 @@ public final class HeuristicBlockDetection { } + private static BitSet craftableBlockList = new BitSet(65536); + public static void start() { + // Initialize craftableBlockList + for (Object or : CraftingManager.getInstance().getRecipeList()) { + if (or instanceof IRecipe) { + IRecipe recipe = ((IRecipe) or); + if (recipe.getRecipeOutput() != null && recipe.getRecipeOutput().getItem() != null && + recipe.getRecipeOutput().getItem() instanceof ItemBlock) { + int pos = recipe.getRecipeOutput().getItemDamage() & 15; + pos |= Block.getIdFromBlock(Block.getBlockFromItem(recipe.getRecipeOutput().getItem())) << 4; + if (pos >= 0 && pos < 65536) { + craftableBlockList.set(pos); + } + } + } + } + // Register fluids for (Fluid f : FluidRegistry.getRegisteredFluids().values()) { SchematicRegistry.INSTANCE.registerSchematicBlock(f.getBlock(), SchematicFluid.class, new FluidStack(f, 1000)); @@ -33,27 +55,34 @@ public final class HeuristicBlockDetection { for (int meta = 0; meta < 16; meta++) { if (!SchematicRegistry.INSTANCE.isSupported(block, meta)) { + if (block.hasTileEntity(meta)) { + // All tiles are registered as creative only. + // This is helpful for example for server admins. + SchematicRegistry.INSTANCE.registerSchematicBlock(block, meta, SchematicTileCreative.class); + continue; + } + boolean creativeOnly = false; - // Stops dupes with (for instance) ore blocks - try { - if (block.getItemDropped(meta, null, 0) != Item.getItemFromBlock(block)) { - creativeOnly = true; + if (!canCraft(block, meta)) { + + // Does it drop a different block type? + try { + if (block.getItemDropped(meta, null, 0) != Item.getItemFromBlock(block)) { + creativeOnly = true; + } + } catch (NullPointerException e) { + // The "null" for Random in getItemDropped stops blocks + // depending on an RNG for deciding the dropped item + // from being autodetected. } - } catch (NullPointerException e) { - // The "null" for Random in getItemDropped stops blocks - // depending on an RNG for deciding the dropped item - // from being autodetected. - } - if (block.hasTileEntity(meta)) { - continue; } try { if (creativeOnly) { - SchematicRegistry.INSTANCE.registerSchematicBlock(block, meta, SchematicBlock.class); - } else { SchematicRegistry.INSTANCE.registerSchematicBlock(block, meta, SchematicBlockCreative.class); + } else { + SchematicRegistry.INSTANCE.registerSchematicBlock(block, meta, SchematicBlock.class); } } catch (Exception e) { e.printStackTrace(); @@ -62,4 +91,9 @@ public final class HeuristicBlockDetection { } } } + + private static boolean canCraft(Block block, int meta) { + int pos = Block.getIdFromBlock(block) << 4 | meta; + return craftableBlockList.get(pos); + } } diff --git a/common/buildcraft/core/blueprints/SchematicRegistry.java b/common/buildcraft/core/blueprints/SchematicRegistry.java index b3dee0dd..2ff41d90 100644 --- a/common/buildcraft/core/blueprints/SchematicRegistry.java +++ b/common/buildcraft/core/blueprints/SchematicRegistry.java @@ -31,10 +31,10 @@ public final class SchematicRegistry implements ISchematicRegistry { public static SchematicRegistry INSTANCE = new SchematicRegistry(); - private final HashMap schematicBlocks = + public final HashMap schematicBlocks = new HashMap(); - private final HashMap, SchematicConstructor> schematicEntities = new HashMap, SchematicConstructor>(); + public final HashMap, SchematicConstructor> schematicEntities = new HashMap, SchematicConstructor>(); private final HashSet modsForbidden = new HashSet(); private final HashSet blocksForbidden = new HashSet(); @@ -42,7 +42,7 @@ public final class SchematicRegistry implements ISchematicRegistry { private SchematicRegistry() { } - private class SchematicConstructor { + public class SchematicConstructor { public final Class clazz; public final Object[] params; diff --git a/common/buildcraft/energy/worldgen/OilPopulate.java b/common/buildcraft/energy/worldgen/OilPopulate.java index ed8abb10..377953f7 100644 --- a/common/buildcraft/energy/worldgen/OilPopulate.java +++ b/common/buildcraft/energy/worldgen/OilPopulate.java @@ -90,7 +90,7 @@ public final class OilPopulate { bonus *= BuildCraftEnergy.oilWellScalar; if (BuildCraftEnergy.excessiveOilBiomeIDs.contains(biome.biomeID)) { bonus *= 30.0; - } else if (BuildCraftCore.debugMode) { + } else if (BuildCraftCore.debugWorldgen) { bonus *= 20.0; } GenType type = GenType.NONE; @@ -171,7 +171,7 @@ public final class OilPopulate { } generateSurfaceDeposit(world, rand, biome, wellX, groundLevel, wellZ, lakeRadius); - boolean makeSpring = type == GenType.LARGE && BuildCraftEnergy.spawnOilSprings && BuildCraftCore.springBlock != null && (BuildCraftCore.debugMode || rand.nextDouble() <= 0.25); + boolean makeSpring = type == GenType.LARGE && BuildCraftEnergy.spawnOilSprings && BuildCraftCore.springBlock != null && (BuildCraftCore.debugWorldgen || rand.nextDouble() <= 0.25); // Generate Spout int baseY; diff --git a/common/buildcraft/factory/BlockTank.java b/common/buildcraft/factory/BlockTank.java index 9b387539..ac9c5d3b 100644 --- a/common/buildcraft/factory/BlockTank.java +++ b/common/buildcraft/factory/BlockTank.java @@ -108,7 +108,7 @@ public class BlockTank extends BlockBuildCraft { if (liquid != null) { int qty = tank.fill(ForgeDirection.UNKNOWN, liquid, true); - if (qty != 0 && !BuildCraftCore.debugMode && !entityplayer.capabilities.isCreativeMode) { + if (qty != 0 && !BuildCraftCore.debugWorldgen && !entityplayer.capabilities.isCreativeMode) { entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, InvUtils.consumeItem(current)); } @@ -124,7 +124,7 @@ public class BlockTank extends BlockBuildCraft { liquid = FluidContainerRegistry.getFluidForFilledItem(filled); if (liquid != null) { - if (!BuildCraftCore.debugMode && !entityplayer.capabilities.isCreativeMode) { + if (!BuildCraftCore.debugWorldgen && !entityplayer.capabilities.isCreativeMode) { if (current.stackSize > 1) { if (!entityplayer.inventory.addItemStackToInventory(filled)) { return false;