From 990dccd1b5f8ae2403439deb3f45d76bcc1136e7 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 18 May 2021 09:43:31 +0300 Subject: [PATCH] Changed Crystalite armor tooltips registration --- .../ru/betterend/client/BetterEndClient.java | 30 ++++++++++++++--- .../betterend/events/ItemTooltipCallback.java | 32 +++++++++++++++++++ .../ru/betterend/item/CrystaliteArmor.java | 30 ++--------------- .../ru/betterend/item/CrystaliteBoots.java | 23 +++++++++++++ .../betterend/item/CrystaliteChestplate.java | 23 +++++++++++++ .../mixin/client/ItemStackMixin.java | 21 ++++++++++++ .../resources/betterend.mixins.client.json | 3 +- 7 files changed, 129 insertions(+), 33 deletions(-) create mode 100644 src/main/java/ru/betterend/events/ItemTooltipCallback.java create mode 100644 src/main/java/ru/betterend/mixin/client/ItemStackMixin.java diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index 5f52b0cc..0006c016 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -2,17 +2,21 @@ package ru.betterend.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Registry; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.entity.player.Player; import ru.betterend.BetterEnd; import ru.betterend.client.render.ERenderLayer; +import ru.betterend.events.ItemTooltipCallback; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.interfaces.MultiModelItem; -import ru.betterend.registry.EndBlockEntityRenders; -import ru.betterend.registry.EndEntitiesRenders; -import ru.betterend.registry.EndModelProviders; -import ru.betterend.registry.EndParticles; -import ru.betterend.registry.EndScreens; +import ru.betterend.item.CrystaliteArmor; +import ru.betterend.registry.*; import ru.betterend.util.TranslationHelper; public class BetterEndClient implements ClientModInitializer { @@ -26,12 +30,28 @@ public class BetterEndClient implements ClientModInitializer { EndModelProviders.register(); MultiModelItem.register(); ClientOptions.init(); + registerTooltips(); if (BetterEnd.isDevEnvironment()) { TranslationHelper.printMissingNames(); } } + public static void registerTooltips() { + ItemTooltipCallback.EVENT.register((player, stack, context, lines) -> { + if (stack.getItem() instanceof CrystaliteArmor) { + boolean hasSet = false; + if (player != null) { + hasSet = CrystaliteArmor.hasFullSet(player); + } + TranslatableComponent setDesc = new TranslatableComponent("tooltip.armor.crystalite_set"); + setDesc.setStyle(Style.EMPTY.applyFormats(hasSet ? ChatFormatting.BLUE : ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); + lines.add(TextComponent.EMPTY); + lines.add(setDesc); + } + }); + } + private void registerRenderLayers() { RenderType cutout = RenderType.cutout(); RenderType translucent = RenderType.translucent(); diff --git a/src/main/java/ru/betterend/events/ItemTooltipCallback.java b/src/main/java/ru/betterend/events/ItemTooltipCallback.java new file mode 100644 index 00000000..f0a70655 --- /dev/null +++ b/src/main/java/ru/betterend/events/ItemTooltipCallback.java @@ -0,0 +1,32 @@ +package ru.betterend.events; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; + +import java.util.List; + +@Environment(EnvType.CLIENT) +public interface ItemTooltipCallback { + /** + * Fired after the game has appended all base tooltip lines to the list. + */ + Event EVENT = EventFactory.createArrayBacked(ItemTooltipCallback.class, callbacks -> (player, stack, context, lines) -> { + for (ItemTooltipCallback callback : callbacks) { + callback.getTooltip(player, stack, context, lines); + } + }); + + /** + * Called when an item stack's tooltip is rendered. Text added to {@code lines} will be + * rendered with the tooltip. + * + * @param lines the list containing the lines of text displayed on the stack's tooltip + */ + void getTooltip(Player player, ItemStack stack, TooltipFlag context, List lines); +} diff --git a/src/main/java/ru/betterend/item/CrystaliteArmor.java b/src/main/java/ru/betterend/item/CrystaliteArmor.java index 0135e2e4..cb372ec7 100644 --- a/src/main/java/ru/betterend/item/CrystaliteArmor.java +++ b/src/main/java/ru/betterend/item/CrystaliteArmor.java @@ -2,6 +2,7 @@ package ru.betterend.item; import java.util.List; +import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import org.jetbrains.annotations.Nullable; import net.fabricmc.api.EnvType; @@ -25,8 +26,8 @@ import ru.betterend.registry.EndItems; public class CrystaliteArmor extends EndArmorItem { - protected final static TranslatableComponent CHEST_DESC; - protected final static TranslatableComponent BOOTS_DESC; + public final static TranslatableComponent CHEST_DESC; + public final static TranslatableComponent BOOTS_DESC; public CrystaliteArmor(EquipmentSlot equipmentSlot, Properties settings) { super(EndArmorMaterial.CRYSTALITE, equipmentSlot, settings); @@ -44,31 +45,6 @@ public class CrystaliteArmor extends EndArmorItem { public static void applySetEffect(LivingEntity owner) { owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_HEALTH_REGEN)); } - - @Override - @Environment(EnvType.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level level, List lines, TooltipFlag tooltip) { - super.appendHoverText(stack, level, lines, tooltip); - - boolean hasSet = false; - Player owner = Minecraft.getInstance().player; - if (owner != null) { - hasSet = hasFullSet(owner); - } - - TranslatableComponent setDesc = new TranslatableComponent("tooltip.armor.crystalite_set"); - setDesc.setStyle(Style.EMPTY.applyFormats(hasSet ? ChatFormatting.BLUE : ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); - lines.add(TextComponent.EMPTY); - lines.add(setDesc); - - if (stack.getItem() == EndItems.CRYSTALITE_CHESTPLATE) { - lines.add(1, TextComponent.EMPTY); - lines.add(2, CHEST_DESC); - } else if (stack.getItem() == EndItems.CRYSTALITE_BOOTS) { - lines.add(1, TextComponent.EMPTY); - lines.add(2, BOOTS_DESC); - } - } static { Style descStyle = Style.EMPTY.applyFormats(ChatFormatting.DARK_AQUA, ChatFormatting.ITALIC); diff --git a/src/main/java/ru/betterend/item/CrystaliteBoots.java b/src/main/java/ru/betterend/item/CrystaliteBoots.java index 03e0e797..736ca306 100644 --- a/src/main/java/ru/betterend/item/CrystaliteBoots.java +++ b/src/main/java/ru/betterend/item/CrystaliteBoots.java @@ -1,13 +1,28 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; import ru.betterend.effects.EndStatusEffects; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.registry.EndItems; +import java.util.List; + public class CrystaliteBoots extends CrystaliteArmor implements MobEffectApplier { public CrystaliteBoots() { @@ -18,4 +33,12 @@ public class CrystaliteBoots extends CrystaliteArmor implements MobEffectApplier public void applyEffect(LivingEntity owner) { owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_MOVE_SPEED)); } + + @Override + @Environment(EnvType.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List lines, TooltipFlag tooltip) { + super.appendHoverText(stack, level, lines, tooltip); + lines.add(1, TextComponent.EMPTY); + lines.add(2, BOOTS_DESC); + } } diff --git a/src/main/java/ru/betterend/item/CrystaliteChestplate.java b/src/main/java/ru/betterend/item/CrystaliteChestplate.java index 3c55deb0..d9ee2f02 100644 --- a/src/main/java/ru/betterend/item/CrystaliteChestplate.java +++ b/src/main/java/ru/betterend/item/CrystaliteChestplate.java @@ -1,13 +1,28 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; import ru.betterend.effects.EndStatusEffects; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.registry.EndItems; +import java.util.List; + public class CrystaliteChestplate extends CrystaliteArmor implements MobEffectApplier { public CrystaliteChestplate() { @@ -18,4 +33,12 @@ public class CrystaliteChestplate extends CrystaliteArmor implements MobEffectAp public void applyEffect(LivingEntity owner) { owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_DIG_SPEED)); } + + @Override + @Environment(EnvType.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List lines, TooltipFlag tooltip) { + super.appendHoverText(stack, level, lines, tooltip); + lines.add(1, TextComponent.EMPTY); + lines.add(2, CHEST_DESC); + } } diff --git a/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java b/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java new file mode 100644 index 00000000..dd0ffad9 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java @@ -0,0 +1,21 @@ +package ru.betterend.mixin.client; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +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; +import ru.betterend.events.ItemTooltipCallback; + +import java.util.List; + +@Mixin(ItemStack.class) +public class ItemStackMixin { + @Inject(method = "getTooltipLines", at = @At("RETURN")) + private void be_getTooltip(Player entity, TooltipFlag tooltipContext, CallbackInfoReturnable> info) { + ItemTooltipCallback.EVENT.invoker().getTooltip(entity, ItemStack.class.cast(this), tooltipContext, info.getReturnValue()); + } +} diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index be0ed49a..62f3a6eb 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -22,7 +22,8 @@ "BiomeColorsMixin", "ModelLoaderMixin", "LocalPlayerMixin", - "CapeLayerMixin" + "CapeLayerMixin", + "ItemStackMixin" ], "injectors": { "defaultRequire": 1