From b40dcd4669a31d8eee9dae985b473b4fcefc1ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 27 Dec 2020 02:28:59 +0100 Subject: [PATCH] Nicer computer inventory tooltip. --- .../li/cil/oc2/common/util/TooltipUtils.java | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/main/java/li/cil/oc2/common/util/TooltipUtils.java b/src/main/java/li/cil/oc2/common/util/TooltipUtils.java index ad77cf3e..1b8e2224 100644 --- a/src/main/java/li/cil/oc2/common/util/TooltipUtils.java +++ b/src/main/java/li/cil/oc2/common/util/TooltipUtils.java @@ -1,26 +1,67 @@ package li.cil.oc2.common.util; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; +import net.minecraft.util.text.Color; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import java.util.ArrayList; import java.util.List; import static li.cil.oc2.Constants.BLOCK_ENTITY_INVENTORY_TAG_NAME; import static li.cil.oc2.Constants.BLOCK_ENTITY_TAG_NAME_IN_ITEM; public final class TooltipUtils { + private static final ThreadLocal> ITEM_STACKS = ThreadLocal.withInitial(ArrayList::new); + private static final ThreadLocal ITEM_STACKS_SIZES = ThreadLocal.withInitial(IntArrayList::new); + public static void addInventoryInformation(final ItemStack stack, final List tooltip) { final CompoundNBT tileEntityNbt = stack.getChildTag(BLOCK_ENTITY_TAG_NAME_IN_ITEM); if (tileEntityNbt != null && tileEntityNbt.contains(BLOCK_ENTITY_INVENTORY_TAG_NAME, NBTTagIds.TAG_COMPOUND)) { final CompoundNBT itemHandlerNbt = tileEntityNbt.getCompound(BLOCK_ENTITY_INVENTORY_TAG_NAME); final ListNBT itemsNbt = itemHandlerNbt.getList("Items", NBTTagIds.TAG_COMPOUND); + + final List itemStacks = ITEM_STACKS.get(); + itemStacks.clear(); + final IntList itemStackSizes = ITEM_STACKS_SIZES.get(); + itemStackSizes.clear(); + for (int i = 0; i < itemsNbt.size(); i++) { final CompoundNBT itemNbt = itemsNbt.getCompound(i); final ItemStack itemStack = ItemStack.read(itemNbt); - tooltip.add(new StringTextComponent(" - ").append(itemStack.getDisplayName())); + + boolean didMerge = false; + for (int j = 0; j < itemStacks.size(); j++) { + final ItemStack existingStack = itemStacks.get(j); + if (ItemStack.areItemsEqual(existingStack, itemStack) && + ItemStack.areItemStackTagsEqual(existingStack, itemStack)) { + final int existingCount = itemStackSizes.getInt(j); + itemStackSizes.set(j, existingCount + itemStack.getCount()); + didMerge = true; + break; + } + } + + if (!didMerge) { + itemStacks.add(itemStack); + itemStackSizes.add(itemStack.getCount()); + } + } + + for (int i = 0; i < itemStacks.size(); i++) { + final ItemStack itemStack = itemStacks.get(i); + tooltip.add(new StringTextComponent("") + .append(itemStack.getDisplayName()) + .modifyStyle(style -> style.setColor(Color.fromTextFormatting(TextFormatting.GRAY))) + .append(new StringTextComponent(" x") + .appendString(String.valueOf(itemStackSizes.getInt(i))) + .modifyStyle(style -> style.setColor(Color.fromTextFormatting(TextFormatting.DARK_GRAY)))) + ); } } }