diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index a9e7c586f..f3f2e043a 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -3368,7 +3368,7 @@ public class ModBlocks { GameRegistry.registerBlock(corium_block, corium_block.getUnlocalizedName()); GameRegistry.registerBlock(volcanic_lava_block, volcanic_lava_block.getUnlocalizedName()); GameRegistry.registerBlock(sulfuric_acid_block, sulfuric_acid_block.getUnlocalizedName()); - GameRegistry.registerBlock(concrete_liquid, concrete_liquid.getUnlocalizedName()); + //GameRegistry.registerBlock(concrete_liquid, concrete_liquid.getUnlocalizedName()); //Multiblock Dummy Blocks GameRegistry.registerBlock(dummy_block_flare, dummy_block_flare.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/config/FalloutConfigJSON.java b/src/main/java/com/hbm/config/FalloutConfigJSON.java index 869138164..4232fc527 100644 --- a/src/main/java/com/hbm/config/FalloutConfigJSON.java +++ b/src/main/java/com/hbm/config/FalloutConfigJSON.java @@ -104,10 +104,6 @@ public class FalloutConfigJSON { entries.add(new FalloutEntry() .mB(Blocks.mossy_cobblestone) .prim(new Triplet(Blocks.coal_ore, 0, 1))); - entries.add(new FalloutEntry() - .mB(Blocks.coal_ore) - .prim(new Triplet(Blocks.diamond_ore, 0, 3), new Triplet(Blocks.emerald_ore, 0, 2)) - .c(0.2)); entries.add(new FalloutEntry() .mB(Blocks.coal_ore) .prim(new Triplet(Blocks.diamond_ore, 0, 3), new Triplet(Blocks.emerald_ore, 0, 2)) diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 22086512d..ade474aa7 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -26,6 +26,7 @@ public class GeneralConfig { public static boolean enableRenderDistCheck = true; public static boolean enableCustomDashKeybind = false; public static boolean enableReEval = true; + public static boolean enableSilentCompStackErrors = true; public static int hintPos = 0; public static boolean enable528 = false; @@ -75,8 +76,9 @@ public class GeneralConfig { enableRenderDistCheck = config.get(CATEGORY_GENERAL, "1.25_enableRenderDistCheck", true, "Check invalid render distances (over 16, without OptiFine) and fix it").getBoolean(true); enableCustomDashKeybind = config.get(CATEGORY_GENERAL, "1.26_enableCustomDashKeybind", false, "Enable custom dash keybind instead of shift").getBoolean(false); enableReEval = config.get(CATEGORY_GENERAL, "1.27_enableReEval", true, "Allows re-evaluating power networks on link remove instead of destroying and recreating").getBoolean(true); + enableSilentCompStackErrors = config.get(CATEGORY_GENERAL, "1.28_enableSilentCompStackErrors", false, "Enabling this will disable log spam created by unregistered items in ComparableStack instances.").getBoolean(false); - hintPos = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.27_hudOverlayPosition", "0: Top left\n1: Top right\n2: Center right\n3: Center Left", 0); + hintPos = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.29_hudOverlayPosition", "0: Top left\n1: Top right\n2: Center right\n3: Center Left", 0); final String CATEGORY_528 = CommonConfig.CATEGORY_528; diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index 740b909b8..f26af74e1 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -4,10 +4,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import com.hbm.config.GeneralConfig; +import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import net.minecraft.block.Block; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -179,17 +180,21 @@ public class RecipesCommon { public int hashCode() { if(item == null) { - MainRegistry.logger.error("ComparableStack has a null item! This is a serious issue!"); - Thread.currentThread().dumpStack(); - item = Items.stick; + if(!GeneralConfig.enableSilentCompStackErrors) { + MainRegistry.logger.error("ComparableStack has a null item! This is a serious issue!"); + Thread.currentThread().dumpStack(); + } + item = ModItems.nothing; } String name = Item.itemRegistry.getNameForObject(item); if(name == null) { - MainRegistry.logger.error("ComparableStack holds an item that does not seem to be registered. How does that even happen?"); - Thread.currentThread().dumpStack(); - item = Items.stick; //we know sticks have a name, so sure, why not + if(!GeneralConfig.enableSilentCompStackErrors) { + MainRegistry.logger.error("ComparableStack holds an item that does not seem to be registered. How does that even happen? This error can be turned off with the config . Item name: " + item.getUnlocalizedName()); + Thread.currentThread().dumpStack(); + } + item = ModItems.nothing; } final int prime = 31; diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index af6bf1b4f..bda8a5b9a 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -76,6 +76,7 @@ public class Mats { return new DictFrame(string); } + /** will not respect stacksizes - all stacks will be treated as a singular */ public static List getMaterialsFromItem(ItemStack stack) { List list = new ArrayList(); List names = ItemStackUtil.getOreDictNames(stack); @@ -107,7 +108,7 @@ public class Mats { } } - List entries = materialEntries.get(new ComparableStack(stack)); + List entries = materialEntries.get(new ComparableStack(stack).makeSingular()); if(entries != null) { list.addAll(entries); @@ -119,12 +120,16 @@ public class Mats { public static class MaterialStack { //final fields to prevent accidental changing public final NTMMaterial material; - public final int amount; + public int amount; public MaterialStack(NTMMaterial material, int amount) { this.material = material; this.amount = amount; } + + public MaterialStack copy() { + return new MaterialStack(material, amount); + } } public static String formatAmount(int amount) { diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java new file mode 100644 index 000000000..991c2198f --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -0,0 +1,110 @@ +package com.hbm.inventory.recipes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.google.gson.JsonElement; +import com.google.gson.stream.JsonWriter; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; + +public class CrucibleRecipes extends SerializableRecipe { + + public static HashMap indexMapping = new HashMap(); + public static List recipes = new ArrayList(); + + + @Override + public void registerDefaults() { + + recipes.add(new CrucibleRecipe(0, "crucible.steel", 1) + .inputs(new MaterialStack(Mats.MAT_IRON, 10), new MaterialStack(Mats.MAT_COAL, 15)) + .outputs(new MaterialStack(Mats.MAT_STEEL, 10))); + + recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 1) + .inputs(new MaterialStack(Mats.MAT_STEEL, 10), new MaterialStack(Mats.MAT_REDSTONE, 10)) + .outputs(new MaterialStack(Mats.MAT_MINGRADE, 20))); + + recipes.add(new CrucibleRecipe(2, "crucible.aa", 1) + .inputs(new MaterialStack(Mats.MAT_STEEL, 10), new MaterialStack(Mats.MAT_MINGRADE, 10)) + .outputs(new MaterialStack(Mats.MAT_ALLOY, 20))); + } + + public static class CrucibleRecipe { + public MaterialStack[] input; + public MaterialStack[] output; + private int id; + private String name; + public int frequency; + + public CrucibleRecipe(int id, String name, int frequency) { + this.id = id; + this.name = name; + this.frequency = frequency; + + if(!indexMapping.containsKey(id)) { + indexMapping.put(id, this); + } else { + throw new IllegalStateException("Crucible recipe " + name + " has been registered with duplicate id " + id + " used by " + indexMapping.get(id).name + "!"); + } + } + + public CrucibleRecipe inputs(MaterialStack... input) { + this.input = input; + return this; + } + + public CrucibleRecipe outputs(MaterialStack... output) { + this.output = output; + return this; + } + + public int getId() { + return this.id; + } + + public String getName() { + return this.name; + } + + public int getInputAmount() { + + int content = 0; + + for(MaterialStack stack : input) { + content += stack.amount; + } + + return content; + } + } + + @Override + public String getFileName() { + return "hbmCrucible.json"; + } + + @Override + public Object getRecipeObject() { + return this.recipes; + } + + @Override + public void readRecipe(JsonElement recipe) { + + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + + } + + @Override + public void deleteRecipes() { + this.indexMapping.clear(); + this.recipes.clear(); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index c601a4222..2b53ced81 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -40,6 +40,7 @@ public abstract class SerializableRecipe { public static void registerAllHandlers() { recipeHandlers.add(new ShredderRecipes()); recipeHandlers.add(new ChemplantRecipes()); + recipeHandlers.add(new CrucibleRecipes()); recipeHandlers.add(new CentrifugeRecipes()); recipeHandlers.add(new CyclotronRecipes()); recipeHandlers.add(new HadronRecipes()); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 728a13cda..703e05aa6 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1247,6 +1247,7 @@ public class ModItems { public static Item assembly_template; public static Item chemistry_template; public static Item chemistry_icon; + public static Item crucible_template; public static Item fluid_identifier; public static Item fluid_identifier_multi; public static Item fluid_icon; @@ -4869,6 +4870,7 @@ public class ModItems { assembly_template = new ItemAssemblyTemplate().setUnlocalizedName("assembly_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":assembly_template"); chemistry_template = new ItemChemistryTemplate().setUnlocalizedName("chemistry_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":chemistry_template"); chemistry_icon = new ItemChemistryIcon().setUnlocalizedName("chemistry_icon").setMaxStackSize(1).setCreativeTab(null); + crucible_template = new ItemCrucibleTemplate().setUnlocalizedName("crucible_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":crucible_template"); fluid_identifier = new ItemFluidIdentifier().setUnlocalizedName("fluid_identifier").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":fluid_identifier"); fluid_identifier_multi = new ItemFluidIDMulti().setUnlocalizedName("fluid_identifier_multi").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":fluid_identifier_multi"); fluid_icon = new ItemFluidIcon().setUnlocalizedName("fluid_icon").setCreativeTab(null).setTextureName(RefStrings.MODID + ":fluid_icon"); @@ -6679,6 +6681,7 @@ public class ModItems { GameRegistry.registerItem(assembly_template, assembly_template.getUnlocalizedName()); GameRegistry.registerItem(chemistry_template, chemistry_template.getUnlocalizedName()); GameRegistry.registerItem(chemistry_icon, chemistry_icon.getUnlocalizedName()); + GameRegistry.registerItem(crucible_template, crucible_template.getUnlocalizedName()); //Machine Items GameRegistry.registerItem(fuse, fuse.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java new file mode 100644 index 000000000..b6171bd28 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java @@ -0,0 +1,53 @@ +package com.hbm.items.machine; + +import java.util.List; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemCrucibleTemplate extends Item { + + public ItemCrucibleTemplate() { + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + for(int i = 0; i < CrucibleRecipes.recipes.size(); i++) { + list.add(new ItemStack(item, 1, CrucibleRecipes.recipes.get(i).getId())); + } + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + + CrucibleRecipe recipe = CrucibleRecipes.indexMapping.get(stack.getItemDamage()); + + if(recipe == null) { + return; + } + + list.add("Input:"); + + for(MaterialStack in : recipe.input) { + list.add("- " + in.material.names[0] + ": " + Mats.formatAmount(in.amount)); + } + + list.add("Output:"); + + for(MaterialStack out : recipe.output) { + list.add("- " + out.material.names[0] + ": " + Mats.formatAmount(out.amount)); + } + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 67f969c72..fab95b937 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -1,7 +1,17 @@ package com.hbm.tileentity.machine; +import java.util.ArrayList; +import java.util.List; + import com.hbm.inventory.container.ContainerCrucible; import com.hbm.inventory.gui.GUICrucible; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.items.ModItems; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; @@ -11,16 +21,24 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; public class TileEntityCrucible extends TileEntityMachineBase implements IGUIProvider { - + public int heat; public static final int maxHeat = 100_000; + public int progress; + public static final int processTime = 20_000; public static final double diffusion = 0.25D; + public final int recipeCapacity = MaterialShapes.BLOCK.q(16); + public final int wasteCapacity = MaterialShapes.BLOCK.q(16); + public List recipeStack = new ArrayList(); + public List wasteStack = new ArrayList(); + public TileEntityCrucible() { super(10); } @@ -30,11 +48,20 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro return "container.machineCrucible"; } + @Override + public int getInventoryStackLimit() { + return 1; //prevents clogging + } + @Override public void updateEntity() { if(!worldObj.isRemote) { tryPullHeat(); + + if(!trySmelt()) { + this.progress = 0; + } } } @@ -61,6 +88,138 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); } + + protected boolean trySmelt() { + + if(this.heat < maxHeat / 2) return false; + + int slot = this.getFirstSmeltableSlot(); + if(slot == -1) return false; + + int delta = this.heat - (maxHeat / 2); + delta *= 0.05; + + this.progress += delta; + this.heat -= delta; + + if(this.progress >= processTime) { + this.progress = 0; + + List materials = Mats.getMaterialsFromItem(slots[slot]); + CrucibleRecipe recipe = getLoadedRecipe(); + + for(MaterialStack material : materials) { + boolean mainStack = recipe != null && getQuantaFromType(recipe.input, material.material) > 0; + + if(mainStack) { + this.addToStack(this.recipeStack, material); + } else { + this.addToStack(this.wasteStack, material); + } + } + + this.decrStackSize(slot, 1); + } + + return true; + } + + protected int getFirstSmeltableSlot() { + + for(int i = 1; i < 10; i++) { + + ItemStack stack = slots[i]; + + if(stack != null && isItemSmeltable(stack)) { + return i; + } + } + + return -1; + } + + public boolean isItemSmeltable(ItemStack stack) { + + List materials = Mats.getMaterialsFromItem(stack); + + //if there's no materials in there at all, don't smelt + if(materials.isEmpty()) + return false; + + CrucibleRecipe recipe = getLoadedRecipe(); + + //needs to be true, will always be true if there's no recipe loaded + boolean matchesRecipe = recipe == null; + + //the amount of material in the entire recipe input + int recipeContent = recipe != null ? recipe.getInputAmount() : 0; + //the total amount of the current waste stack, used for simulation + int wasteAmount = getQuantaFromType(this.wasteStack, null); + + for(MaterialStack mat : materials) { + //if no recipe is loaded, everything will land in the waste stack + int recipeInputRequired = recipe != null ? getQuantaFromType(recipe.input, mat.material) : 0; + + if(recipeInputRequired == 0) { + //if this type isn't required by the recipe, add it to the waste stack + wasteAmount += mat.amount; + } else { + + //the maximum is the recipe's ratio scaled up to the recipe stack's capacity + int matMaximum = recipeInputRequired * this.recipeCapacity / recipeContent; + int amountStored = getQuantaFromType(recipeStack, mat.material); + + matchesRecipe = true; + + //if the amount of that input would exceed the amount dictated by the recipe, return false + if(recipe != null && amountStored + mat.amount > matMaximum) + return false; + } + } + + //if the waste amount doesn't exceed the capacity and the recipe matches (or isn't null), return true + return wasteAmount <= this.wasteCapacity && matchesRecipe; + } + + public void addToStack(List stack, MaterialStack matStack) { + + for(MaterialStack mat : stack) { + if(mat.material == matStack.material) { + mat.amount += matStack.amount; + return; + } + } + + stack.add(matStack.copy()); + } + + public CrucibleRecipe getLoadedRecipe() { + + if(slots[0] != null && slots[0].getItem() == ModItems.crucible_template) { + return CrucibleRecipes.indexMapping.get(slots[0].getItemDamage()); + } + + return null; + } + + /* "Arrays and Lists don't have a common ancestor" my fucking ass */ + public int getQuantaFromType(MaterialStack[] stacks, NTMMaterial mat) { + for(MaterialStack stack : stacks) { + if(mat == null || stack.material == mat) { + return stack.amount; + } + } + return 0; + } + + public int getQuantaFromType(List stacks, NTMMaterial mat) { + for(MaterialStack stack : stacks) { + if(mat == null || stack.material == mat) { + return stack.amount; + } + } + return 0; + } @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png index 4fa4a1287..ce81e589d 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png and b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png differ