From f375d157b070dfc148229af22c4310b10f147e58 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Thu, 18 Mar 2021 22:30:00 -0400 Subject: [PATCH] Improve Terminal GUI network amount rendering --- .../mixin/client/MixinHandledScreen.java | 29 +++++++++++++- .../phycon/block/terminal/TerminalScreen.kt | 40 +++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/shadowfacts/phycon/mixin/client/MixinHandledScreen.java b/src/main/java/net/shadowfacts/phycon/mixin/client/MixinHandledScreen.java index 76f32fd..6aa7bce 100644 --- a/src/main/java/net/shadowfacts/phycon/mixin/client/MixinHandledScreen.java +++ b/src/main/java/net/shadowfacts/phycon/mixin/client/MixinHandledScreen.java @@ -1,12 +1,18 @@ package net.shadowfacts.phycon.mixin.client; +import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; import net.shadowfacts.phycon.block.terminal.TerminalScreen; +import net.shadowfacts.phycon.block.terminal.TerminalScreenHandler; +import org.jetbrains.annotations.Nullable; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; /** @@ -15,12 +21,31 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(HandledScreen.class) public class MixinHandledScreen { - @Inject(method = "drawSlot(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/screen/slot/Slot;)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;enableDepthTest()V")) - private void drawSlot(MatrixStack matrixStack, Slot slot, CallbackInfo ci) { + @Inject( + method = "drawSlot(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/screen/slot/Slot;)V", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;enableDepthTest()V") + ) + private void drawSlotUnderlay(MatrixStack matrixStack, Slot slot, CallbackInfo ci) { if ((Object)this instanceof TerminalScreen) { TerminalScreen self = (TerminalScreen)(Object)this; self.drawSlotUnderlay(matrixStack, slot); } } + @Redirect( + method = "drawSlot(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/screen/slot/Slot;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/item/ItemRenderer;renderGuiItemOverlay(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V") + ) + private void drawSlotAmount(ItemRenderer itemRenderer, TextRenderer textRenderer, ItemStack stack, int x, int y, @Nullable String countLabel, MatrixStack matrixStack, Slot slot) { + if ((Object)this instanceof TerminalScreen) { + TerminalScreen self = (TerminalScreen)(Object)this; + TerminalScreenHandler handler = self.getScreenHandler(); + if (slot.id < handler.getNetworkSlotsEnd() && stack.getCount() > 1) { + self.drawNetworkSlotAmount(stack, x, y, slot, matrixStack); + return; + } + } + itemRenderer.renderGuiItemOverlay(textRenderer, stack, x, y, countLabel); + } + } diff --git a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/TerminalScreen.kt b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/TerminalScreen.kt index 1428386..b361340 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/block/terminal/TerminalScreen.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/block/terminal/TerminalScreen.kt @@ -8,6 +8,8 @@ import net.minecraft.client.gui.widget.AbstractButtonWidget import net.minecraft.client.gui.widget.AbstractPressableButtonWidget import net.minecraft.client.gui.widget.ButtonWidget import net.minecraft.client.gui.widget.TextFieldWidget +import net.minecraft.client.render.Tessellator +import net.minecraft.client.render.VertexConsumerProvider import net.minecraft.client.util.math.MatrixStack import net.minecraft.entity.player.PlayerInventory import net.minecraft.item.ItemStack @@ -26,6 +28,8 @@ import net.shadowfacts.phycon.util.next import net.shadowfacts.phycon.util.prev import org.lwjgl.glfw.GLFW import java.lang.NumberFormatException +import java.math.RoundingMode +import java.text.DecimalFormat import kotlin.math.ceil import kotlin.math.floor import kotlin.math.min @@ -259,6 +263,42 @@ class TerminalScreen(handler: TerminalScreenHandler, playerInv: PlayerInventory, DrawableHelper.fill(matrixStack, slot.x, slot.y, slot.x + 16, slot.y + 16, color.toInt()) } + private val DECIMAL_FORMAT = DecimalFormat("#.#").apply { roundingMode = RoundingMode.HALF_UP } + private val FORMAT = DecimalFormat("##").apply { roundingMode = RoundingMode.HALF_UP } + + fun drawNetworkSlotAmount(stack: ItemStack, x: Int, y: Int, slot: Slot, matrixStack: MatrixStack) { + val amount = stack.count + val s = when { + amount < 1_000 -> amount.toString() + amount < 1_000_000 -> { + val format = if (amount < 10_000) DECIMAL_FORMAT else FORMAT + format.format(amount / 1_000.0) + "K" + } + amount < 1_000_000_000 -> { + val format = if (amount < 10_000_000) DECIMAL_FORMAT else FORMAT + format.format(amount / 1_000_000.0) + "M" + } + else -> { + DECIMAL_FORMAT.format(amount / 1000000000.0).toString() + "B" + } + } + + // draw damage bar + // empty string for label because vanilla renders the count behind the damage bar + itemRenderer.renderGuiItemOverlay(textRenderer, stack, x, y, "") + + matrixStack.push() + matrixStack.translate(x.toDouble(), y.toDouble(), itemRenderer.zOffset + 200.0) + val scale = 2 / 3f + matrixStack.scale(scale, scale, 1.0f) + val immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().buffer) + val textX = (1 / scale * 18) - textRenderer.getWidth(s).toFloat() - 3 + val textY = (1 / scale * 18) - 11 + textRenderer.draw(s, textX, textY, 0xffffff, true, matrixStack.peek().model, immediate, false, 0, 0xF000F0) + immediate.draw() + matrixStack.pop() + } + private fun isPointInsScrollThumb(mouseX: Double, mouseY: Double): Boolean { val x = (width - backgroundWidth) / 2 val y = (height - backgroundHeight) / 2