From cdfa529d7b2aebb1333652daf856d21cea79d622 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 5 Nov 2024 22:03:11 +0700 Subject: [PATCH] Updated gauge design, horizontal matter gauge, added missing gauges to menus --- .../mc/otm/client/render/WidgetLocation.kt | 2 +- .../render/sprites/AbstractMatterySprite.kt | 37 +++++-- .../mc/otm/client/screen/MatteryScreen.kt | 5 +- .../matter/MatterCapacitorBankScreen.kt | 2 +- .../screen/tech/BlackHoleGeneratorScreen.kt | 21 ++-- .../client/screen/tech/EnergyHatchScreen.kt | 29 ++--- .../client/screen/tech/MatterHatchScreen.kt | 25 +++-- .../widget/HorizontalMatterGaugePanel.kt | 101 ++++++++++++++++++ .../widget/HorizontalPowerGaugePanel.kt | 1 - .../client/screen/widget/MatterGaugePanel.kt | 28 ++--- .../client/screen/widget/PowerGaugePanel.kt | 15 +-- .../dbotthepony/mc/otm/compat/jei/Gauges.kt | 1 - .../otm/compat/jei/MicrowaveRecipeCategory.kt | 2 - .../compat/jei/PlatePressRecipeCategory.kt | 2 - .../textures/gui/player_bars.png | Bin 234 -> 657 bytes .../textures/gui/player_bars.xcf | Bin 0 -> 2700 bytes .../gui/widgets/horizontal_gauges.png | Bin 326 -> 1912 bytes .../gui/widgets/horizontal_gauges.xcf | Bin 0 -> 15629 bytes .../textures/gui/widgets/vertical_gauges.png | Bin 887 -> 1772 bytes .../textures/gui/widgets/vertical_gauges.xcf | Bin 0 -> 9575 bytes 20 files changed, 210 insertions(+), 61 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalMatterGaugePanel.kt create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/player_bars.xcf create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/horizontal_gauges.xcf create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/vertical_gauges.xcf diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt index 17a21e0be..de5df4aeb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt @@ -17,7 +17,7 @@ object WidgetLocation { val CHECKBOX = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/checkbox.png"), 30f, 60f) val PROGRESS_ARROWS = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/progress_arrows.png"), 22f, 31f) - val HORIZONTAL_GAUGES = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/horizontal_gauges.png"), 96f, 54f) + val HORIZONTAL_GAUGES = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/horizontal_gauges.png"), 96f, 108f) val VERTICAL_GAUGES = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/vertical_gauges.png"), 90f, 48f) val REDSTONE_CONTROLS = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/redstone.png"), 54f, 18f) val SIDE_CONTROLS = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/side_controls.png"), 144f, 72f) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/AbstractMatterySprite.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/AbstractMatterySprite.kt index 3837d5ea6..7ea13e8be 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/AbstractMatterySprite.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/sprites/AbstractMatterySprite.kt @@ -90,12 +90,35 @@ sealed class AbstractMatterySprite : IGUIRenderable, IUVCoords { width: Float = this.width, height: Float = this.height, winding: UVWindingOrder = this.winding, - color: RGBAColor = RGBAColor.WHITE + color: RGBAColor = RGBAColor.WHITE, + topDown: Boolean = true, + leftRight: Boolean = true, ) { - val u1 = u0 + linearInterpolation(width / this.width, 0f, u1 - u0) - val v1 = v0 + linearInterpolation(height / this.height, 0f, v1 - v0) + val u0: Float + val v0: Float + val u1: Float + val v1: Float - val winded = winding.translate(u0, v0, u1.coerceIn(0f, 1f), v1.coerceIn(0f, 1f)) + val diffV = linearInterpolation((height / this.height).coerceIn(0f, 1f), 0f, this.v1 - this.v0) + val diffU = linearInterpolation((width / this.width).coerceIn(0f, 1f), 0f, this.u1 - this.u0) + + if (topDown) { + v0 = this.v0 + v1 = this.v0 + diffV + } else { + v0 = this.v1 - diffV + v1 = this.v1 + } + + if (leftRight) { + u0 = this.u0 + u1 = this.u0 + diffU + } else { + u0 = this.u1 - diffU + u1 = this.u1 + } + + val winded = winding.translate(u0, v0, u1, v1) renderTexturedRect( stack.last().pose(), @@ -113,8 +136,10 @@ sealed class AbstractMatterySprite : IGUIRenderable, IUVCoords { width: Float = this.width, height: Float = this.height, winding: UVWindingOrder = this.winding, - color: RGBAColor = RGBAColor.WHITE - ) = renderPartial(graphics.pose, x, y, width, height, winding, color) + color: RGBAColor = RGBAColor.WHITE, + topDown: Boolean = true, + leftRight: Boolean = true, + ) = renderPartial(graphics.pose, x, y, width, height, winding, color, topDown, leftRight) protected fun uploadOnto( pose: PoseStack, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt index ee5bb1ad5..ed499337f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt @@ -58,6 +58,7 @@ import kotlin.collections.List import kotlin.collections.MutableSet import kotlin.collections.isNotEmpty import kotlin.collections.withIndex +import kotlin.math.roundToInt /** * This class encapsulate most of logic for handling EditablePanel and it's children. @@ -493,12 +494,12 @@ abstract class MatteryScreen(menu: T, inventory: Inventory, tit } if (mainFrame != null) { - mainFrame.setPos(width / 2 - (mainFrame.width + mainFrame.dockMargin.horizontal) / 2, top.toFloat() + mainFrame.dockMargin.top) + mainFrame.setPos((width / 2 - (mainFrame.width + mainFrame.dockMargin.horizontal) / 2).roundToInt().toFloat(), (top.toFloat() + mainFrame.dockMargin.top).roundToInt().toFloat()) top += (mainFrame.height + mainFrame.dockMargin.bottom).toInt() } if (inventoryFrame != null) { - inventoryFrame.setPos(width / 2 - (inventoryFrame.width + inventoryFrame.dockMargin.horizontal) / 2, top.toFloat() + inventoryFrame.dockMargin.top) + inventoryFrame.setPos((width / 2 - (inventoryFrame.width + inventoryFrame.dockMargin.horizontal) / 2).roundToInt().toFloat(), (top.toFloat() + inventoryFrame.dockMargin.top).roundToInt().toFloat()) top += (inventoryFrame.height + inventoryFrame.dockMargin.bottom).toInt() } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterCapacitorBankScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterCapacitorBankScreen.kt index 0cfb538d2..ce9a0079e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterCapacitorBankScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterCapacitorBankScreen.kt @@ -15,7 +15,7 @@ class MatterCapacitorBankScreen(p_97741_: MatterCapacitorBankMenu, p_97742_: Inv val frame = super.makeMainFrame()!! val m = MatterGaugePanel(this, frame, menu.matterGauge, LEFT_MARGIN, GAUGE_TOP_WITHOUT_SLOT) - MatterGaugePanel(this, frame, menu.totalMatterGauge, LEFT_MARGIN + m.width, GAUGE_TOP_WITHOUT_SLOT) + MatterGaugePanel(this, frame, menu.totalMatterGauge, LEFT_MARGIN + m.width + 1f, GAUGE_TOP_WITHOUT_SLOT) for (i in 0 .. 5) MatterCapacitorSlotPanel(this, frame, menu.storageSlots[i], 44f + 18 * i, 32f) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/BlackHoleGeneratorScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/BlackHoleGeneratorScreen.kt index 2694b7cff..04fad457e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/BlackHoleGeneratorScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/BlackHoleGeneratorScreen.kt @@ -2,11 +2,14 @@ package ru.dbotthepony.mc.otm.client.screen.tech import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory +import ru.dbotthepony.mc.otm.client.render.RenderGravity import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.Dock import ru.dbotthepony.mc.otm.client.screen.panels.DockResizeMode +import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel import ru.dbotthepony.mc.otm.client.screen.widget.ProfiledMatterGaugePanel +import ru.dbotthepony.mc.otm.client.screen.widget.ProfiledPowerGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.TallHorizontalProfiledPowerGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.WideProfiledPowerGaugePanel import ru.dbotthepony.mc.otm.menu.tech.BlackHoleGeneratorMenu @@ -14,14 +17,20 @@ import ru.dbotthepony.mc.otm.menu.tech.CobblerMenu class BlackHoleGeneratorScreen(menu: BlackHoleGeneratorMenu, inventory: Inventory, title: Component) : MatteryScreen(menu, inventory, title) { override fun makeMainFrame(): FramePanel> { - val frame = super.makeMainFrame()!! + val frame = FramePanel.padded(this, 200f, 60f, title) - val energy = TallHorizontalProfiledPowerGaugePanel(this, frame, menu.energy) - //val matter = ProfiledMatterGaugePanel + val left = EditablePanel(this, frame) - energy.dock = Dock.TOP - energy.dockTop = 4f - energy.dockResize = DockResizeMode.NONE + val energy = ProfiledPowerGaugePanel(this, frame, menu.energy) + val matter = ProfiledMatterGaugePanel(this, frame, menu.matter) + + left.width = energy.width + matter.width + 1f + energy.parent = left + matter.parent = left + matter.dockLeft = 1f + left.dock = Dock.LEFT + energy.dock = Dock.LEFT + matter.dock = Dock.LEFT return frame } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EnergyHatchScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EnergyHatchScreen.kt index f5af14ae3..fa893117e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EnergyHatchScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/EnergyHatchScreen.kt @@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.client.screen.tech import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.Dock import ru.dbotthepony.mc.otm.client.screen.panels.DockResizeMode @@ -11,34 +10,40 @@ import ru.dbotthepony.mc.otm.client.screen.panels.SpritePanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.BatterySlotPanel -import ru.dbotthepony.mc.otm.client.screen.widget.HorizontalProfiledPowerGaugePanel +import ru.dbotthepony.mc.otm.client.screen.widget.HorizontalPowerGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel +import ru.dbotthepony.mc.otm.client.screen.widget.TallHorizontalProfiledPowerGaugePanel import ru.dbotthepony.mc.otm.menu.tech.EnergyHatchMenu class EnergyHatchScreen(menu: EnergyHatchMenu, inventory: Inventory, title: Component) : MatteryScreen(menu, inventory, title) { override fun makeMainFrame(): FramePanel> { - val frame = FramePanel.padded(this, null, INVENTORY_FRAME_WIDTH, AbstractSlotPanel.SIZE, getTitle()) + val frame = FramePanel.padded(this, null, ProgressGaugePanel.GAUGE_BACKGROUND.width + 10f + HorizontalPowerGaugePanel.GAUGE_BACKGROUND_TALL.width + menu.inputSlots.size * AbstractSlotPanel.SIZE, AbstractSlotPanel.SIZE, getTitle()) frame.makeCloseButton() frame.onClose { onClose() } - for (slot in menu.inputSlots) { + val slots = menu.inputSlots.map { slot -> val panel = BatterySlotPanel(this, frame, slot) panel.dock = Dock.LEFT panel.dockResize = DockResizeMode.NONE + panel } + val gauge = TallHorizontalProfiledPowerGaugePanel(this, frame, menu.gauge) + gauge.dock = Dock.RIGHT + val arrow = SpritePanel(this, frame, ProgressGaugePanel.GAUGE_BACKGROUND) - arrow.dockLeft = 20f - arrow.dockRight = 2f - arrow.dock = Dock.LEFT + arrow.dock = Dock.RIGHT + arrow.dockRight = 5f + arrow.dockLeft = 5f + arrow.dockBottom = 1f arrow.dockResize = DockResizeMode.NONE - if (!menu.isInput) - arrow.winding = UVWindingOrder.FLOP - - val gauge = HorizontalProfiledPowerGaugePanel(this, frame, menu.gauge) - gauge.dock = Dock.RIGHT + if (!menu.isInput) { + slots.forEach { it.dock = Dock.RIGHT } + arrow.dock = Dock.LEFT + gauge.dock = Dock.LEFT + } DeviceControls(this, frame, redstoneConfig = menu.redstone) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/MatterHatchScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/MatterHatchScreen.kt index 9811a2e03..7b5a8bfa6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/MatterHatchScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/MatterHatchScreen.kt @@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.client.screen.tech import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.Dock import ru.dbotthepony.mc.otm.client.screen.panels.DockResizeMode @@ -11,30 +10,40 @@ import ru.dbotthepony.mc.otm.client.screen.panels.SpritePanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.MatterCapacitorSlotPanel +import ru.dbotthepony.mc.otm.client.screen.widget.HorizontalMatterGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel +import ru.dbotthepony.mc.otm.client.screen.widget.TallHorizontalProfiledMatterGaugePanel import ru.dbotthepony.mc.otm.menu.tech.MatterHatchMenu class MatterHatchScreen(menu: MatterHatchMenu, inventory: Inventory, title: Component) : MatteryScreen(menu, inventory, title) { override fun makeMainFrame(): FramePanel> { - val frame = FramePanel.padded(this, null, INVENTORY_FRAME_WIDTH, AbstractSlotPanel.SIZE, getTitle()) + val frame = FramePanel.padded(this, null, ProgressGaugePanel.GAUGE_BACKGROUND.width + 10f + HorizontalMatterGaugePanel.GAUGE_BACKGROUND_TALL.width + menu.inputSlots.size * AbstractSlotPanel.SIZE, AbstractSlotPanel.SIZE, getTitle()) frame.makeCloseButton() frame.onClose { onClose() } - for (slot in menu.inputSlots) { + val slots = menu.inputSlots.map { slot -> val panel = MatterCapacitorSlotPanel(this, frame, slot) panel.dock = Dock.LEFT panel.dockResize = DockResizeMode.NONE + panel } + val gauge = TallHorizontalProfiledMatterGaugePanel(this, frame, menu.gauge) + gauge.dock = Dock.RIGHT + val arrow = SpritePanel(this, frame, ProgressGaugePanel.GAUGE_BACKGROUND) - arrow.dockLeft = 20f - arrow.dockRight = 2f - arrow.dock = Dock.LEFT + arrow.dock = Dock.RIGHT + arrow.dockRight = 5f + arrow.dockLeft = 5f + arrow.dockBottom = 1f arrow.dockResize = DockResizeMode.NONE - if (!menu.isInput) - arrow.winding = UVWindingOrder.FLOP + if (!menu.isInput) { + slots.forEach { it.dock = Dock.RIGHT } + arrow.dock = Dock.LEFT + gauge.dock = Dock.LEFT + } DeviceControls(this, frame, redstoneConfig = menu.redstone) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalMatterGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalMatterGaugePanel.kt new file mode 100644 index 000000000..3b4e33c75 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalMatterGaugePanel.kt @@ -0,0 +1,101 @@ +package ru.dbotthepony.mc.otm.client.screen.widget + +import net.minecraft.client.gui.screens.Screen +import ru.dbotthepony.mc.otm.client.render.MGUIGraphics +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder +import ru.dbotthepony.mc.otm.client.render.WidgetLocation +import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel +import ru.dbotthepony.mc.otm.menu.widget.IProfiledLevelGaugeWidget +import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget + +private fun MatterGaugePanel<*>.doRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float, flop: Boolean) { + if (height >= 18f) { + if (flop) { + HorizontalMatterGaugePanel.GAUGE_BACKGROUND_TALL.render(graphics, canvasHeight = height, canvasWidth = this.width, winding = UVWindingOrder.U1_V0_U0_V1) + val width = this.width * widget.percentage + HorizontalMatterGaugePanel.GAUGE_FOREGROUND_TALL.renderPartial(graphics, x = this.width - width, height = height, width = width, winding = UVWindingOrder.U1_V0_U0_V1) + } else { + HorizontalMatterGaugePanel.GAUGE_BACKGROUND_TALL.render(graphics, canvasHeight = height, canvasWidth = this.width) + val width = this.width * widget.percentage + HorizontalMatterGaugePanel.GAUGE_FOREGROUND_TALL.renderPartial(graphics, height = height, width = width) + } + } else { + if (flop) { + HorizontalMatterGaugePanel.GAUGE_BACKGROUND.render(graphics, canvasHeight = height, canvasWidth = this.width, winding = UVWindingOrder.U1_V0_U0_V1) + val width = this.width * widget.percentage + HorizontalMatterGaugePanel.GAUGE_FOREGROUND.renderPartial(graphics, x = this.width - width, height = height, width = width, winding = UVWindingOrder.U1_V0_U0_V1) + } else { + HorizontalMatterGaugePanel.GAUGE_BACKGROUND.render(graphics, canvasHeight = height, canvasWidth = this.width) + val width = this.width * widget.percentage + HorizontalMatterGaugePanel.GAUGE_FOREGROUND.renderPartial(graphics, height = height, width = width) + } + } +} + +open class HorizontalMatterGaugePanel( + screen: S, + parent: EditablePanel<*>? = null, + widget: LevelGaugeWidget, + x: Float = 0f, + y: Float = 0f, + width: Float = GAUGE_BACKGROUND.width, + height: Float = GAUGE_BACKGROUND.height +) : MatterGaugePanel(screen, parent, widget, x, y, width, height) { + var flop = false + + override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { + doRender(graphics, mouseX, mouseY, partialTick, flop) + } + + companion object { + val GAUGE_BACKGROUND_TALL = WidgetLocation.HORIZONTAL_GAUGES.sprite(width = 96f, height = 18f, y = 54f) + val GAUGE_FOREGROUND_TALL = WidgetLocation.HORIZONTAL_GAUGES.sprite(y = 18f + 54f, width = 96f, height = 18f) + + val GAUGE_BACKGROUND = WidgetLocation.HORIZONTAL_GAUGES.sprite(y = 36f + 54f, width = 96f, height = 9f) + val GAUGE_FOREGROUND = WidgetLocation.HORIZONTAL_GAUGES.sprite(y = 45f + 54f, width = 96f, height = 9f) + } +} + +/** + * Shortcut to [HorizontalMatterGaugePanel] with doubled height + */ +@Suppress("FunctionName") +fun TallHorizontalMatterGaugePanel( + screen: S, + parent: EditablePanel<*>? = null, + widget: LevelGaugeWidget, + x: Float = 0f, + y: Float = 0f, + width: Float = HorizontalMatterGaugePanel.GAUGE_BACKGROUND_TALL.width, + height: Float = HorizontalMatterGaugePanel.GAUGE_BACKGROUND_TALL.height +) = HorizontalMatterGaugePanel(screen, parent, widget, x, y, width, height) + +open class HorizontalProfiledMatterGaugePanel( + screen: S, + parent: EditablePanel<*>? = null, + widget: IProfiledLevelGaugeWidget, + x: Float = 0f, + y: Float = 0f, + width: Float = HorizontalMatterGaugePanel.GAUGE_BACKGROUND.width, + height: Float = HorizontalMatterGaugePanel.GAUGE_BACKGROUND.height +) : ProfiledMatterGaugePanel(screen, parent, widget, x, y, width, height) { + var flop = false + + override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { + doRender(graphics, mouseX, mouseY, partialTick, flop) + } +} + +/** + * Shortcut to [HorizontalProfiledPowerGaugePanel] with doubled height + */ +@Suppress("FunctionName") +fun TallHorizontalProfiledMatterGaugePanel( + screen: S, + parent: EditablePanel<*>? = null, + widget: IProfiledLevelGaugeWidget, + x: Float = 0f, + y: Float = 0f, + width: Float = HorizontalMatterGaugePanel.GAUGE_BACKGROUND_TALL.width, + height: Float = HorizontalMatterGaugePanel.GAUGE_BACKGROUND_TALL.height +) = HorizontalProfiledMatterGaugePanel(screen, parent, widget, x, y, width, height) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt index cc5919e01..ba74f7558 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt @@ -7,7 +7,6 @@ import ru.dbotthepony.mc.otm.client.render.WidgetLocation import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.menu.widget.IProfiledLevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget -import ru.dbotthepony.mc.otm.menu.widget.ProfiledLevelGaugeWidget private fun PowerGaugePanel<*>.doRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float, flop: Boolean) { if (height >= 18f) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt index cdaa08d57..8fbf9b855 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt @@ -12,14 +12,17 @@ import net.minecraft.world.inventory.tooltip.TooltipComponent import org.lwjgl.opengl.GL11 import ru.dbotthepony.mc.otm.client.ShiftPressedCond import ru.dbotthepony.mc.otm.client.render.MGUIGraphics +import ru.dbotthepony.mc.otm.client.render.RenderGravity import ru.dbotthepony.mc.otm.client.render.WidgetLocation import ru.dbotthepony.mc.otm.client.render.tesselator import ru.dbotthepony.mc.otm.client.render.uv import ru.dbotthepony.mc.otm.client.render.vertex +import ru.dbotthepony.mc.otm.client.screen.panels.DockResizeMode import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.util.formatHistory import ru.dbotthepony.mc.otm.core.util.formatMatterLevel +import ru.dbotthepony.mc.otm.menu.widget.IProfiledLevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.ProfiledLevelGaugeWidget import ru.dbotthepony.mc.otm.nanoTime @@ -28,15 +31,19 @@ import kotlin.math.cos import kotlin.math.pow import kotlin.math.sin -open class MatterGaugePanel @JvmOverloads constructor( +open class MatterGaugePanel( screen: S, parent: EditablePanel<*>? = null, val widget: LevelGaugeWidget, x: Float = 0f, - y: Float = 0f -): EditablePanel(screen, parent, x, y, width = GAUGE_BACKGROUND.width, height = GAUGE_BACKGROUND.height) { + y: Float = 0f, + width: Float = GAUGE_BACKGROUND.width, + height: Float = GAUGE_BACKGROUND.height +): EditablePanel(screen, parent, x, y, width = width, height = height) { init { scissor = true + dockGravity = RenderGravity.TOP_CENTER + dockResize = DockResizeMode.NONE } private var wavesStrength = 0.5f @@ -47,12 +54,7 @@ open class MatterGaugePanel @JvmOverloads constructor( protected open fun makeTooltip(): MutableList> { return mutableListOf( - Either.left( - TranslatableComponent( - "otm.gui.matter.percentage_level", - String.format("%.2f", widget.percentage * 100.0) - ) - ), + Either.left(TranslatableComponent("otm.gui.matter.percentage_level", String.format("%.2f", widget.percentage * 100.0))), Either.left(formatMatterLevel(widget.level, widget.maxLevel, formatAsReadable = ShiftPressedCond)) ) } @@ -136,10 +138,12 @@ open class MatterGaugePanel @JvmOverloads constructor( open class ProfiledMatterGaugePanel( screen: S, parent: EditablePanel<*>? = null, - val profiledWidget: ProfiledLevelGaugeWidget<*>, + val profiledWidget: IProfiledLevelGaugeWidget, x: Float = 0f, - y: Float = 0f -): MatterGaugePanel(screen, parent, profiledWidget.gauge, x, y) { + y: Float = 0f, + width: Float = GAUGE_BACKGROUND.width, + height: Float = GAUGE_BACKGROUND.height +): MatterGaugePanel(screen, parent, profiledWidget.gauge, x, y, width, height) { override fun makeTooltip(): MutableList> { return super.makeTooltip().also { formatHistory( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt index 817e2a8d0..62d314624 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt @@ -2,19 +2,18 @@ package ru.dbotthepony.mc.otm.client.screen.widget import com.mojang.datafixers.util.Either import net.minecraft.client.gui.screens.Screen -import net.minecraft.network.chat.Component import net.minecraft.network.chat.FormattedText import net.minecraft.world.inventory.tooltip.TooltipComponent import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.ShiftPressedCond import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.render.* +import ru.dbotthepony.mc.otm.client.screen.panels.DockResizeMode import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.core.util.formatHistory import ru.dbotthepony.mc.otm.core.util.formatPowerLevel import ru.dbotthepony.mc.otm.menu.widget.IProfiledLevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget -import ru.dbotthepony.mc.otm.menu.widget.ProfiledLevelGaugeWidget open class PowerGaugePanel( screen: S, @@ -26,7 +25,9 @@ open class PowerGaugePanel( height: Float = GAUGE_BACKGROUND.height ) : EditablePanel(screen, parent, x, y, width, height) { init { - scissor = true + // scissor = true + dockGravity = RenderGravity.TOP_CENTER + dockResize = DockResizeMode.NONE } protected open fun makeTooltip(): MutableList> { @@ -45,16 +46,16 @@ open class PowerGaugePanel( graphics, y = this.height - height, height = height, - width = width, - winding = UVWindingOrder.U0_V1_U1_V0) + topDown = false, + width = width,) } else { GAUGE_BACKGROUND.render(graphics, canvasWidth = width, canvasHeight = this.height) GAUGE_FOREGROUND.renderPartial( graphics, y = this.height - height, height = height, - width = width, - winding = UVWindingOrder.U0_V1_U1_V0) + topDown = false, + width = width) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/Gauges.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/Gauges.kt index fe82ac6a7..8adf016ca 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/Gauges.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/Gauges.kt @@ -1,7 +1,6 @@ package ru.dbotthepony.mc.otm.compat.jei import mezz.jei.api.gui.builder.ITooltipBuilder -import net.minecraft.network.chat.Component import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.ShiftPressedCond import ru.dbotthepony.mc.otm.client.screen.widget.MatterGaugePanel diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/MicrowaveRecipeCategory.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/MicrowaveRecipeCategory.kt index 6cd4b88c7..3f85185ac 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/MicrowaveRecipeCategory.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/MicrowaveRecipeCategory.kt @@ -9,12 +9,10 @@ import mezz.jei.api.recipe.RecipeType import mezz.jei.api.recipe.category.IRecipeCategory import net.minecraft.client.gui.GuiGraphics import net.minecraft.network.chat.Component -import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.Ingredient import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.client.render.MGUIGraphics -import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.render.RenderGravity import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/PlatePressRecipeCategory.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/PlatePressRecipeCategory.kt index 32613840e..21a57cb2d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/PlatePressRecipeCategory.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/jei/PlatePressRecipeCategory.kt @@ -9,12 +9,10 @@ import mezz.jei.api.recipe.RecipeType import mezz.jei.api.recipe.category.IRecipeCategory import net.minecraft.client.gui.GuiGraphics import net.minecraft.network.chat.Component -import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.Ingredient import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.client.render.MGUIGraphics -import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.render.RenderGravity import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/player_bars.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/player_bars.png index bd9894af7c56741fe1fee286de417e4771bd8c1b..f5a48258f2b96f72cc79143537f243cbd7152099 100644 GIT binary patch delta 644 zcmV-~0(<@H0g(le7=Hu<00003PRn-y00D(*LqkwWLqi~Na&Km7Y-IodD3N`UJxIeq z7>3`b7DcNLb`WvMP{qM6D&knGSOg2Dt@0^V?f}=wm-&z?p>f+x9#s^+iso!{%7DyYx}DWVD6LjdRq%00fXDX#dTYg_khbC zVE9Rw49SuFw1h$dct4|W$^k>SK<}E{x7ImMAAk(?YJd3#I5-5xifaA}0dlFxlrsMS000|MOjJc~+OhxON&naY0000eC@8VxT%p+=5r8m9C9=4JN&Y>RdilTBzi6cF#R|d7{1xa)wIRM!W-)Hv9YFa#3la elFvCD_xu4jCtUCV28QYY00001`k^R delta 199 zcmbQp`igOagdPVo0|UdceQISuim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rM1W6- z>*T$R67?TeAJzs6aFhi31^BY|R^1s;*b3=DkxL735kHCP2G=mdKI;Vst0HUNuZ2$lO diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/player_bars.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/player_bars.xcf new file mode 100644 index 0000000000000000000000000000000000000000..8455c0916120e68f54bb0c6ec7ac8c2a3dab2d83 GIT binary patch literal 2700 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 F0RTa7pGp7# diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/vertical_gauges.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/vertical_gauges.xcf new file mode 100644 index 0000000000000000000000000000000000000000..93ae3d2084d464fafb9c4ce07435ecd3223e9645 GIT binary patch literal 9575 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 Bdf5N~ literal 0 HcmV?d00001