From 284c6a654a7307af61ea45cd854c578e3e3533b9 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 31 Mar 2026 14:03:03 +0200 Subject: [PATCH] template folder died from nine shots in the back of the head (suicide) --- changelog | 3 +- .../java/com/hbm/blocks/machine/BlockPWR.java | 9 +- .../com/hbm/creativetabs/TemplateTab.java | 4 +- .../handler/nei/CrucibleAlloyingHandler.java | 12 +- .../container/ContainerCrucible.java | 9 +- .../com/hbm/inventory/gui/GUICrucible.java | 22 ++ .../gui/GUIScreenTemplateFolder.java | 330 ------------------ .../hbm/inventory/recipes/CrucibleRecipe.java | 67 ++++ .../inventory/recipes/CrucibleRecipes.java | 130 +++---- .../recipes/loader/SerializableRecipe.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 9 +- .../items/machine/ItemCrucibleTemplate.java | 75 ---- .../hbm/items/machine/ItemTemplateFolder.java | 52 --- .../com/hbm/items/special/ItemStarterKit.java | 2 - src/main/java/com/hbm/main/ClientProxy.java | 2 - .../java/com/hbm/main/CraftingManager.java | 1 - src/main/java/com/hbm/main/MainRegistry.java | 1 + .../com/hbm/main/ModEventHandlerClient.java | 1 - .../java/com/hbm/packet/PacketDispatcher.java | 2 - .../hbm/packet/toserver/ItemFolderPacket.java | 156 --------- .../hbm/render/item/ItemRenderTemplate.java | 49 --- .../machine/TileEntityCrucible.java | 45 ++- .../machine/TileEntityPWRController.java | 24 +- .../com/hbm/util/CompatRecipeRegistry.java | 7 +- .../textures/gui/processing/gui_crucible.png | Bin 12289 -> 11763 bytes 25 files changed, 198 insertions(+), 816 deletions(-) delete mode 100644 src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java create mode 100644 src/main/java/com/hbm/inventory/recipes/CrucibleRecipe.java delete mode 100644 src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java delete mode 100644 src/main/java/com/hbm/items/machine/ItemTemplateFolder.java delete mode 100644 src/main/java/com/hbm/packet/toserver/ItemFolderPacket.java delete mode 100644 src/main/java/com/hbm/render/item/ItemRenderTemplate.java diff --git a/changelog b/changelog index e40090aec..3b4999bec 100644 --- a/changelog +++ b/changelog @@ -14,4 +14,5 @@ ## Fixed * Fixed euphemium compound plate recipe not yielding four items as it should in the plasma forge * Fixed NTM rare item drops ignoring the mob loot gamerule -* Fixed flamethrowers not properly igniting entities on direct hit, only via lingering fire \ No newline at end of file +* Fixed flamethrowers not properly igniting entities on direct hit, only via lingering fire +* Fixed PWR RoR components not properly showing the possible values/functions when connected to ports \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/BlockPWR.java b/src/main/java/com/hbm/blocks/machine/BlockPWR.java index 74e352923..aff9d5cbf 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockPWR.java +++ b/src/main/java/com/hbm/blocks/machine/BlockPWR.java @@ -342,10 +342,7 @@ public class BlockPWR extends BlockContainer implements IBlockCT { @Override public String[] getFunctionInfo() { - if(this.getBlockMetadata() != 1) return new String[0]; - TileEntityPWRController controller = this.getCore(); - if(controller != null) return controller.getFunctionInfo(); - return new String[0]; + return TileEntityPWRController.ROR; } @Override @@ -353,7 +350,7 @@ public class BlockPWR extends BlockContainer implements IBlockCT { if(this.getBlockMetadata() != 1) return ""; TileEntityPWRController controller = this.getCore(); if(controller != null) return controller.provideRORValue(name); - return ""; + return null; } @Override @@ -361,7 +358,7 @@ public class BlockPWR extends BlockContainer implements IBlockCT { if(this.getBlockMetadata() != 1) return ""; TileEntityPWRController controller = this.getCore(); if(controller != null) return controller.runRORFunction(name, params); - return ""; + return null; } } } diff --git a/src/main/java/com/hbm/creativetabs/TemplateTab.java b/src/main/java/com/hbm/creativetabs/TemplateTab.java index 414d020be..f2f88d054 100644 --- a/src/main/java/com/hbm/creativetabs/TemplateTab.java +++ b/src/main/java/com/hbm/creativetabs/TemplateTab.java @@ -16,8 +16,8 @@ public class TemplateTab extends CreativeTabs { @Override public Item getTabIconItem() { - if(ModItems.crucible_template != null) { - return ModItems.crucible_template; + if(ModItems.blueprints != null) { + return ModItems.blueprints; } return Items.iron_pickaxe; diff --git a/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java index 4cdca10fe..d39771616 100644 --- a/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java +++ b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java @@ -10,8 +10,8 @@ import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.recipes.CrucibleRecipe; import com.hbm.inventory.recipes.CrucibleRecipes; -import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemScraps; import com.hbm.lib.RefStrings; @@ -38,17 +38,16 @@ public class CrucibleAlloyingHandler extends TemplateRecipeHandler implements IC public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { List inputs = new ArrayList(); - PositionedStack template; PositionedStack crucible; List outputs = new ArrayList(); public RecipeSet(CrucibleRecipe recipe) { + List inputs = new ArrayList(); List outputs = new ArrayList(); for(MaterialStack stack : recipe.input) inputs.add(ItemScraps.create(stack, true)); for(MaterialStack stack : recipe.output) outputs.add(ItemScraps.create(stack, true)); - this.template = new PositionedStack(new ItemStack(ModItems.crucible_template, 1, recipe.getId()), 75, 6); this.crucible = new PositionedStack(new ItemStack(ModBlocks.machine_crucible), 75, 42); for(int i = 0; i < inputs.size(); i++) { @@ -77,7 +76,6 @@ public class CrucibleAlloyingHandler extends TemplateRecipeHandler implements IC List other = new ArrayList(); other.addAll(inputs); other.add(crucible); - other.add(template); other.addAll(outputs); return getCycledIngredients(cycleticks / 20, other); } @@ -98,7 +96,7 @@ public class CrucibleAlloyingHandler extends TemplateRecipeHandler implements IC if(outputId.equals("ntmCrucibleAlloying")) { - for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + for(CrucibleRecipe recipe : CrucibleRecipes.INSTANCE.recipeOrderedList) { this.arecipes.add(new RecipeSet(recipe)); } } else { @@ -114,7 +112,7 @@ public class CrucibleAlloyingHandler extends TemplateRecipeHandler implements IC NTMMaterial material = Mats.matById.get(result.getItemDamage()); - for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + for(CrucibleRecipe recipe : CrucibleRecipes.INSTANCE.recipeOrderedList) { for(MaterialStack stack : recipe.output) { if(stack.material == material) { @@ -143,7 +141,7 @@ public class CrucibleAlloyingHandler extends TemplateRecipeHandler implements IC NTMMaterial material = Mats.matById.get(ingredient.getItemDamage()); - for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + for(CrucibleRecipe recipe : CrucibleRecipes.INSTANCE.recipeOrderedList) { for(MaterialStack stack : recipe.input) { if(stack.material == material) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java index f04d9e9f1..7fdedbd2c 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java @@ -17,9 +17,6 @@ public class ContainerCrucible extends Container { public ContainerCrucible(InventoryPlayer invPlayer, TileEntityCrucible crucible) { this.crucible = crucible; - //template - this.addSlotToContainer(new SlotNonRetarded(crucible, 0, 107, 81)); - //input for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { @@ -53,14 +50,14 @@ public class ContainerCrucible extends Container { ItemStack originalStack = slot.getStack(); stack = originalStack.copy(); - if(index <= 9) { - if(!this.mergeItemStack(originalStack, 10, this.inventorySlots.size(), true)) { + if(index <= 8) { + if(!this.mergeItemStack(originalStack, 9, this.inventorySlots.size(), true)) { return null; } slot.onSlotChange(originalStack, stack); - } else if(!InventoryUtil.mergeItemStack(this.inventorySlots, originalStack, 0, 10, false)) { + } else if(!InventoryUtil.mergeItemStack(this.inventorySlots, originalStack, 0, 9, false)) { return null; } diff --git a/src/main/java/com/hbm/inventory/gui/GUICrucible.java b/src/main/java/com/hbm/inventory/gui/GUICrucible.java index b63e4af4f..605a268b1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrucible.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrucible.java @@ -12,6 +12,9 @@ import com.hbm.inventory.container.ContainerCrucible; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; +import com.hbm.inventory.recipes.CrucibleRecipe; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCrucible; import com.hbm.util.i18n.I18nUtil; @@ -45,6 +48,22 @@ public class GUICrucible extends GuiInfoContainer { this.drawCustomInfoStat(x, y, guiLeft + 125, guiTop + 81, 34, 7, x, y, new String[] { String.format(Locale.US, "%,d", crucible.progress) + " / " + String.format(Locale.US, "%,d", crucible.processTime) + "TU" }); this.drawCustomInfoStat(x, y, guiLeft + 125, guiTop + 90, 34, 7, x, y, new String[] { String.format(Locale.US, "%,d", crucible.heat) + " / " + String.format(Locale.US, "%,d", crucible.maxHeat) + "TU" }); + + if(guiLeft + 106 <= x && guiLeft + 106 + 18 > x && guiTop + 80 < y && guiTop + 80 + 18 >= y) { + if(this.crucible.recipe != null && CrucibleRecipes.INSTANCE.recipeNameMap.containsKey(this.crucible.recipe)) { + CrucibleRecipe recipe = (CrucibleRecipe) CrucibleRecipes.INSTANCE.recipeNameMap.get(this.crucible.recipe); + this.func_146283_a(recipe.print(), x, y); + } else { + this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), x, y); + } + } + } + + @Override + protected void mouseClicked(int x, int y, int button) { + super.mouseClicked(x, y, button); + + if(this.checkClick(x, y, 106, 80, 18, 18)) GUIScreenRecipeSelector.openSelector(CrucibleRecipes.INSTANCE, crucible, crucible.recipe, 0, null, this); } @Override @@ -66,6 +85,9 @@ public class GUICrucible extends GuiInfoContainer { int hGauge = crucible.heat * 33 / crucible.maxHeat; if(hGauge > 0) drawTexturedModalRect(guiLeft + 126, guiTop + 91, 176, 5, hGauge, 5); + GenericRecipe recipe = CrucibleRecipes.INSTANCE.recipeNameMap.get(crucible.recipe); + this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 107, 81); + if(!crucible.recipeStack.isEmpty()) drawStack(crucible.recipeStack, crucible.recipeZCapacity, 62, 97); if(!crucible.wasteStack.isEmpty()) drawStack(crucible.wasteStack, crucible.wasteZCapacity, 17, 97); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java deleted file mode 100644 index 5b7de34d2..000000000 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ /dev/null @@ -1,330 +0,0 @@ -package com.hbm.inventory.gui; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; - -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - -import com.hbm.inventory.recipes.CrucibleRecipes; -import com.hbm.items.ModItems; -import com.hbm.lib.RefStrings; -import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toserver.ItemFolderPacket; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.PositionedSoundRecord; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.gui.GuiTextField; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -public class GUIScreenTemplateFolder extends GuiScreen { - - protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_planner.png"); - protected static final ResourceLocation texture_journal = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_planner_journal.png"); - private boolean isJournal = false; - protected int xSize = 176; - protected int ySize = 229; - protected int guiLeft; - protected int guiTop; - int currentPage = 0; - List allStacks = new ArrayList(); - List stacks = new ArrayList(); - List buttons = new ArrayList(); - private GuiTextField search; - - public GUIScreenTemplateFolder(EntityPlayer player) { - - if(player.getHeldItem() == null) - return; - - Item item = player.getHeldItem().getItem(); - - this.isJournal = item != ModItems.template_folder; - - - - if(!this.isJournal) { - - // Crucible Templates - for(int i = 0; i < CrucibleRecipes.recipes.size(); i++) { - allStacks.add(new ItemStack(ModItems.crucible_template, 1, CrucibleRecipes.recipes.get(i).getId())); - } - } - - search(null); - } - - private void search(String sub) { - - stacks.clear(); - - this.currentPage = 0; - - if(sub == null || sub.isEmpty()) { - stacks.addAll(allStacks); - updateButtons(); - return; - } - - sub = sub.toLowerCase(Locale.US); - - outer: - for(ItemStack stack : allStacks) { - - for(Object o : stack.getTooltip(MainRegistry.proxy.me(), true)) { - - if(o instanceof String) { - String text = (String) o; - - if(text.toLowerCase(Locale.US).contains(sub)) { - stacks.add(stack); - continue outer; - } - } - } - } - - updateButtons(); - } - - int getPageCount() { - return (int) Math.ceil((stacks.size() - 1) / (5 * 7)); - } - - @Override - public void updateScreen() { - if(currentPage < 0) - currentPage = 0; - if(currentPage > getPageCount()) - currentPage = getPageCount(); - } - - @Override - public void drawScreen(int mouseX, int mouseY, float f) { - this.drawDefaultBackground(); - this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); - GL11.glDisable(GL11.GL_LIGHTING); - this.drawGuiContainerForegroundLayer(mouseX, mouseY); - GL11.glEnable(GL11.GL_LIGHTING); - } - - @Override - public void initGui() { - super.initGui(); - this.guiLeft = (this.width - this.xSize) / 2; - this.guiTop = (this.height - this.ySize) / 2; - - updateButtons(); - - Keyboard.enableRepeatEvents(true); - this.search = new GuiTextField(this.fontRendererObj, guiLeft + 61, guiTop + 213, 48, 12); - this.search.setTextColor(0xffffff); - this.search.setDisabledTextColour(0xffffff); - this.search.setEnableBackgroundDrawing(false); - this.search.setMaxStringLength(100); - this.search.setFocused(true); - } - - @Override - public boolean doesGuiPauseGame() { - return false; - } - - protected void updateButtons() { - - if(!buttons.isEmpty()) - buttons.clear(); - - for(int i = currentPage * 35; i < Math.min(currentPage * 35 + 35, stacks.size()); i++) { - buttons.add(new FolderButton(guiLeft + 25 + (27 * (i % 5)), guiTop + 26 + (27 * (int) Math.floor((i / 5D))) - currentPage * 27 * 7, stacks.get(i))); - } - - if(currentPage != 0) - buttons.add(new FolderButton(guiLeft + 25 - 18, guiTop + 26 + (27 * 3), 1, "Previous")); - if(currentPage != getPageCount()) - buttons.add(new FolderButton(guiLeft + 25 + (27 * 4) + 18, guiTop + 26 + (27 * 3), 2, "Next")); - } - - @Override - public void handleMouseInput() { - super.handleMouseInput(); - - if(Mouse.getEventButton() == -1) { - int scroll = Mouse.getEventDWheel(); - - if(scroll > 0) { - if(currentPage > 0) - currentPage--; - updateButtons(); - } else if(scroll < 0) { - if(currentPage < getPageCount()) - currentPage++; - updateButtons(); - } - } - } - - @Override - protected void mouseClicked(int i, int j, int k) { - - if(i >= guiLeft + 45 && i < guiLeft + 117 && j >= guiTop + 211 && j < guiTop + 223) { - this.search.setFocused(true); - } else { - this.search.setFocused(false); - } - - try { - for(FolderButton b : buttons) - if(b.isMouseOnButton(i, j)) - b.executeAction(); - } catch(Exception ex) { - updateButtons(); - } - } - - protected void drawGuiContainerForegroundLayer(int i, int j) { - - this.fontRendererObj.drawString(I18n.format((currentPage + 1) + "/" + (getPageCount() + 1)), guiLeft + this.xSize / 2 - this.fontRendererObj.getStringWidth(I18n.format((currentPage + 1) + "/" + (getPageCount() + 1))) / 2, guiTop + 10, isJournal ? 4210752 : 0xffffff); - - for(FolderButton b : buttons) - if(b.isMouseOnButton(i, j)) - b.drawString(i, j); - } - - protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - if(!isJournal) - Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - else - Minecraft.getMinecraft().getTextureManager().bindTexture(texture_journal); - - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - - if(search.isFocused()) - drawTexturedModalRect(guiLeft + 45, guiTop + 211, 176, 54, 72, 12); - - for(FolderButton b : buttons) - b.drawButton(b.isMouseOnButton(i, j)); - for(FolderButton b : buttons) - b.drawIcon(b.isMouseOnButton(i, j)); - - search.drawTextBox(); - } - - @Override - protected void keyTyped(char p_73869_1_, int p_73869_2_) { - - if (this.search.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - this.search(this.search.getText()); - return; - } - - if(p_73869_2_ == 1 || p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) { - this.mc.thePlayer.closeScreen(); - } - - } - - class FolderButton { - - int xPos; - int yPos; - // 0: regular, 1: prev, 2: next - int type; - String info; - ItemStack stack; - - public FolderButton(int x, int y, int t, String i) { - xPos = x; - yPos = y; - type = t; - info = i; - } - - public FolderButton(int x, int y, ItemStack stack) { - xPos = x; - yPos = y; - type = 0; - info = stack.getDisplayName(); - this.stack = stack.copy(); - } - - public void updateButton(int mouseX, int mouseY) { - } - - public boolean isMouseOnButton(int mouseX, int mouseY) { - return xPos <= mouseX && xPos + 18 > mouseX && yPos < mouseY && yPos + 18 >= mouseY; - } - - public void drawButton(boolean b) { - - if(!isJournal) - Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - else - Minecraft.getMinecraft().getTextureManager().bindTexture(texture_journal); - - drawTexturedModalRect(xPos, yPos, b ? 176 + 18 : 176, type == 1 ? 18 : (type == 2 ? 36 : 0), 18, 18); - } - - public void drawIcon(boolean b) { - try { - RenderHelper.enableGUIStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) 240 / 1.0F, (float) 240 / 1.0F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - if(stack != null) { - if(stack.getItem() == ModItems.crucible_template) - itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), CrucibleRecipes.indexMapping.get(stack.getItemDamage()).icon, xPos + 1, yPos + 1); - else - itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), stack, xPos + 1, yPos + 1); - } - GL11.glEnable(GL11.GL_LIGHTING); - } catch(Exception x) { - } - } - - public void drawString(int x, int y) { - if(info == null || info.isEmpty()) - return; - - if(stack != null) { - GUIScreenTemplateFolder.this.renderToolTip(stack, x, y); - } else { - func_146283_a(Arrays.asList(new String[] { info }), x, y); - } - } - - public void executeAction() { - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - if(type == 0) { - PacketDispatcher.wrapper.sendToServer(new ItemFolderPacket(stack.copy())); - } else if(type == 1) { - if(currentPage > 0) - currentPage--; - updateButtons(); - } else if(type == 2) { - if(currentPage < getPageCount()) - currentPage++; - updateButtons(); - } - } - } - - @Override - public void onGuiClosed() { - Keyboard.enableRepeatEvents(false); - } -} diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipe.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipe.java new file mode 100644 index 000000000..65d4fa4b4 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipe.java @@ -0,0 +1,67 @@ +package com.hbm.inventory.recipes; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.input.Keyboard; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.util.i18n.I18nUtil; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +public class CrucibleRecipe extends GenericRecipe { + + public MaterialStack[] input; + public MaterialStack[] output; + public int frequency = 1; + + public CrucibleRecipe(String name) { + super(name); + } + + public CrucibleRecipe setup(int frequency, ItemStack icon) { + this.frequency = frequency; + this.setIcon(icon); + return this; + } + + public CrucibleRecipe inputs(MaterialStack... input) { this.input = input; return this; } + public CrucibleRecipe outputs(MaterialStack... output) { this.output = output; return this; } + + public int getInputAmount() { + int content = 0; + for(MaterialStack stack : input) content += stack.amount; + return content; + } + + @Override + public List print() { + List list = new ArrayList(); + list.add(EnumChatFormatting.YELLOW + this.getLocalizedName()); + + input(list); + output(list); + + return list; + } + + @Override + protected void input(List list) { + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.recipe.input") + ":"); + for(MaterialStack stack : input) { + list.add(I18nUtil.resolveKey(stack.material.getUnlocalizedName()) + ": " + Mats.formatAmount(stack.amount, Keyboard.isKeyDown(Keyboard.KEY_LSHIFT))); + } + } + + @Override + protected void output(List list) { + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.recipe.output") + ":"); + for(MaterialStack stack : output) { + list.add(I18nUtil.resolveKey(stack.material.getUnlocalizedName()) + ": " + Mats.formatAmount(stack.amount, Keyboard.isKeyDown(Keyboard.KEY_LSHIFT))); + } + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java index fe489691e..b028f9727 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -21,7 +21,7 @@ import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.material.NTMMaterial; import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; -import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMold; import com.hbm.items.machine.ItemMold.Mold; @@ -32,10 +32,22 @@ import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class CrucibleRecipes extends SerializableRecipe { +public class CrucibleRecipes extends GenericRecipes { - public static HashMap indexMapping = new HashMap(); - public static List recipes = new ArrayList(); + public static final CrucibleRecipes INSTANCE = new CrucibleRecipes(); + + @Override public int inputItemLimit() { return 0; } + @Override public int inputFluidLimit() { return 0; } + @Override public int outputItemLimit() { return 0; } + @Override public int outputFluidLimit() { return 0; } + + @Override public CrucibleRecipe instantiateRecipe(String name) { return new CrucibleRecipe(name); } + + @Override + public void deleteRecipes() { + super.deleteRecipes(); + this.moldRecipes.clear(); + } /* * IMPORTANT: crucibles do not have stack size checks for the recipe's result, meaning that they can overflow if the resulting stacks are @@ -48,138 +60,82 @@ public class CrucibleRecipes extends SerializableRecipe { int n = MaterialShapes.NUGGET.q(1); int i = MaterialShapes.INGOT.q(1); - recipes.add(new CrucibleRecipe(0, "crucible.steel", 2, new ItemStack(ModItems.ingot_steel)) + this.register(new CrucibleRecipe("crucible.steel").setup(2, new ItemStack(ModItems.ingot_steel)) .inputs(new MaterialStack(Mats.MAT_IRON, n * 2), new MaterialStack(Mats.MAT_CARBON, n)) .outputs(new MaterialStack(Mats.MAT_STEEL, n * 2))); if(Compat.isModLoaded(Compat.MOD_GT6)) { - recipes.add(new CrucibleRecipe(9, "crucible.steelWrought", 2, new ItemStack(ModItems.ingot_steel)) + this.register(new CrucibleRecipe("crucible.steelWrought").setup(2, new ItemStack(ModItems.ingot_steel)) .inputs(new MaterialStack(Mats.MAT_WROUGHTIRON, n * 2), new MaterialStack(Mats.MAT_CARBON, n)) .outputs(new MaterialStack(Mats.MAT_STEEL, n * 2))); - recipes.add(new CrucibleRecipe(10, "crucible.steelPig", 2, new ItemStack(ModItems.ingot_steel)) + this.register(new CrucibleRecipe("crucible.steelPig").setup(2, new ItemStack(ModItems.ingot_steel)) .inputs(new MaterialStack(Mats.MAT_PIGIRON, n * 2), new MaterialStack(Mats.MAT_CARBON, n)) .outputs(new MaterialStack(Mats.MAT_STEEL, n * 2))); - recipes.add(new CrucibleRecipe(11, "crucible.steelMeteoric", 2, new ItemStack(ModItems.ingot_steel)) + this.register(new CrucibleRecipe("crucible.steelMeteoric").setup(2, new ItemStack(ModItems.ingot_steel)) .inputs(new MaterialStack(Mats.MAT_METEORICIRON, n * 2), new MaterialStack(Mats.MAT_CARBON, n)) .outputs(new MaterialStack(Mats.MAT_STEEL, n * 2))); } - recipes.add(new CrucibleRecipe(7, "crucible.hematite", 6, DictFrame.fromOne(ModBlocks.stone_resource, EnumStoneType.HEMATITE)) + this.register(new CrucibleRecipe("crucible.hematite").setup(6, DictFrame.fromOne(ModBlocks.stone_resource, EnumStoneType.HEMATITE)) .inputs(new MaterialStack(Mats.MAT_HEMATITE, i * 2), new MaterialStack(Mats.MAT_FLUX, n * 2)) .outputs(new MaterialStack(Mats.MAT_IRON, i), new MaterialStack(Mats.MAT_SLAG, n * 3))); - recipes.add(new CrucibleRecipe(8, "crucible.malachite", 6, DictFrame.fromOne(ModBlocks.stone_resource, EnumStoneType.MALACHITE)) + this.register(new CrucibleRecipe("crucible.malachite").setup(6, DictFrame.fromOne(ModBlocks.stone_resource, EnumStoneType.MALACHITE)) .inputs(new MaterialStack(Mats.MAT_MALACHITE, i * 2), new MaterialStack(Mats.MAT_FLUX, n * 2)) .outputs(new MaterialStack(Mats.MAT_COPPER, i), new MaterialStack(Mats.MAT_SLAG, n * 3))); - recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 2, new ItemStack(ModItems.ingot_red_copper)) + this.register(new CrucibleRecipe("crucible.redcopper").setup(2, new ItemStack(ModItems.ingot_red_copper)) .inputs(new MaterialStack(Mats.MAT_COPPER, n), new MaterialStack(Mats.MAT_REDSTONE, n)) .outputs(new MaterialStack(Mats.MAT_MINGRADE, n * 2))); - recipes.add(new CrucibleRecipe(2, "crucible.aa", 2, new ItemStack(ModItems.ingot_advanced_alloy)) + this.register(new CrucibleRecipe("crucible.aa").setup(2, new ItemStack(ModItems.ingot_advanced_alloy)) .inputs(new MaterialStack(Mats.MAT_STEEL, n), new MaterialStack(Mats.MAT_MINGRADE, n)) .outputs(new MaterialStack(Mats.MAT_ALLOY, n * 2))); - recipes.add(new CrucibleRecipe(3, "crucible.hss", 9, new ItemStack(ModItems.ingot_dura_steel)) + this.register(new CrucibleRecipe("crucible.hss").setup(9, new ItemStack(ModItems.ingot_dura_steel)) .inputs(new MaterialStack(Mats.MAT_STEEL, n * 5), new MaterialStack(Mats.MAT_TUNGSTEN, n * 3), new MaterialStack(Mats.MAT_COBALT, n * 1)) .outputs(new MaterialStack(Mats.MAT_DURA, n * 9))); - recipes.add(new CrucibleRecipe(4, "crucible.ferro", 3, new ItemStack(ModItems.ingot_ferrouranium)) + this.register(new CrucibleRecipe("crucible.ferro").setup(3, new ItemStack(ModItems.ingot_ferrouranium)) .inputs(new MaterialStack(Mats.MAT_STEEL, n * 2), new MaterialStack(Mats.MAT_U238, n)) .outputs(new MaterialStack(Mats.MAT_FERRO, n * 3))); - recipes.add(new CrucibleRecipe(5, "crucible.tcalloy", 9, new ItemStack(ModItems.ingot_tcalloy)) + this.register(new CrucibleRecipe("crucible.tcalloy").setup(9, new ItemStack(ModItems.ingot_tcalloy)) .inputs(new MaterialStack(Mats.MAT_STEEL, n * 8), new MaterialStack(Mats.MAT_TECHNETIUM, n)) .outputs(new MaterialStack(Mats.MAT_TCALLOY, i))); - recipes.add(new CrucibleRecipe(12, "crucible.cdalloy", 9, new ItemStack(ModItems.ingot_cdalloy)) + this.register(new CrucibleRecipe("crucible.cdalloy").setup(9, new ItemStack(ModItems.ingot_cdalloy)) .inputs(new MaterialStack(Mats.MAT_STEEL, n * 8), new MaterialStack(Mats.MAT_CADMIUM, n)) .outputs(new MaterialStack(Mats.MAT_CDALLOY, i))); - recipes.add(new CrucibleRecipe(14, "crucible.bbronze", 9, new ItemStack(ModItems.ingot_bismuth_bronze)) + this.register(new CrucibleRecipe("crucible.bbronze").setup(9, new ItemStack(ModItems.ingot_bismuth_bronze)) .inputs(new MaterialStack(Mats.MAT_COPPER, n * 8), new MaterialStack(Mats.MAT_BISMUTH, n), new MaterialStack(Mats.MAT_FLUX, n * 3)) .outputs(new MaterialStack(Mats.MAT_BBRONZE, i), new MaterialStack(Mats.MAT_SLAG, n * 3))); - recipes.add(new CrucibleRecipe(15, "crucible.abronze", 9, new ItemStack(ModItems.ingot_arsenic_bronze)) + this.register(new CrucibleRecipe("crucible.abronze").setup(9, new ItemStack(ModItems.ingot_arsenic_bronze)) .inputs(new MaterialStack(Mats.MAT_COPPER, n * 8), new MaterialStack(Mats.MAT_ARSENIC, n), new MaterialStack(Mats.MAT_FLUX, n * 3)) .outputs(new MaterialStack(Mats.MAT_ABRONZE, i), new MaterialStack(Mats.MAT_SLAG, n * 3))); - recipes.add(new CrucibleRecipe(13, "crucible.cmb", 3, new ItemStack(ModItems.ingot_combine_steel)) + this.register(new CrucibleRecipe("crucible.cmb").setup(3, new ItemStack(ModItems.ingot_combine_steel)) .inputs(new MaterialStack(Mats.MAT_MAGTUNG, n * 6), new MaterialStack(Mats.MAT_MUD, n * 3)) .outputs(new MaterialStack(Mats.MAT_CMB, i))); - recipes.add(new CrucibleRecipe(16, "crucible.magtung", 3, new ItemStack(ModItems.ingot_magnetized_tungsten)) + this.register(new CrucibleRecipe("crucible.magtung").setup(3, new ItemStack(ModItems.ingot_magnetized_tungsten)) .inputs(new MaterialStack(Mats.MAT_TUNGSTEN, i), new MaterialStack(Mats.MAT_SCHRABIDIUM, n * 1)) .outputs(new MaterialStack(Mats.MAT_MAGTUNG, i))); - recipes.add(new CrucibleRecipe(17, "crucible.bscco", 3, new ItemStack(ModItems.ingot_bscco)) + this.register(new CrucibleRecipe("crucible.bscco").setup(3, new ItemStack(ModItems.ingot_bscco)) .inputs(new MaterialStack(Mats.MAT_BISMUTH, n * 2), new MaterialStack(Mats.MAT_STRONTIUM, n * 2), new MaterialStack(Mats.MAT_CALCIUM, n * 2), new MaterialStack(Mats.MAT_COPPER, n * 3)) .outputs(new MaterialStack(Mats.MAT_BSCCO, i))); registerMoldsForNEI(); } - public static class CrucibleRecipe { - public MaterialStack[] input; - public MaterialStack[] output; - private int id; - private String name; - public int frequency = 1; - public ItemStack icon; - - public CrucibleRecipe(int id, String name, int frequency, ItemStack icon) { - this.id = id; - this.name = name; - this.frequency = frequency; - this.icon = icon; - - 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 String getComment() { return "ID must be unique, but not sequential. Order in which the recipes are defined determines the order in which they are displayed in-game. " @@ -190,10 +146,10 @@ public class CrucibleRecipes extends SerializableRecipe { @Override public void readRecipe(JsonElement recipe) { JsonObject obj = (JsonObject) recipe; - int id = obj.get("id").getAsInt(); String name = obj.get("name").getAsString(); int freq = obj.get("frequency").getAsInt(); ItemStack icon = this.readItemStack(obj.get("icon").getAsJsonArray()); + MaterialStack[] input = new MaterialStack[obj.get("input").getAsJsonArray().size()]; for(int i = 0; i < input.length; i++) { JsonArray entry = obj.get("input").getAsJsonArray().get(i).getAsJsonArray(); @@ -201,6 +157,7 @@ public class CrucibleRecipes extends SerializableRecipe { int amount = entry.get(1).getAsInt(); input[i] = new MaterialStack(Mats.matByName.get(matname), amount); } + MaterialStack[] output = new MaterialStack[obj.get("output").getAsJsonArray().size()]; for(int i = 0; i < output.length; i++) { JsonArray entry = obj.get("output").getAsJsonArray().get(i).getAsJsonArray(); @@ -208,17 +165,18 @@ public class CrucibleRecipes extends SerializableRecipe { int amount = entry.get(1).getAsInt(); output[i] = new MaterialStack(Mats.matByName.get(matname), amount); } - recipes.add(new CrucibleRecipe(id, name, freq, icon).inputs(input).outputs(output)); + + this.register(new CrucibleRecipe(name).setup(freq, icon).inputs(input).outputs(output)); } @Override public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { CrucibleRecipe rec = (CrucibleRecipe) recipe; - writer.name("id").value(rec.id); - writer.name("name").value(rec.name); + writer.name("name").value(rec.getInternalName()); writer.name("frequency").value(rec.frequency); writer.name("icon"); - this.writeItemStack(rec.icon, writer); + this.writeItemStack(rec.getIcon(), writer); + writer.name("input"); writer.beginArray(); for(MaterialStack mat : rec.input) { @@ -229,6 +187,7 @@ public class CrucibleRecipes extends SerializableRecipe { writer.setIndent(" "); } writer.endArray(); + writer.name("output"); writer.beginArray(); for(MaterialStack mat : rec.output) { @@ -240,13 +199,6 @@ public class CrucibleRecipes extends SerializableRecipe { } writer.endArray(); } - - @Override - public void deleteRecipes() { - this.indexMapping.clear(); - this.recipes.clear(); - this.moldRecipes.clear(); - } /** Returns a map containing all recipes where an item becomes a liquid material in the crucible. */ public static HashMap> getSmeltingRecipes() { 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 c2e44f065..caae4561a 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -56,7 +56,6 @@ public abstract class SerializableRecipe { recipeHandlers.add(new ShredderRecipes()); recipeHandlers.add(new SolderingRecipes()); recipeHandlers.add(new CombinationRecipes()); - recipeHandlers.add(new CrucibleRecipes()); recipeHandlers.add(new CentrifugeRecipes()); recipeHandlers.add(new CrystallizerRecipes()); recipeHandlers.add(new RefineryRecipes()); @@ -89,6 +88,7 @@ public abstract class SerializableRecipe { recipeHandlers.add(new AnnihilatorRecipes()); //GENERIC + recipeHandlers.add(CrucibleRecipes.INSTANCE); recipeHandlers.add(AssemblyMachineRecipes.INSTANCE); recipeHandlers.add(ChemicalPlantRecipes.INSTANCE); recipeHandlers.add(PUREXRecipes.INSTANCE); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 008f53064..24938e644 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1152,8 +1152,6 @@ public class ModItems { public static Item blueprints; public static Item blueprint_folder; - public static Item template_folder; - public static Item crucible_template; public static Item fluid_identifier_multi; public static Item fluid_icon; public static Item siren_track; @@ -2164,6 +2162,7 @@ public class ModItems { public static Item orange7; public static Item orange8; + public static Item template_folder; public static Item nothing; public static Item broken_item; @@ -4017,8 +4016,6 @@ public class ModItems { blueprints = new ItemBlueprints().setUnlocalizedName("blueprints").setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":blueprints"); blueprint_folder = new ItemBlueprintFolder().setUnlocalizedName("blueprint_folder").setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":blueprint_folder"); - template_folder = new ItemTemplateFolder().setUnlocalizedName("template_folder").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":template_folder"); - crucible_template = new ItemCrucibleTemplate().setUnlocalizedName("crucible_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":crucible_template"); 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"); fluid_tank_empty = new Item().setUnlocalizedName("fluid_tank_empty").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_tank"); @@ -4567,6 +4564,7 @@ public class ModItems { orange7 = new Item().setUnlocalizedName("orange7").setTextureName(RefStrings.MODID + ":orange7"); orange8 = new Item().setUnlocalizedName("orange8").setTextureName(RefStrings.MODID + ":orange8"); + template_folder = new Item().setUnlocalizedName("template_folder").setTextureName(RefStrings.MODID + ":template_folder"); nothing = new Item().setUnlocalizedName("nothing").setTextureName(RefStrings.MODID + ":nothing"); broken_item = new BrokenItem().setUnlocalizedName("broken_item").setTextureName(RefStrings.MODID + ":broken_item"); @@ -5360,7 +5358,6 @@ public class ModItems { //Folders GameRegistry.registerItem(blueprints, blueprints.getUnlocalizedName()); GameRegistry.registerItem(blueprint_folder, blueprint_folder.getUnlocalizedName()); - GameRegistry.registerItem(template_folder, template_folder.getUnlocalizedName()); GameRegistry.registerItem(bobmazon, bobmazon.getUnlocalizedName()); GameRegistry.registerItem(bobmazon_hidden, bobmazon_hidden.getUnlocalizedName()); @@ -5444,7 +5441,6 @@ public class ModItems { GameRegistry.registerItem(fluid_identifier_multi, fluid_identifier_multi.getUnlocalizedName()); GameRegistry.registerItem(fluid_icon, fluid_icon.getUnlocalizedName()); GameRegistry.registerItem(fluid_duct, fluid_duct.getUnlocalizedName()); - GameRegistry.registerItem(crucible_template, crucible_template.getUnlocalizedName()); //Machine Items GameRegistry.registerItem(fuse, fuse.getUnlocalizedName()); @@ -6741,6 +6737,7 @@ public class ModItems { GameRegistry.registerItem(memory, memory.getUnlocalizedName()); GameRegistry.registerItem(conveyor_wand, conveyor_wand.getUnlocalizedName()); + GameRegistry.registerItem(template_folder, template_folder.getUnlocalizedName()); GameRegistry.registerItem(nothing, nothing.getUnlocalizedName()); GameRegistry.registerItem(broken_item, broken_item.getUnlocalizedName()); } diff --git a/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java deleted file mode 100644 index 878cac22c..000000000 --- a/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.hbm.items.machine; - -import java.util.List; - -import org.lwjgl.input.Keyboard; - -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 com.hbm.util.i18n.I18nUtil; - -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; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; - -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())); - } - } - - public String getItemStackDisplayName(ItemStack stack) { - - CrucibleRecipe recipe = CrucibleRecipes.indexMapping.get(stack.getItemDamage()); - - if(recipe == null) { - return super.getItemStackDisplayName(stack); - } - - String s = ("" + StatCollector.translateToLocal(this.getUnlocalizedName() + ".name")).trim(); - String s1 = ("" + StatCollector.translateToLocal(recipe.getName())).trim(); - - if(s1 != null) { - s = s + " " + s1; - } - - return s; - } - - @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(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_out_p")); - for(MaterialStack out : recipe.output) { - list.add(I18nUtil.resolveKey(out.material.getUnlocalizedName()) + ": " + Mats.formatAmount(out.amount, Keyboard.isKeyDown(Keyboard.KEY_LSHIFT))); - } - - list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_in_p")); - - for(MaterialStack in : recipe.input) { - list.add(I18nUtil.resolveKey(in.material.getUnlocalizedName()) + ": " + Mats.formatAmount(in.amount, Keyboard.isKeyDown(Keyboard.KEY_LSHIFT))); - } - } -} diff --git a/src/main/java/com/hbm/items/machine/ItemTemplateFolder.java b/src/main/java/com/hbm/items/machine/ItemTemplateFolder.java deleted file mode 100644 index 36b771381..000000000 --- a/src/main/java/com/hbm/items/machine/ItemTemplateFolder.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.hbm.items.machine; - -import java.util.List; - -import com.hbm.inventory.gui.GUIScreenTemplateFolder; -import com.hbm.items.ModItems; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.IGUIProvider; -import com.hbm.util.BobMathUtil; -import com.hbm.util.i18n.I18nUtil; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; - -public class ItemTemplateFolder extends Item implements IGUIProvider { - - @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - - if(world.isRemote) - player.openGui(MainRegistry.instance, 0, world, 0, 0, 0); - - return stack; - } - - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - - String[] lang = I18nUtil.resolveKeyArray(ModItems.template_folder.getUnlocalizedName() + ".desc"); - EnumChatFormatting color = BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.YELLOW; - for(String line : lang) { - list.add(color + line); - } - } - - @Override - public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return null; - } - - @Override - @SideOnly(Side.CLIENT) - public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIScreenTemplateFolder(player); - } -} diff --git a/src/main/java/com/hbm/items/special/ItemStarterKit.java b/src/main/java/com/hbm/items/special/ItemStarterKit.java index c193b8c7b..38eb5b124 100644 --- a/src/main/java/com/hbm/items/special/ItemStarterKit.java +++ b/src/main/java/com/hbm/items/special/ItemStarterKit.java @@ -68,7 +68,6 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModItems.ingot_uranium, 32)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.powder_yellowcake, 32)); - player.inventory.addItemStackToInventory(new ItemStack(ModItems.template_folder, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_press, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_difurnace_off, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_gascent, 1)); @@ -154,7 +153,6 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.barrel_steel, 16)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.plate_iron, 64)); player.inventory.addItemStackToInventory(new ItemStack(Items.dye, 64)); - player.inventory.addItemStackToInventory(new ItemStack(ModItems.template_folder, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.radaway_flush, 8)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.iv_blood, 8)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pill_iodine, 8)); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index e2908c22b..23fe68772 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -545,8 +545,6 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.missile_shuttle, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ROBIN)); MinecraftForgeClient.registerItemRenderer(ModItems.battery_pack, new ItemRenderBatteryPack()); - //templates - MinecraftForgeClient.registerItemRenderer(ModItems.crucible_template, new ItemRenderTemplate()); //hot stuff MinecraftForgeClient.registerItemRenderer(ModItems.ingot_steel_dusted, new ItemRendererHot()); MinecraftForgeClient.registerItemRenderer(ModItems.ingot_chainsteel, new ItemRendererHot()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 18fa1f0de..68719fe8a 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -654,7 +654,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.door_office, 1), new Object[] { "II", "SS", "II", 'I', KEY_PLANKS, 'S', IRON.plate() }); addRecipeAuto(new ItemStack(ModItems.door_bunker, 1), new Object[] { "II", "SS", "II", 'I', STEEL.plate(), 'S', PB.plate() }); - addShapelessAuto(new ItemStack(Items.paper, 1), new Object[] { new ItemStack(ModItems.crucible_template, 1, OreDictionary.WILDCARD_VALUE) }); addShapelessAuto(new ItemStack(Items.slime_ball, 16), new Object[] { new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), Fluids.SULFURIC_ACID.getDict(1000) }); for(int i = 1; i < Fluids.getAll().length; ++i) { diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 1a8c39eef..6e23e231a 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1516,6 +1516,7 @@ public class MainRegistry { ignoreMappings.add("hbm:item.redcoil_capacitor"); ignoreMappings.add("hbm:item.euphemium_capacitor"); ignoreMappings.add("hbm:item.toolbox_legacy"); + ignoreMappings.add("hbm:item.crucible_template"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index f528f67eb..cf7fa4a87 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -989,7 +989,6 @@ public class ModEventHandlerClient { MainRegistry.logger.info("Taking a screenshot of ALL items, if you did this by mistake: fucking lmao get rekt nerd"); List ignoredItems = Arrays.asList( - ModItems.crucible_template, ModItems.achievement_icon, Items.spawn_egg, Item.getItemFromBlock(Blocks.mob_spawner) diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 207f95ca2..65ef19982 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -15,8 +15,6 @@ public class PacketDispatcher { public static void registerPackets() { int i = 0; - //Signals server to consume items and create template - wrapper.registerMessage(ItemFolderPacket.Handler.class, ItemFolderPacket.class, i++, Side.SERVER); //Siren packet for looped sounds wrapper.registerMessage(TESirenPacket.Handler.class, TESirenPacket.class, i++, Side.CLIENT); //Signals server to change ItemStacks diff --git a/src/main/java/com/hbm/packet/toserver/ItemFolderPacket.java b/src/main/java/com/hbm/packet/toserver/ItemFolderPacket.java deleted file mode 100644 index e0acd8410..000000000 --- a/src/main/java/com/hbm/packet/toserver/ItemFolderPacket.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.hbm.packet.toserver; - -import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemCassette; -import com.hbm.items.machine.ItemCrucibleTemplate; -import com.hbm.util.InventoryUtil; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -public class ItemFolderPacket implements IMessage { - - int item; - int meta; - - public ItemFolderPacket() - { - - } - - public ItemFolderPacket(ItemStack stack) - { - this.item = Item.getIdFromItem(stack.getItem()); - this.meta = stack.getItemDamage(); - } - - @Override - public void fromBytes(ByteBuf buf) { - item = buf.readInt(); - meta = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(item); - buf.writeInt(meta); - } - - public static class Handler implements IMessageHandler { - - /* - * While it is still horrible, it is arguably less horrible than it was before. - */ - @Override - public IMessage onMessage(ItemFolderPacket m, MessageContext ctx) { - - //if(!Minecraft.getMinecraft().theWorld.isRemote) - EntityPlayer p = ctx.getServerHandler().playerEntity; - ItemStack stack = new ItemStack(Item.getItemById(m.item), 1, m.meta); - - if(p.capabilities.isCreativeMode) { - p.inventory.addItemStackToInventory(stack); - return null; - } - - if(stack.getItem() instanceof ItemCrucibleTemplate) { - tryMakeItem(p, stack, Items.paper, "dye"); - return null; - } - if(stack.getItem() instanceof ItemCassette) { - tryMakeItem(p, stack, ModItems.plate_polymer, "plateSteel"); - return null; - } - if(stack.getItem() == ModItems.stamp_stone_plate || - stack.getItem() == ModItems.stamp_stone_wire || - stack.getItem() == ModItems.stamp_stone_circuit) { - tryConvert(p, ModItems.stamp_stone_flat, stack.getItem()); - return null; - } - if(stack.getItem() == ModItems.stamp_iron_plate || - stack.getItem() == ModItems.stamp_iron_wire || - stack.getItem() == ModItems.stamp_iron_circuit) { - tryConvert(p, ModItems.stamp_iron_flat, stack.getItem()); - return null; - } - if(stack.getItem() == ModItems.stamp_steel_plate || - stack.getItem() == ModItems.stamp_steel_wire || - stack.getItem() == ModItems.stamp_steel_circuit) { - tryConvert(p, ModItems.stamp_steel_flat, stack.getItem()); - return null; - } - if(stack.getItem() == ModItems.stamp_titanium_plate || - stack.getItem() == ModItems.stamp_titanium_wire || - stack.getItem() == ModItems.stamp_titanium_circuit) { - tryConvert(p, ModItems.stamp_titanium_flat, stack.getItem()); - return null; - } - if(stack.getItem() == ModItems.stamp_obsidian_plate || - stack.getItem() == ModItems.stamp_obsidian_wire || - stack.getItem() == ModItems.stamp_obsidian_circuit) { - tryConvert(p, ModItems.stamp_obsidian_flat, stack.getItem()); - return null; - } - if(stack.getItem() == ModItems.stamp_desh_plate || - stack.getItem() == ModItems.stamp_desh_wire || - stack.getItem() == ModItems.stamp_desh_circuit) { - tryConvert(p, ModItems.stamp_desh_flat, stack.getItem()); - return null; - } - //} - - return null; - } - - private void tryMakeItem(EntityPlayer player, ItemStack output, Object... ingredients) { - - //check - for(Object o : ingredients) { - - if(o instanceof Item) { - if(!player.inventory.hasItem((Item)o)) - return; - } - - if(o instanceof String) { - if(!InventoryUtil.hasOreDictMatches(player, (String)o, 1)) - return; - } - } - - //consume - for(Object o : ingredients) { - - if(o instanceof Item) { - player.inventory.consumeInventoryItem((Item)o); - } - - if(o instanceof String) { - InventoryUtil.consumeOreDictMatches(player, (String)o, 1); - } - } - - if(!player.inventory.addItemStackToInventory(output)) - player.dropPlayerItemWithRandomChoice(output, true); - } - - private void tryConvert(EntityPlayer player, Item target, Item result) { - - for(int i = 0; i < player.inventory.mainInventory.length; i++) { - - ItemStack stack = player.inventory.mainInventory[i]; - - if(stack != null && stack.getItem() == target) { - player.inventory.mainInventory[i] = new ItemStack(result, stack.stackSize, stack.getItemDamage()); - return; - } - } - } - } -} diff --git a/src/main/java/com/hbm/render/item/ItemRenderTemplate.java b/src/main/java/com/hbm/render/item/ItemRenderTemplate.java deleted file mode 100644 index 7b1717b80..000000000 --- a/src/main/java/com/hbm/render/item/ItemRenderTemplate.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.hbm.render.item; - -import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.GL11; - -import com.hbm.inventory.recipes.CrucibleRecipes; -import com.hbm.items.ModItems; -import com.hbm.render.util.RenderItemStack; - -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.item.ItemStack; -import net.minecraftforge.client.IItemRenderer; - -public class ItemRenderTemplate implements IItemRenderer { - - private ItemStack currentItem; - - public boolean handleRenderType(ItemStack stack, IItemRenderer.ItemRenderType type) { - - if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && (type == IItemRenderer.ItemRenderType.INVENTORY)) { - - if(stack.getItem() == ModItems.crucible_template) - this.currentItem = CrucibleRecipes.indexMapping.get(stack.getItemDamage()).icon; - - if(this.currentItem != null) { - return true; - } - - - } - return false; - } - - public boolean shouldUseRenderHelper(IItemRenderer.ItemRenderType type, ItemStack stack, IItemRenderer.ItemRendererHelper renderHelper) { - return false; - } - - public void renderItem(IItemRenderer.ItemRenderType type, ItemStack stack, Object... args) { - GL11.glPushMatrix(); - RenderHelper.enableGUIStandardItemLighting(); - - if(currentItem != null) - RenderItemStack.renderItemStack(0, 0, 1.0F, currentItem); - else - RenderItemStack.renderItemStack(0, 0, 1.0F, stack); - - GL11.glPopMatrix(); - } -} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 563b9c255..61ff69ff0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -11,15 +11,15 @@ import com.hbm.config.ServerConfig; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.handler.threading.PacketThreading; +import com.hbm.interfaces.IControlReceiver; 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.CrucibleRecipe; import com.hbm.inventory.recipes.CrucibleRecipes; -import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; -import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IConfigurableMachine; @@ -31,6 +31,7 @@ import com.hbm.util.CrucibleUtil; import api.hbm.block.ICrucibleAcceptor; import api.hbm.tile.IHeatSource; +import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -48,10 +49,12 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCrucible extends TileEntityMachineBase implements IGUIProvider, ICrucibleAcceptor, IConfigurableMachine, IMetalCopiable { +public class TileEntityCrucible extends TileEntityMachineBase implements IGUIProvider, ICrucibleAcceptor, IConfigurableMachine, IMetalCopiable, IControlReceiver { public int heat; public int progress; + + public String recipe = "null"; public List recipeStack = new ArrayList(); public List wasteStack = new ArrayList(); @@ -253,6 +256,8 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro super.serialize(buf); buf.writeInt(progress); buf.writeInt(heat); + + ByteBufUtils.writeUTF8String(buf, recipe); buf.writeShort(recipeStack.size()); for(MaterialStack sta : recipeStack) { @@ -278,6 +283,8 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro super.deserialize(buf); progress = buf.readInt(); heat = buf.readInt(); + + recipe = ByteBufUtils.readUTF8String(buf); recipeStack.clear(); wasteStack.clear(); @@ -302,6 +309,8 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); + + this.recipe = nbt.getString("recipe"); int[] rec = nbt.getIntArray("rec"); for(int i = 0; i < rec.length / 2; i++) { @@ -320,6 +329,8 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); + + nbt.setString("recipe", this.recipe); int[] rec = new int[recipeStack.size() * 2]; int[] was = new int[wasteStack.size() * 2]; @@ -439,11 +450,6 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - - if(i == 0) { - return stack.getItem() == ModItems.crucible_template; - } - return isItemSmeltable(stack); } @@ -515,12 +521,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro } public CrucibleRecipe getLoadedRecipe() { - - if(slots[0] != null && slots[0].getItem() == ModItems.crucible_template) { - return CrucibleRecipes.indexMapping.get(slots[0].getItemDamage()); - } - - return null; + return CrucibleRecipes.INSTANCE.recipeNameMap.get(recipe); } /* "Arrays and Lists don't have a common ancestor" my fucking ass */ @@ -654,4 +655,20 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro return BobMathUtil.intCollectionToArray(types); } + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("index") && data.hasKey("selection")) { + int index = data.getInteger("index"); + String selection = data.getString("selection"); + if(index == 0) { + this.recipe = selection; + this.markChanged(); + } + } + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index e448808bb..2e6f1bc82 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -8,6 +8,7 @@ import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; import com.hbm.handler.CompatHandler; import com.hbm.interfaces.IControlReceiver; +import com.hbm.interfaces.NotableComments; import com.hbm.inventory.container.ContainerPWR; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -47,6 +48,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@NotableComments @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityPWRController extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, SimpleComponent, IFluidStandardTransceiverMK2, CompatHandler.OCComponent, IRORValueProvider, IRORInteractive { @@ -638,23 +640,25 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG @Override public FluidTank[] getAllTanks() { return tanks; } @Override public FluidTank[] getSendingTanks() { return new FluidTank[] { tanks[1] }; } @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0] }; } + + public static final String[] ROR = new String[] { // not to be confused with RUR + PREFIX_VALUE + "rods", + PREFIX_VALUE + "coreheat", + PREFIX_VALUE + "hullheat", + PREFIX_VALUE + "flux", + PREFIX_VALUE + "depletion", + PREFIX_FUNCTION + "setrods" + NAME_SEPARATOR + "percent", + PREFIX_FUNCTION + "jettison", + }; @Override public String[] getFunctionInfo() { - return new String[] { - PREFIX_VALUE + "rods", - PREFIX_VALUE + "coreheat", - PREFIX_VALUE + "hullheat", - PREFIX_VALUE + "flux", - PREFIX_VALUE + "depletion", - PREFIX_FUNCTION + "setrods" + NAME_SEPARATOR + "percent", - PREFIX_FUNCTION + "jettison", - }; + return ROR; } @Override public String provideRORValue(String name) { - if((PREFIX_VALUE + "rods").equals(name)) return "" + (int) this.rodLevel; + if((PREFIX_VALUE + "rods").equals(name)) return "" + (int) (100 - this.rodLevel); // why the fuck did i invert this again? if((PREFIX_VALUE + "coreheat").equals(name)) return "" + this.coreHeat; if((PREFIX_VALUE + "hullheat").equals(name)) return "" + this.hullHeat; if((PREFIX_VALUE + "flux").equals(name)) return "" + (int) this.flux; diff --git a/src/main/java/com/hbm/util/CompatRecipeRegistry.java b/src/main/java/com/hbm/util/CompatRecipeRegistry.java index 6e0c3a29f..193675049 100644 --- a/src/main/java/com/hbm/util/CompatRecipeRegistry.java +++ b/src/main/java/com/hbm/util/CompatRecipeRegistry.java @@ -12,7 +12,6 @@ import com.hbm.inventory.recipes.AmmoPressRecipes.AmmoPressRecipe; import com.hbm.inventory.recipes.ArcFurnaceRecipes.ArcFurnaceRecipe; import com.hbm.inventory.recipes.ArcWelderRecipes.ArcWelderRecipe; import com.hbm.inventory.recipes.BreederRecipes.BreederRecipe; -import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; import com.hbm.inventory.recipes.CrystallizerRecipes.CrystallizerRecipe; import com.hbm.inventory.recipes.ElectrolyserFluidRecipes.ElectrolysisRecipe; import com.hbm.inventory.recipes.ElectrolyserMetalRecipes.ElectrolysisMetalRecipe; @@ -103,10 +102,10 @@ public class CompatRecipeRegistry { CombinationRecipes.recipes.put(o, new Pair(output, fluid)); } - /** Crucible recipes need unique IDs, game will crash when an ID collision is detected! */ + /** Numeric IDs are now unused, names need to be unique! */ public static void registerCrucible(int index, String name, int frequency, ItemStack icon, MaterialStack[] input, MaterialStack[] output) { - CrucibleRecipe recipe = new CrucibleRecipe(index, name, frequency, icon).inputs(input).outputs(output); - CrucibleRecipes.recipes.add(recipe); + CrucibleRecipe recipe = new CrucibleRecipe(name).setup(frequency, icon).inputs(input).outputs(output); + CrucibleRecipes.INSTANCE.register(recipe); } public static void registerCentrifuge(AStack input, ItemStack[] outputs) { 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 44dfb0be6bdd8e066b8a5a456c0460526fae6f3e..6a06373ff63d2888148c33e1dc779e8d762d11c7 100644 GIT binary patch literal 11763 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 Tid`_%58c$%(