From a5431aaad97e73c563b34cde7c4faa475c062cc3 Mon Sep 17 00:00:00 2001 From: PouffyDev <99536749+pouffy@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:07:11 +0100 Subject: [PATCH] QOL Vat Changes - Vat JEI now displays vat types properly. - Vat JEI now combines multiple of the same ingredients into one slot. - Vat JEI now properly shows the chance slot icon if the output has a chance. - Added new cast iron overlay sprite to the Vat JEI icon set - Fireproof Vat Item model now uses the single block model instead of the windowed model. - Vats now properly output all fluid outputs instead of one. - Fixed issue from previous commit where the vat would check the wrong values from the machine attachment map. --- .../e54e4c34b4f65d271b7b9f53d4ba815125cff8b9 | 4 +- .../models/item/fireproof_chemical_vat.json | 2 +- .../machinery/vat/base/VatBlockEntity.java | 62 +++++++++++++----- .../tfmg/recipes/jei/ChemicalVatCategory.java | 46 ++++++++----- .../drmangotea/tfmg/registry/TFMGBlocks.java | 2 +- .../tfmg/registry/TFMGGuiTextures.java | 1 + .../assets/tfmg/textures/gui/chemical_vat.png | Bin 4729 -> 5753 bytes 7 files changed, 77 insertions(+), 40 deletions(-) diff --git a/src/generated/resources/.cache/e54e4c34b4f65d271b7b9f53d4ba815125cff8b9 b/src/generated/resources/.cache/e54e4c34b4f65d271b7b9f53d4ba815125cff8b9 index 846538b9..5410a0a4 100644 --- a/src/generated/resources/.cache/e54e4c34b4f65d271b7b9f53d4ba815125cff8b9 +++ b/src/generated/resources/.cache/e54e4c34b4f65d271b7b9f53d4ba815125cff8b9 @@ -1,4 +1,4 @@ -// 1.20.1 2025-07-08T20:26:28.2936491 Registrate Provider for tfmg [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-07-09T13:44:40.7657277 Registrate Provider for tfmg [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] ff5a5721633b83465ab501cbdfdc579a0f20e938 assets/tfmg/blockstates/accumulator.json e982a263b6af75821042107fdeff7bd809436d08 assets/tfmg/blockstates/air_intake.json e7f63aadfc892e337d9f87b5e50af8b1c7e4103f assets/tfmg/blockstates/aluminum_bars.json @@ -1234,7 +1234,7 @@ e7d137a2136040f6e504d0b26cede820d2a1be0d assets/tfmg/models/item/firebox.json 6adcbf69c17e06e98cc848dc136b8907c9cff7be assets/tfmg/models/item/fireproof_brick.json 080629b77cc20daacb129c7fe3c3a97d5df677f2 assets/tfmg/models/item/fireproof_bricks.json 96171ac619fe06339e4888ebf16f744745d5d667 assets/tfmg/models/item/fireproof_brick_reinforcement.json -492765a0dcafe3346e25697e1e81df64088348af assets/tfmg/models/item/fireproof_chemical_vat.json +75526784c8d6f3da82d6991ac29decb74e8ffcad assets/tfmg/models/item/fireproof_chemical_vat.json e82498c07d178acd47a4eb43b92c86fd99ba3239 assets/tfmg/models/item/flamethrower.json 6760e6cfe559d9d21c16a1ac8e444423fa8f6c48 assets/tfmg/models/item/flarestack.json 7e4a58a6d05b19dc8c5fff73434c2d7cefa75343 assets/tfmg/models/item/fossilstone.json diff --git a/src/generated/resources/assets/tfmg/models/item/fireproof_chemical_vat.json b/src/generated/resources/assets/tfmg/models/item/fireproof_chemical_vat.json index 92fdd16e..71ff7386 100644 --- a/src/generated/resources/assets/tfmg/models/item/fireproof_chemical_vat.json +++ b/src/generated/resources/assets/tfmg/models/item/fireproof_chemical_vat.json @@ -1,3 +1,3 @@ { - "parent": "tfmg:block/fireproof_chemical_vat/block_single_window" + "parent": "tfmg:block/fireproof_chemical_vat/block_single" } \ No newline at end of file diff --git a/src/main/java/com/drmangotea/tfmg/content/machinery/vat/base/VatBlockEntity.java b/src/main/java/com/drmangotea/tfmg/content/machinery/vat/base/VatBlockEntity.java index 32e9188a..82e9326a 100644 --- a/src/main/java/com/drmangotea/tfmg/content/machinery/vat/base/VatBlockEntity.java +++ b/src/main/java/com/drmangotea/tfmg/content/machinery/vat/base/VatBlockEntity.java @@ -225,11 +225,11 @@ public class VatBlockEntity extends SmartBlockEntity implements IHaveGoggleInfor continue; boolean doesntMatch = false; - if (!Objects.equals(testedRecipe.machines, machineMap.keySet().stream().toList())) { + if (!Objects.equals(testedRecipe.machines, machineMap.values().stream().toList())) { continue; } - if (!getControllerBE().areMachinesValid) { + if (!areMachinesValid) { continue; } @@ -404,7 +404,7 @@ public class VatBlockEntity extends SmartBlockEntity implements IHaveGoggleInfor } } - areMachinesValid = operationalMachinesMap.entrySet().stream().allMatch((op) -> op.getValue() == true); + areMachinesValid = operationalMachinesMap.values().stream().allMatch((op) -> op == true); if (syncCooldown > 0) { syncCooldown--; @@ -515,23 +515,49 @@ public class VatBlockEntity extends SmartBlockEntity implements IHaveGoggleInfor //fluid output List handledFluidResults = new ArrayList<>(); - for (FluidStack fluidStack : recipe.getFluidResults()) { - for (int i = 0; i < outputFluidHandler.getTanks(); i++) { - FluidStack fluidInTank = outputFluidHandler.getFluidInTank(i); - if (fluidInTank.getFluid().isSame(fluidStack.getFluid())) { - outputFluidHandler.fill(new FluidStack(fluidStack.copy(), fluidStack.getAmount()), IFluidHandler.FluidAction.EXECUTE); - handledFluidResults.add(i); - break; + List handledFluidStacks = new ArrayList<>(); + List tankSegments = List.of(outputTank.getTanks()); + if (recipe != null) + for (FluidStack fluidStack : recipe.getFluidResults()) { + for (SmartFluidTankBehaviour.TankSegment tankSegment : tankSegments) { + SmartFluidTank tank = ((TankSegmentAccessor) tankSegment).tfmg$tank(); + FluidStack fluidInTank = tank.getFluid(); + if (handledFluidStacks.contains(fluidStack)) break; + + if (fluidInTank.getFluid().isSame(fluidStack.getFluid())) { + tank.fill(new FluidStack(fluidStack.copy(), fluidStack.getAmount()), IFluidHandler.FluidAction.EXECUTE); + handledFluidStacks.add(fluidStack); + break; + } + if (!handledFluidStacks.contains(fluidStack) && fluidInTank.isEmpty()) { + tank.fill(new FluidStack(fluidStack.copy(), fluidStack.getAmount()), IFluidHandler.FluidAction.EXECUTE); + break; + } } + //for (int i = 0; i < tankSegments.size(); i++) { + // FluidStack fluidInTank = outputFluidHandler.getFluidInTank(i); +// + // if (handledFluidStacks.contains(fluidStack)) break; +// + // if (fluidInTank.isEmpty()) { + // outputFluidHandler.fill(new FluidStack(fluidStack.copy(), fluidStack.getAmount()), IFluidHandler.FluidAction.EXECUTE); + // handledFluidStacks.add(fluidStack); + // handledFluidResults.add(i); + // } + // else if (fluidInTank.getFluid().isSame(fluidStack.getFluid()) && fluidInTank.getAmount() + fluidStack.getAmount() <= outputFluidHandler.getCapacity()) { + // outputFluidHandler.fill(new FluidStack(fluidStack.copy(), fluidStack.getAmount()), IFluidHandler.FluidAction.EXECUTE); + // handledFluidStacks.add(fluidStack); + // handledFluidResults.add(i); + // } + //} + //for (int i = 0; i < outputFluidHandler.getTanks(); i++) { + // FluidStack fluidInTank = outputFluidHandler.getFluidInTank(i); + // if (!handledFluidResults.contains(i) && fluidInTank.isEmpty()) { + // outputFluidHandler.fill(new FluidStack(fluidStack.copy(), fluidStack.getAmount()), IFluidHandler.FluidAction.EXECUTE); + // break; + // } + //} } - for (int i = 0; i < outputFluidHandler.getTanks(); i++) { - FluidStack fluidInTank = outputFluidHandler.getFluidInTank(i); - if (!handledFluidResults.contains(i) && fluidInTank.isEmpty()) { - outputFluidHandler.fill(new FluidStack(fluidStack.copy(), fluidStack.getAmount()), IFluidHandler.FluidAction.EXECUTE); - break; - } - } - } recipe = null; timer = 0; } else { diff --git a/src/main/java/com/drmangotea/tfmg/recipes/jei/ChemicalVatCategory.java b/src/main/java/com/drmangotea/tfmg/recipes/jei/ChemicalVatCategory.java index e8bd0ef7..6ef8ea72 100644 --- a/src/main/java/com/drmangotea/tfmg/recipes/jei/ChemicalVatCategory.java +++ b/src/main/java/com/drmangotea/tfmg/recipes/jei/ChemicalVatCategory.java @@ -1,21 +1,20 @@ package com.drmangotea.tfmg.recipes.jei; -import com.drmangotea.tfmg.recipes.PolarizingRecipe; import com.drmangotea.tfmg.recipes.VatMachineRecipe; -import com.drmangotea.tfmg.recipes.jei.machines.Polarizer; import com.drmangotea.tfmg.registry.TFMGGuiTextures; -import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.compat.jei.category.CreateRecipeCategory; -import com.simibubi.create.compat.jei.category.sequencedAssembly.SequencedAssemblySubCategory; import com.simibubi.create.content.processing.recipe.HeatCondition; -import com.simibubi.create.content.processing.sequenced.SequencedRecipe; -import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.content.processing.recipe.ProcessingOutput; +import com.simibubi.create.foundation.item.ItemHelper; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; -import net.minecraft.client.Minecraft; +import net.createmod.catnip.data.Pair; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import org.apache.commons.lang3.mutable.MutableInt; import java.util.ArrayList; import java.util.List; @@ -42,15 +41,22 @@ public class ChemicalVatCategory extends CreateRecipeCategory pos += 21; } - int itemCount = recipe.getIngredients().size(); + List> condensedIngredients = ItemHelper.condenseIngredients(recipe.getIngredients()); + + int itemCount = condensedIngredients.size(); int itemPos = 55; int itemWidth = ((itemCount) * 20) / 2; int itemMovement = itemCount != 4 ? 1 : 0; if (itemCount == 1) itemMovement = 2; - for (int i = 0; i < itemCount; i++) { - - builder.addSlot(RecipeIngredientRole.INPUT, itemPos - itemWidth + itemMovement, recipe.getFluidIngredients().isEmpty() ? 72 : 64).setBackground(getRenderedSlot(), -1, -1).addIngredients(recipe.getIngredients().get(i)); + for (Pair pair : condensedIngredients) { + List stacks = new ArrayList<>(); + for (ItemStack itemStack : pair.getFirst().getItems()) { + ItemStack copy = itemStack.copy(); + copy.setCount(pair.getSecond().getValue()); + stacks.add(copy); + } + builder.addSlot(RecipeIngredientRole.INPUT, itemPos - itemWidth + itemMovement, recipe.getFluidIngredients().isEmpty() ? 72 : 64).setBackground(getRenderedSlot(), -1, -1).addItemStacks(stacks); itemPos += 21; } @@ -68,12 +74,12 @@ public class ChemicalVatCategory extends CreateRecipeCategory int itemResultPos = 90; for (int i = 0; i < recipe.getRollableResults().size(); i++) { - + ProcessingOutput output = recipe.getRollableResults().get(i); builder .addSlot(RecipeIngredientRole.OUTPUT, 128, itemResultPos) - .setBackground(getRenderedSlot(), -1, -1) - .addItemStack(recipe.getRollableResults().get(i).getStack()) - .addRichTooltipCallback(addStochasticTooltip(recipe.getRollableResults().get(i))) + .setBackground(getRenderedSlot(output), -1, -1) + .addItemStack(output.getStack()) + .addRichTooltipCallback(addStochasticTooltip(output)) ; itemResultPos -= 21; @@ -101,8 +107,9 @@ public class ChemicalVatCategory extends CreateRecipeCategory pos += 21; } int posItem = 55; - int widthItem = ((recipe.getIngredients().size()) * 21) / 2; - for (int i = 0; i < recipe.getIngredients().size(); i++) { + List> condensedIngredients = ItemHelper.condenseIngredients(recipe.getIngredients()); + int widthItem = ((condensedIngredients.size()) * 21) / 2; + for (int i = 0; i < condensedIngredients.size(); i++) { TFMGGuiTextures.SLOT.render(graphics, posItem - widthItem, recipe.getFluidIngredients().isEmpty() ? 70 : 62); @@ -126,9 +133,12 @@ public class ChemicalVatCategory extends CreateRecipeCategory //Can be overridden with mixins for easily adding different stuff - Krystal //Might consider a better way of doing this but idk. private void drawVatTypes(List allowedVatTypes, GuiGraphics graphics) { - if (allowedVatTypes.contains("firebrick_lined_vat") && allowedVatTypes.size() == 1) { + if (allowedVatTypes.contains("tfmg:firebrick_lined_vat") && allowedVatTypes.size() == 1) { TFMGGuiTextures.FIREPROOF_BRICK_OVERLAY.render(graphics, 55 - 48, 32); } + if (allowedVatTypes.contains("tfmg:cast_iron_vat") && allowedVatTypes.size() == 1) { + TFMGGuiTextures.CAST_IRON_VAT_OVERLAY.render(graphics, 0, 24); + } } //Can be overridden with mixins for easily adding different stuff - Krystal diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java index 32a5b867..6b5b674c 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGBlocks.java @@ -488,7 +488,7 @@ public class TFMGBlocks { .onRegister(CreateRegistrate.blockModel(() -> SteelFluidTankModel::fireproofVat)) .addLayer(() -> RenderType::cutoutMipped) .item(SteelTankItem::new) - .model(AssetLookup.customBlockItemModel("_", "block_single_window")) + .model(AssetLookup.customBlockItemModel("_", "block_single")) .build() .register(); diff --git a/src/main/java/com/drmangotea/tfmg/registry/TFMGGuiTextures.java b/src/main/java/com/drmangotea/tfmg/registry/TFMGGuiTextures.java index ad1fb4cd..7fe6fd66 100644 --- a/src/main/java/com/drmangotea/tfmg/registry/TFMGGuiTextures.java +++ b/src/main/java/com/drmangotea/tfmg/registry/TFMGGuiTextures.java @@ -30,6 +30,7 @@ public enum TFMGGuiTextures implements ScreenElement { ELECTRODE("chemical_vat", 189, 0, 8, 29), GRAPHITE_ELECTRODE("chemical_vat", 176, 0, 8, 29), FIREPROOF_BRICK_OVERLAY("chemical_vat", 0, 84, 96, 72), + CAST_IRON_VAT_OVERLAY("chemical_vat", 0, 156, 110, 84), VAT_HEATER("chemical_vat", 112, 44, 20, 14), VAT_SUPERHEATER("chemical_vat", 112, 58, 20, 14) diff --git a/src/main/resources/assets/tfmg/textures/gui/chemical_vat.png b/src/main/resources/assets/tfmg/textures/gui/chemical_vat.png index b54d3747f5e8cf73e8043d34370ae1b8d931aa83..2695da870ad2af85e90296aee4c41470d48780e4 100644 GIT binary patch literal 5753 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 BhO+h!*~&VyZ)5P3Pa)aKG87?OvW%=F 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 Iv~9xv2OJ^lApigX