From 8910c6c662d50c80c77978fcdc4e9fce23ec7cf0 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 18 Sep 2022 21:04:28 +0200 Subject: [PATCH] crucible fun --- src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../com/hbm/config/FalloutConfigJSON.java | 4 - .../java/com/hbm/config/GeneralConfig.java | 4 +- .../java/com/hbm/inventory/RecipesCommon.java | 19 ++- .../java/com/hbm/inventory/material/Mats.java | 9 +- .../inventory/recipes/CrucibleRecipes.java | 110 ++++++++++++ .../recipes/loader/SerializableRecipe.java | 1 + src/main/java/com/hbm/items/ModItems.java | 3 + .../items/machine/ItemCrucibleTemplate.java | 53 ++++++ .../machine/TileEntityCrucible.java | 161 +++++++++++++++++- .../textures/gui/processing/gui_crucible.png | Bin 7853 -> 9311 bytes 11 files changed, 350 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java create mode 100644 src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java 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 4fa4a1287aa77690941a067fe3f0f60ddf72cf64..ce81e589dbbbc559938b3856d8752a1bb9c737aa 100644 GIT binary patch literal 9311 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