diff --git a/gradle.properties b/gradle.properties index 4429db5..f132d22 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ loader_version=0.18.4 loom_version=1.15-SNAPSHOT # Mod Properties -mod_version=1.2.4 +mod_version=1.3.0 maven_group=yungand.tooltiptoggles archives_base_name=tooltiptoggles diff --git a/src/main/java/yungando/tooltiptoggles/TooltipToggles.java b/src/main/java/yungando/tooltiptoggles/TooltipToggles.java index fe086c0..b9358a9 100644 --- a/src/main/java/yungando/tooltiptoggles/TooltipToggles.java +++ b/src/main/java/yungando/tooltiptoggles/TooltipToggles.java @@ -4,19 +4,9 @@ import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.ChatFormatting; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; import yungando.tooltiptoggles.config.TooltipTogglesConfig; import yungando.tooltiptoggles.config.TooltipTogglesConfig.TooltipTogglesAutoConfig; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - public class TooltipToggles implements ClientModInitializer { public static final String MODID = "tooltiptoggles"; public static final boolean USE_AUTO_CONFIG = FabricLoader.getInstance().isModLoaded("cloth-config2"); @@ -31,79 +21,4 @@ public void onInitializeClient() { config = new TooltipTogglesConfig(); } } - - private static void removeItalics(Component tooltip) { - if (tooltip instanceof MutableComponent tooltipText) { - if (tooltipText.getStyle().isItalic()) { - tooltipText.setStyle(tooltipText.getStyle().withItalic(false)); - } - - for (Component siblingTooltip : tooltipText.getSiblings()) { - removeItalics(siblingTooltip); - } - } - } - - private static List sortAttributes(int modifiersIndex, List list) { - ArrayList attributeModifiers = new ArrayList<>(); - for (Component tooltip : list) { - if (tooltip.toString().contains("attribute.modifier")) { - attributeModifiers.add(tooltip); - if (attributeModifiers.size() > 2) { - return list; - } - } - } - - list.removeAll(attributeModifiers); - attributeModifiers.sort(Comparator.comparing(tooltip -> tooltip.toString().split("attribute.name.")[1].split("'")[0])); - list.addAll(modifiersIndex + 1, attributeModifiers); - - return list; - } - - public static List tooltipEditor(ItemStack itemStack, TooltipFlag type, List list) { - if (TooltipToggles.config.removeItalics()) { - for (Component tooltip : list) { - removeItalics(tooltip); - } - } - - if (TooltipToggles.config.sortAttributes()) { - int modifiersIndex = -1; - for (Component tooltip : list) { - if (tooltip.toString().contains("item.modifiers")) { - modifiersIndex = list.indexOf(tooltip); - break; - } - } - - if (modifiersIndex >= 0) { - list = sortAttributes(modifiersIndex, list); - } - } - - if (!type.isAdvanced()) { return list; } - - if (TooltipToggles.config.hideComponents() && !itemStack.getComponents().isEmpty()) { - ArrayList components = new ArrayList<>(); - components.add(Component.translatable("item.components", itemStack.getComponents().size()).withStyle(ChatFormatting.DARK_GRAY)); - int componentsIndex = list.indexOf(components.getFirst()); - if (componentsIndex >= 0) { - list.remove(componentsIndex); - } - } - - if (TooltipToggles.config.hideID()) { - ArrayList id = new ArrayList<>(); - id.add(Component.literal(BuiltInRegistries.ITEM.getKey(itemStack.getItem()).toString()).withStyle(ChatFormatting.DARK_GRAY)); - int idIndex = list.indexOf(id.getFirst()); - - if (idIndex >= 0) { - list.remove(idIndex); - } - } - - return list; - } } \ No newline at end of file diff --git a/src/main/java/yungando/tooltiptoggles/config/TooltipTogglesConfig.java b/src/main/java/yungando/tooltiptoggles/config/TooltipTogglesConfig.java index f96d836..1faefc8 100644 --- a/src/main/java/yungando/tooltiptoggles/config/TooltipTogglesConfig.java +++ b/src/main/java/yungando/tooltiptoggles/config/TooltipTogglesConfig.java @@ -8,6 +8,8 @@ public class TooltipTogglesConfig { public boolean hideComponents() { return true; } public boolean hideID() { return false; } + public boolean hideCreativeCategories() { return false; } + public boolean hideCreativeTags() { return false; } public boolean removeItalics() { return true; } public boolean sortAttributes() { return true; } @@ -19,6 +21,10 @@ public static class TooltipTogglesAutoConfig extends TooltipTogglesConfig implem @Tooltip private boolean hideID = super.hideID(); @Tooltip + private boolean hideCreativeCategories = super.hideCreativeCategories(); + @Tooltip + private boolean hideCreativeTags = super.hideCreativeTags(); + @Tooltip private boolean removeItalics = super.removeItalics(); @Tooltip private boolean sortAttributes = super.sortAttributes(); @@ -28,6 +34,10 @@ public static class TooltipTogglesAutoConfig extends TooltipTogglesConfig implem @Override public boolean hideID() { return hideID; } @Override + public boolean hideCreativeCategories() { return hideCreativeCategories; } + @Override + public boolean hideCreativeTags() { return hideCreativeTags; } + @Override public boolean removeItalics() { return removeItalics; } @Override public boolean sortAttributes() { return sortAttributes; } diff --git a/src/main/java/yungando/tooltiptoggles/mixin/CreativeInventoryMixin.java b/src/main/java/yungando/tooltiptoggles/mixin/CreativeInventoryMixin.java new file mode 100644 index 0000000..adea278 --- /dev/null +++ b/src/main/java/yungando/tooltiptoggles/mixin/CreativeInventoryMixin.java @@ -0,0 +1,22 @@ +package yungando.tooltiptoggles.mixin; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import yungando.tooltiptoggles.TooltipToggles; + +import java.util.List; + +@Mixin(CreativeModeInventoryScreen.class) +public class CreativeInventoryMixin { + @WrapWithCondition(method = "getTooltipFromContainerItem", at = @At(value = "INVOKE", target = "Ljava/util/List;add(ILjava/lang/Object;)V")) + private boolean TooltipToggles$hideCreativeCategories(List instance, int i, Object e) { + return !TooltipToggles.config.hideCreativeCategories(); + } + + @WrapWithCondition(method = "lambda$getTooltipFromContainerItem$0", at = @At(value = "INVOKE", target = "Ljava/util/List;add(ILjava/lang/Object;)V")) + private static boolean TooltipToggles$hideCreativeTags(List instance, int i, Object e) { + return !TooltipToggles.config.hideCreativeTags(); + } +} diff --git a/src/main/java/yungando/tooltiptoggles/mixin/GuiMixin.java b/src/main/java/yungando/tooltiptoggles/mixin/GuiMixin.java index 2c84ead..b6a3bde 100644 --- a/src/main/java/yungando/tooltiptoggles/mixin/GuiMixin.java +++ b/src/main/java/yungando/tooltiptoggles/mixin/GuiMixin.java @@ -1,17 +1,17 @@ package yungando.tooltiptoggles.mixin; -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import net.minecraft.ChatFormatting; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.client.gui.Gui; -import net.minecraft.network.chat.MutableComponent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import yungando.tooltiptoggles.TooltipToggles; @Mixin(Gui.class) public class GuiMixin { - @WrapWithCondition(method = "extractSelectedItemName", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/MutableComponent;withStyle(Lnet/minecraft/ChatFormatting;)Lnet/minecraft/network/chat/MutableComponent;", ordinal = 1)) - private boolean TooltipToggles$removeItalics(MutableComponent instance, ChatFormatting formatting) { - return !TooltipToggles.config.removeItalics(); + @ModifyExpressionValue(method = "extractSelectedItemName", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;has(Lnet/minecraft/core/component/DataComponentType;)Z")) + private boolean TooltipToggles$removeItalics(boolean original) { + if (TooltipToggles.config.removeItalics()) return false; + + return original; } } diff --git a/src/main/java/yungando/tooltiptoggles/mixin/ItemStackMixin.java b/src/main/java/yungando/tooltiptoggles/mixin/ItemStackMixin.java index 527c40f..7f286ed 100644 --- a/src/main/java/yungando/tooltiptoggles/mixin/ItemStackMixin.java +++ b/src/main/java/yungando/tooltiptoggles/mixin/ItemStackMixin.java @@ -1,23 +1,68 @@ package yungando.tooltiptoggles.mixin; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Slice; import yungando.tooltiptoggles.TooltipToggles; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.function.Consumer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ItemStack.class) -public class ItemStackMixin { - @Inject(method = "getTooltipLines", at = @At("RETURN"), cancellable = true) - protected void TooltipToggles$editTooltip(Item.TooltipContext context, Player player, TooltipFlag type, CallbackInfoReturnable> cir) { - cir.setReturnValue(TooltipToggles.tooltipEditor((ItemStack) (Object) this, type, cir.getReturnValue())); +public abstract class ItemStackMixin { + @WrapWithCondition( + method = "addDetailsToTooltip", + slice = @Slice( + from = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/TooltipFlag;isAdvanced()Z"), + to = @At(value = "INVOKE", target = "Lnet/minecraft/core/component/PatchedDataComponentMap;size()I") + ), + at = @At(value = "INVOKE", target = "Ljava/util/function/Consumer;accept(Ljava/lang/Object;)V", ordinal = 1), + require = 1 + ) + private boolean TooltipToggles$hideId(Consumer instance, Object t) { + return !TooltipToggles.config.hideID(); + } + + @WrapWithCondition( + method = "addDetailsToTooltip", + slice = @Slice( + from = @At(value = "INVOKE", target = "Lnet/minecraft/core/component/PatchedDataComponentMap;size()I") + ), + at = @At(value = "INVOKE", target = "Ljava/util/function/Consumer;accept(Ljava/lang/Object;)V", ordinal = 0), + require = 1 + ) + private boolean TooltipToggles$hideComponents(Consumer instance, Object t) { + return !TooltipToggles.config.hideComponents(); + } + + @ModifyExpressionValue(method = "getStyledHoverName", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;has(Lnet/minecraft/core/component/DataComponentType;)Z")) + private boolean TooltipToggles$removeItalics(boolean original) { + if (TooltipToggles.config.removeItalics()) return false; + + return original; + } + + @ModifyVariable(method = "forEachModifier(Lnet/minecraft/world/entity/EquipmentSlotGroup;Lorg/apache/commons/lang3/function/TriConsumer;)V", at = @At(value = "STORE"), name = "modifiers") + private ItemAttributeModifiers TooltipToggles$sortModifiers(ItemAttributeModifiers modifiers) { + if (!TooltipToggles.config.sortAttributes()) return modifiers; + + List sorted = new ArrayList<>(modifiers.modifiers()); + + sorted.sort(Comparator.comparing(entry -> { + Identifier id = BuiltInRegistries.ATTRIBUTE.getKey(entry.attribute().value()); + return id == null ? "" : id.toString(); + })); + + return new ItemAttributeModifiers(sorted); } } diff --git a/src/main/resources/assets/tooltiptoggles/lang/en_us.json b/src/main/resources/assets/tooltiptoggles/lang/en_us.json index 5a8d35f..25de0c2 100644 --- a/src/main/resources/assets/tooltiptoggles/lang/en_us.json +++ b/src/main/resources/assets/tooltiptoggles/lang/en_us.json @@ -4,6 +4,10 @@ "text.autoconfig.tooltiptoggles.option.hideComponents.@Tooltip": "Hides the \"# components\" tooltip when 'Advanced Tooltips' is enabled.", "text.autoconfig.tooltiptoggles.option.hideID": "Hide Minecraft item ID", "text.autoconfig.tooltiptoggles.option.hideID.@Tooltip": "Hides the item's Minecraft ID tooltip when 'Advanced Tooltips' is enabled.", + "text.autoconfig.tooltiptoggles.option.hideCreativeTags": "Hide Creative Search Tags", + "text.autoconfig.tooltiptoggles.option.hideCreativeTags.@Tooltip": "Hides tags in Creative search. E.g. #minecraft:logs", + "text.autoconfig.tooltiptoggles.option.hideCreativeCategories": "Hide Creative Categories", + "text.autoconfig.tooltiptoggles.option.hideCreativeCategories.@Tooltip": "Hides item/block tags when in Creative. E.g. Building Blocks", "text.autoconfig.tooltiptoggles.option.removeItalics": "Remove Italics", "text.autoconfig.tooltiptoggles.option.removeItalics.@Tooltip": "Unitalicises all tooltips.", "text.autoconfig.tooltiptoggles.option.sortAttributes": "Sort Attributes Alphabetically", diff --git a/src/main/resources/tooltiptoggles.mixins.json b/src/main/resources/tooltiptoggles.mixins.json index 051c987..c996678 100644 --- a/src/main/resources/tooltiptoggles.mixins.json +++ b/src/main/resources/tooltiptoggles.mixins.json @@ -9,6 +9,7 @@ "requireAnnotations": true }, "client": [ + "CreativeInventoryMixin", "GuiMixin", "ItemStackMixin" ]