From 68dec271ba6f214711c3849ee6f53b0e37f9e094 Mon Sep 17 00:00:00 2001 From: ALongStringOfNumbers <31759736+ALongStringOfNumbers@users.noreply.github.com> Date: Mon, 12 Jul 2021 19:58:59 -0700 Subject: [PATCH] Add clarification tooltips to blocks in the multiblock preview (#1584) --- .../multiblock/MultiblockInfoCategory.java | 4 ++ .../jei/multiblock/MultiblockInfoPage.java | 67 ++++++++++++++++++- .../MultiblockInfoRecipeWrapper.java | 19 ++++++ .../jei/multiblock/infos/CrackerUnitInfo.java | 10 +++ .../infos/DistillationTowerInfo.java | 16 +++++ .../infos/ElectricBlastFurnaceInfo.java | 10 +++ .../infos/ImplosionCompressorInfo.java | 10 +++ .../multiblock/infos/MultiSmelterInfo.java | 10 +++ .../multiblock/infos/PyrolyzeOvenInfo.java | 13 ++++ .../multiblock/infos/VacuumFreezerInfo.java | 12 ++++ .../resources/assets/gregtech/lang/en_us.lang | 6 ++ 11 files changed, 176 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoCategory.java b/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoCategory.java index 7406953545..1873ce382b 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoCategory.java +++ b/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoCategory.java @@ -8,6 +8,7 @@ import mezz.jei.api.IGuiHelper; import mezz.jei.api.IModRegistry; import mezz.jei.api.gui.IDrawable; +import mezz.jei.api.gui.IGuiItemStackGroup; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.ingredients.IIngredients; import mezz.jei.api.recipe.IRecipeCategory; @@ -81,5 +82,8 @@ public IDrawable getIcon() { @Override public void setRecipe(IRecipeLayout recipeLayout, MultiblockInfoRecipeWrapper recipeWrapper, IIngredients ingredients) { recipeWrapper.setRecipeLayout((RecipeLayout) recipeLayout, this.guiHelper); + + IGuiItemStackGroup itemStackGroup = recipeLayout.getItemStacks(); + itemStackGroup.addTooltipCallback(recipeWrapper::addBlockTooltips); } } diff --git a/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoPage.java b/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoPage.java index 5f2a82bc12..917780515d 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoPage.java +++ b/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoPage.java @@ -1,14 +1,30 @@ package gregtech.integration.jei.multiblock; +import gregtech.api.GTValues; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.util.ItemStackHashStrategy; +import gregtech.common.metatileentities.MetaTileEntities; +import it.unimi.dsi.fastutil.Hash; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap; import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public abstract class MultiblockInfoPage { + private final Hash.Strategy strategy = ItemStackHashStrategy.comparingAllButCount(); + + private Map> blockTooltips = new Object2ObjectOpenCustomHashMap<>(strategy); + + private static final ITextComponent defaultText = new TextComponentTranslation("gregtech.multiblock.preview.any_hatch").setStyle(new Style().setColor(TextFormatting.GREEN)); + public abstract MultiblockControllerBase getController(); public abstract List getMatchingShapes(); @@ -26,4 +42,53 @@ public List informationText() { .map(I18n::format) .collect(Collectors.toList()); } + + /** + * Gets the Map containing all tooltips for Blocks that have had tooltips applied. + * Will generate the map if it does not exist + * @return - The Map containing Tooltips and Formatting for specific Blocks + */ + public Map> getBlockTooltipMap() { + // Generate on first use + if (this.blockTooltips.size() == 0) { + generateBlockTooltips(); + } + return this.blockTooltips; + } + + /** + * Contains the default tooltips that will be applied to all default Blocks + */ + protected void generateBlockTooltips() { + + for(int i = 0; i < GTValues.V.length; i++) { + addBlockTooltip(MetaTileEntities.ITEM_EXPORT_BUS[i].getStackForm(), defaultText); + addBlockTooltip(MetaTileEntities.ITEM_IMPORT_BUS[i].getStackForm(), defaultText); + addBlockTooltip(MetaTileEntities.FLUID_EXPORT_HATCH[i].getStackForm(), defaultText); + addBlockTooltip(MetaTileEntities.FLUID_IMPORT_HATCH[i].getStackForm(), defaultText); + } + } + + /** + * A Helper method for adding tooltips to Blocks in the multiblock preview screen. + * Can be called if {@link MultiblockInfoPage#generateBlockTooltips()} is not overridden + * Will add tooltips to MultiblockAbilities with existing tooltips + * @param itemStack - The ItemStack form of the Block to add a Tooltip too + * @param tooltip - An ITextComponent object consisting of the tooltip and format to add to the block + */ + protected void addBlockTooltip(ItemStack itemStack, ITextComponent tooltip) { + + List tooltipList = this.blockTooltips.getOrDefault(itemStack, null); + + if(tooltipList == null) { + List tooltipToAdd = new ArrayList<>(); + tooltipToAdd.add(tooltip); + this.blockTooltips.put(itemStack, tooltipToAdd); + } + else { + tooltipList.add(tooltip); + this.blockTooltips.put(itemStack, tooltipList); + + } + } } diff --git a/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoRecipeWrapper.java b/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoRecipeWrapper.java index c6fefc01d6..760ae0c264 100755 --- a/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoRecipeWrapper.java +++ b/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoRecipeWrapper.java @@ -34,6 +34,7 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.client.config.GuiUtils; @@ -345,11 +346,29 @@ public List getTooltipStrings(int mouseX, int mouseY) { tooltip.set(k, TextFormatting.GRAY + tooltip.get(k)); } } + Map> blockTooltipMap = infoPage.getBlockTooltipMap(); + if(blockTooltipMap.containsKey(tooltipBlockStack)) { + List tooltips = blockTooltipMap.get(tooltipBlockStack); + for(int i = 0; i < tooltips.size(); i++) { + //Start at i+1 due to ItemStack name + tooltip.add(i + 1, tooltips.get(i).getFormattedText()); + } + } return tooltip; } return Collections.emptyList(); } + public void addBlockTooltips(int slotIndex, boolean input, ItemStack itemStack, List tooltip) { + Map> blockTooltipMap = infoPage.getBlockTooltipMap(); + if(blockTooltipMap.containsKey(itemStack)) { + List tooltips = blockTooltipMap.get(itemStack); + for(int i = 0; i < tooltips.size(); i++) { + tooltip.add(i + 1, tooltips.get(i).getFormattedText()); + } + } + } + private static class PartInfo { final ItemStackKey itemStackKey; boolean isController = false; diff --git a/src/main/java/gregtech/integration/jei/multiblock/infos/CrackerUnitInfo.java b/src/main/java/gregtech/integration/jei/multiblock/infos/CrackerUnitInfo.java index 5209a92a78..fe23c7c9dc 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/infos/CrackerUnitInfo.java +++ b/src/main/java/gregtech/integration/jei/multiblock/infos/CrackerUnitInfo.java @@ -12,6 +12,10 @@ import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; import net.minecraft.util.EnumFacing; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; import java.util.List; @@ -44,4 +48,10 @@ public String[] getDescription() { return new String[]{I18n.format("gregtech.multiblock.cracker.description")}; } + @Override + protected void generateBlockTooltips() { + super.generateBlockTooltips(); + ITextComponent tooltip = new TextComponentTranslation("gregtech.multiblock.preview.limit", 20).setStyle(new Style().setColor(TextFormatting.AQUA)); + addBlockTooltip(MetaBlocks.METAL_CASING.getItemVariant(BlockMetalCasing.MetalCasingType.STAINLESS_CLEAN), tooltip); + } } diff --git a/src/main/java/gregtech/integration/jei/multiblock/infos/DistillationTowerInfo.java b/src/main/java/gregtech/integration/jei/multiblock/infos/DistillationTowerInfo.java index ae450d744d..bcdd82e1b4 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/infos/DistillationTowerInfo.java +++ b/src/main/java/gregtech/integration/jei/multiblock/infos/DistillationTowerInfo.java @@ -11,6 +11,10 @@ import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; import net.minecraft.util.EnumFacing; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; import java.util.List; @@ -47,4 +51,16 @@ public String[] getDescription() { public float getDefaultZoom() { return 0.7f; } + + @Override + protected void generateBlockTooltips() { + super.generateBlockTooltips(); + ITextComponent tooltip = new TextComponentTranslation("gregtech.multiblock.preview.limit_per_layer", 1).setStyle(new Style().setColor(TextFormatting.DARK_RED)); + ITextComponent inputTooltip = new TextComponentTranslation("gregtech.multiblock.preview.only_location", I18n.format("gregtech.multiblock.preview.location.b_c")).setStyle(new Style().setColor(TextFormatting.DARK_RED)); + + for(int i = 0; i < GTValues.V.length; i++) { + addBlockTooltip(MetaTileEntities.FLUID_EXPORT_HATCH[i].getStackForm(), tooltip); + addBlockTooltip(MetaTileEntities.FLUID_IMPORT_HATCH[i].getStackForm(), inputTooltip); + } + } } diff --git a/src/main/java/gregtech/integration/jei/multiblock/infos/ElectricBlastFurnaceInfo.java b/src/main/java/gregtech/integration/jei/multiblock/infos/ElectricBlastFurnaceInfo.java index 4ac3861ad8..23e35e6ccc 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/infos/ElectricBlastFurnaceInfo.java +++ b/src/main/java/gregtech/integration/jei/multiblock/infos/ElectricBlastFurnaceInfo.java @@ -11,6 +11,10 @@ import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; import net.minecraft.util.EnumFacing; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; import java.util.ArrayList; import java.util.List; @@ -53,4 +57,10 @@ public String[] getDescription() { return new String[]{I18n.format("gregtech.multiblock.electric_blast_furnace.description")}; } + @Override + protected void generateBlockTooltips() { + super.generateBlockTooltips(); + ITextComponent tooltip = new TextComponentTranslation("gregtech.multiblock.preview.limit", 10).setStyle(new Style().setColor(TextFormatting.AQUA)); + addBlockTooltip(MetaBlocks.METAL_CASING.getItemVariant(MetalCasingType.INVAR_HEATPROOF), tooltip); + } } diff --git a/src/main/java/gregtech/integration/jei/multiblock/infos/ImplosionCompressorInfo.java b/src/main/java/gregtech/integration/jei/multiblock/infos/ImplosionCompressorInfo.java index 8382b8293b..1c93a2f106 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/infos/ImplosionCompressorInfo.java +++ b/src/main/java/gregtech/integration/jei/multiblock/infos/ImplosionCompressorInfo.java @@ -11,6 +11,10 @@ import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; import net.minecraft.util.EnumFacing; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; import java.util.List; @@ -42,4 +46,10 @@ public String[] getDescription() { return new String[]{I18n.format("gregtech.multiblock.implosion_compressor.description")}; } + @Override + protected void generateBlockTooltips() { + super.generateBlockTooltips(); + ITextComponent tooltip = new TextComponentTranslation("gregtech.multiblock.preview.limit", 14).setStyle(new Style().setColor(TextFormatting.AQUA)); + addBlockTooltip(MetaBlocks.METAL_CASING.getItemVariant(MetalCasingType.STEEL_SOLID), tooltip); + } } diff --git a/src/main/java/gregtech/integration/jei/multiblock/infos/MultiSmelterInfo.java b/src/main/java/gregtech/integration/jei/multiblock/infos/MultiSmelterInfo.java index 0cee1936cc..6e2aee9b29 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/infos/MultiSmelterInfo.java +++ b/src/main/java/gregtech/integration/jei/multiblock/infos/MultiSmelterInfo.java @@ -11,6 +11,10 @@ import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; import net.minecraft.util.EnumFacing; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; import java.util.ArrayList; import java.util.List; @@ -47,4 +51,10 @@ public String[] getDescription() { return new String[]{I18n.format("gregtech.multiblock.multi_smelter.description")}; } + @Override + protected void generateBlockTooltips() { + super.generateBlockTooltips(); + ITextComponent tooltip = new TextComponentTranslation("gregtech.multiblock.preview.limit", 9).setStyle(new Style().setColor(TextFormatting.AQUA)); + addBlockTooltip(MetaBlocks.METAL_CASING.getItemVariant(MetalCasingType.INVAR_HEATPROOF), tooltip); + } } diff --git a/src/main/java/gregtech/integration/jei/multiblock/infos/PyrolyzeOvenInfo.java b/src/main/java/gregtech/integration/jei/multiblock/infos/PyrolyzeOvenInfo.java index 0676ba33f6..cdc01a05df 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/infos/PyrolyzeOvenInfo.java +++ b/src/main/java/gregtech/integration/jei/multiblock/infos/PyrolyzeOvenInfo.java @@ -11,7 +11,12 @@ import gregtech.integration.jei.multiblock.MultiblockShapeInfo; import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; import java.util.List; @@ -47,4 +52,12 @@ public String[] getDescription() { return new String[]{I18n.format("gregtech.multiblock.pyrolyze_oven.description")}; } + @Override + protected void generateBlockTooltips() { + super.generateBlockTooltips(); + ItemStack coils = MetaBlocks.WIRE_COIL.getItemVariant(BlockWireCoil.CoilType.CUPRONICKEL); + ITextComponent tooltip = new TextComponentTranslation("gregtech.multiblock.preview.only", coils.getDisplayName()).setStyle(new Style().setColor(TextFormatting.RED)); + addBlockTooltip(coils, tooltip); + } + } diff --git a/src/main/java/gregtech/integration/jei/multiblock/infos/VacuumFreezerInfo.java b/src/main/java/gregtech/integration/jei/multiblock/infos/VacuumFreezerInfo.java index 0115ed0385..f5db52e1b5 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/infos/VacuumFreezerInfo.java +++ b/src/main/java/gregtech/integration/jei/multiblock/infos/VacuumFreezerInfo.java @@ -11,6 +11,10 @@ import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; import net.minecraft.util.EnumFacing; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; import java.util.List; @@ -44,4 +48,12 @@ public String[] getDescription() { return new String[]{I18n.format("gregtech.multiblock.vacuum_freezer.description")}; } + @Override + protected void generateBlockTooltips() { + super.generateBlockTooltips(); + ITextComponent tooltip = new TextComponentTranslation("gregtech.multiblock.preview.limit", 14).setStyle(new Style().setColor(TextFormatting.AQUA)); + addBlockTooltip(MetaBlocks.METAL_CASING.getItemVariant(MetalCasingType.ALUMINIUM_FROSTPROOF), tooltip); + } + + } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 7144dc2dd5..717a176c5b 100755 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -2971,6 +2971,12 @@ gregtech.multiblock.preview.zoom=Shift+RMB to zoom gregtech.multiblock.preview.pan=LMB+Drag to pan gregtech.multiblock.preview.move=RMB+Drag to move gregtech.multiblock.preview.reset=Scroll Mousewheel to reset +gregtech.multiblock.preview.any_hatch=Any tier hatch can be used to form the structure +gregtech.multiblock.preview.limit=Minimum Limit: %d +gregtech.multiblock.preview.limit_per_layer=Only %d per layer +gregtech.multiblock.preview.only=Only %s allowed +gregtech.multiblock.preview.only_location=Only allowed at %s +gregtech.multiblock.preview.location.b_c=Bottom Center gregtech.multiblock.blast_furnace.max_temperature=Max Temperature: %sK gregtech.multiblock.multi_furnace.heating_coil_level=Heating Coil Level: %s