diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java index c7633e4a..d0bd48cc 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java @@ -16,8 +16,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import com.google.gson.JsonObject; +import com.minelittlepony.unicopia.client.gui.ItemTraitsTooltipRenderer; import com.minelittlepony.unicopia.util.InventoryUtil; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.block.Block; import net.minecraft.inventory.Inventory; import net.minecraft.item.Item; @@ -25,7 +28,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.network.PacketByteBuf; -import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.Registry; @@ -93,14 +95,12 @@ public final class SpellTraits implements Iterable> { return MathHelper.clamp(get(trait), min, max); } + @Environment(EnvType.CLIENT) public void appendTooltip(List tooltip) { if (isEmpty()) { return; } - tooltip.add(new LiteralText("Traits:")); - traits.forEach((trait, amount) -> { - tooltip.add(new LiteralText(trait.name().toLowerCase() + ": " + amount)); - }); + tooltip.add(1, new ItemTraitsTooltipRenderer(this)); } public NbtCompound toNbt() { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java index 921383e0..4915d836 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java @@ -36,10 +36,12 @@ public enum Trait { public static final Map REGISTRY = Arrays.stream(values()).collect(Collectors.toMap(Trait::name, Function.identity())); private final Identifier id; + private final Identifier sprite; private final TraitGroup group; Trait(TraitGroup group) { this.id = new Identifier("unicopia", "spell/trait/" + name().toLowerCase()); + this.sprite = new Identifier("unicopia", "textures/gui/trait/" + name().toLowerCase() + ".png"); this.group = group; } @@ -50,4 +52,8 @@ public enum Trait { public TraitGroup getGroup() { return group; } + + public Identifier getSprite() { + return sprite; + } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java index 9bb82e3b..fc9fed54 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java @@ -12,6 +12,8 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.util.NbtSerialisable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -66,6 +68,7 @@ public class TraitDiscovery implements NbtSerialisable { return items.getOrDefault(Registry.ITEM.getId(item), SpellTraits.EMPTY); } + @Environment(EnvType.CLIENT) public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip) { getKnownTraits(stack.getItem()).appendTooltip(tooltip); } diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/ItemTraitsTooltipRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/gui/ItemTraitsTooltipRenderer.java new file mode 100644 index 00000000..f56e6fb4 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/ItemTraitsTooltipRenderer.java @@ -0,0 +1,91 @@ +package com.minelittlepony.unicopia.client.gui; + +import java.util.Map.Entry; + +import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; +import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.tooltip.TooltipComponent; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.texture.TextureManager; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.BaseText; +import net.minecraft.text.CharacterVisitor; +import net.minecraft.text.OrderedText; + +public class ItemTraitsTooltipRenderer extends BaseText implements OrderedText, TooltipComponent { + + private final SpellTraits traits; + + public ItemTraitsTooltipRenderer(SpellTraits traits) { + this.traits = traits; + } + + @Override + public int getHeight() { + return getRows() * 8 + 2 + 4; + } + + @Override + public int getWidth(TextRenderer textRenderer) { + return getColumns() * 8 + 2; + } + + private int getColumns() { + return Math.max(2, (int)Math.ceil(Math.sqrt(traits.entries().size() + 1))); + } + + private int getRows() { + return (int)Math.ceil((traits.entries().size() + 1) / getColumns()); + } + + @Override + public void drawItems(TextRenderer textRenderer, int x, int y, MatrixStack matrices, ItemRenderer itemRenderer, int z, TextureManager textureManager) { + + int columns = getColumns(); + + var entries = traits.stream().toList(); + + for (int i = 0; i < entries.size(); i++) { + int xx = x + (i % columns); + int yy = y + (i / columns); + Entry entry = entries.get(i); + + RenderSystem.setShaderTexture(0, entry.getKey().getSprite()); + DrawableHelper.drawTexture(matrices, xx, yy, 1, 0, 0, 8, 8, 8, 8); + + String string = String.valueOf(entry.getValue()); + matrices.push(); + + xx += 19 - 2 - textRenderer.getWidth(string); + yy += 6 + 3; + + matrices.translate(xx, yy, itemRenderer.zOffset + 200.0F); + matrices.scale(0.5F, 0.5F, 1); + VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); + textRenderer.draw(string, 0, 0, 16777215, true, matrices.peek().getModel(), immediate, false, 0, 15728880); + immediate.draw(); + matrices.pop(); + } + } + + @Override + public boolean accept(CharacterVisitor visitor) { + return false; + } + + @Override + public OrderedText asOrderedText() { + return this; + } + + @Override + public BaseText copy() { + return new ItemTraitsTooltipRenderer(traits); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinTooltipComponent.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinTooltipComponent.java new file mode 100644 index 00000000..0bb60bc4 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinTooltipComponent.java @@ -0,0 +1,19 @@ +package com.minelittlepony.unicopia.mixin.client; + +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 net.minecraft.client.gui.tooltip.TooltipComponent; +import net.minecraft.text.OrderedText; + +@Mixin(TooltipComponent.class) +interface MixinTooltipComponent { + @Inject(method = "of", at = @At("HEAD"), cancellable = true) + private static void onOf(OrderedText text, CallbackInfoReturnable info) { + if (text instanceof TooltipComponent) { + info.setReturnValue((TooltipComponent)text); + } + } +} diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/air.png b/src/main/resources/assets/unicopia/textures/gui/trait/air.png new file mode 100644 index 00000000..670f77b4 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/air.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/blood.png b/src/main/resources/assets/unicopia/textures/gui/trait/blood.png new file mode 100644 index 00000000..ece03575 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/blood.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/chaos.png b/src/main/resources/assets/unicopia/textures/gui/trait/chaos.png new file mode 100644 index 00000000..474e79f2 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/chaos.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/darkness.png b/src/main/resources/assets/unicopia/textures/gui/trait/darkness.png new file mode 100644 index 00000000..27637787 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/darkness.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/earth.png b/src/main/resources/assets/unicopia/textures/gui/trait/earth.png new file mode 100644 index 00000000..6db11e4a Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/earth.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/famine.png b/src/main/resources/assets/unicopia/textures/gui/trait/famine.png new file mode 100644 index 00000000..0131d75d Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/famine.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/fire.png b/src/main/resources/assets/unicopia/textures/gui/trait/fire.png new file mode 100644 index 00000000..1be5c4e6 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/fire.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/focus.png b/src/main/resources/assets/unicopia/textures/gui/trait/focus.png new file mode 100644 index 00000000..3b3f0347 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/focus.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/generosity.png b/src/main/resources/assets/unicopia/textures/gui/trait/generosity.png new file mode 100644 index 00000000..6f56a04a Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/generosity.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/happiness.png b/src/main/resources/assets/unicopia/textures/gui/trait/happiness.png new file mode 100644 index 00000000..14c3b56a Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/happiness.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/ice.png b/src/main/resources/assets/unicopia/textures/gui/trait/ice.png new file mode 100644 index 00000000..37319841 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/ice.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/kindness.png b/src/main/resources/assets/unicopia/textures/gui/trait/kindness.png new file mode 100644 index 00000000..b461bea8 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/kindness.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/knowledge.png b/src/main/resources/assets/unicopia/textures/gui/trait/knowledge.png new file mode 100644 index 00000000..78cfa32e Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/knowledge.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/life.png b/src/main/resources/assets/unicopia/textures/gui/trait/life.png new file mode 100644 index 00000000..d48e9cc3 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/life.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/order.png b/src/main/resources/assets/unicopia/textures/gui/trait/order.png new file mode 100644 index 00000000..08c0a9fd Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/order.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/poison.png b/src/main/resources/assets/unicopia/textures/gui/trait/poison.png new file mode 100644 index 00000000..b4a654ca Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/poison.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/power.png b/src/main/resources/assets/unicopia/textures/gui/trait/power.png new file mode 100644 index 00000000..3164d425 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/power.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/rot.png b/src/main/resources/assets/unicopia/textures/gui/trait/rot.png new file mode 100644 index 00000000..9fb41f5a Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/rot.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/strength.png b/src/main/resources/assets/unicopia/textures/gui/trait/strength.png new file mode 100644 index 00000000..131d37e2 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/strength.png differ diff --git a/src/main/resources/assets/unicopia/textures/gui/trait/water.png b/src/main/resources/assets/unicopia/textures/gui/trait/water.png new file mode 100644 index 00000000..d326f0df Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/gui/trait/water.png differ diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 74a9f47b..db39ca19 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -43,6 +43,7 @@ "client.MixinKeyboardInput", "client.MixinLightmapTextureManager", "client.MixinMouse", + "client.MixinTooltipComponent", "client.MixinWorldRenderer" ], "injectors": {