Improve Terminal GUI network amount rendering
This commit is contained in:
parent
cbea57006a
commit
f375d157b0
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue