diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/util/ProgressElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/util/ProgressElement.kt index 45d7defad..d71919878 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/util/ProgressElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/util/ProgressElement.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * Copyright (C) 2020-2023 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -56,9 +56,11 @@ open class ProgressElement( } override fun forceSilentApply() { - val emptyAtlasElement = emptyAtlasElement ?: return - val fullAtlasElement = fullAtlasElement ?: return - progressImage = ImageElement(guiRenderer, fullAtlasElement.texture, uvStart = fullAtlasElement.uvStart, uvEnd = Vec2(interpolateLinear(progress, fullAtlasElement.uvStart.x, fullAtlasElement.uvEnd.x), fullAtlasElement.uvEnd.y), size = Vec2((fullAtlasElement.size.x * progress), emptyAtlasElement.size.y)) + val full = fullAtlasElement ?: return + + val uvEnd = Vec2(interpolateLinear(progress, full.uvStart.x, full.uvEnd.x), full.uvEnd.y) + val size = this.size + progressImage = ImageElement(guiRenderer, full.texture, uvStart = full.uvStart, uvEnd = uvEnd, size = Vec2((size.x * progress), size.y)) cacheUpToDate = false } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarElement.kt index 72254fa9a..2b47edfd3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarElement.kt @@ -208,6 +208,7 @@ class HotbarElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedEl gui.atlas.load(HotbarBaseElement.ATLAS) gui.atlas.load(HotbarProtectionElement.ATLAS) gui.atlas.load(HotbarHungerElement.ATLAS) + gui.atlas.load(HotbarExperienceBarElement.ATLAS) } override fun build(guiRenderer: GUIRenderer): LayoutedGUIElement { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarExperienceBarElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarExperienceBarElement.kt index 5aee909ce..e92b695ea 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarExperienceBarElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarExperienceBarElement.kt @@ -61,6 +61,7 @@ class HotbarExperienceBarElement(guiRenderer: GUIRenderer) : Element(guiRenderer val bars = atlasElements[barIndex] val progress = ProgressElement(guiRenderer, bars, progress) + progress.prefMaxSize = SIZE progress.render(offset, consumer, options) if (level > 0) { @@ -91,7 +92,7 @@ class HotbarExperienceBarElement(guiRenderer: GUIRenderer) : Element(guiRenderer } companion object { - private val ATLAS = minecraft("hud/hotbar/experience") + val ATLAS = minecraft("hud/hotbar/experience") private val TEXT_PROPERTIES = TextRenderProperties(HorizontalAlignments.CENTER, shadow = false) private val SIZE = Vec2(182, 5) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHungerElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHungerElement.kt index d58c23ff7..54da335b4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHungerElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHungerElement.kt @@ -68,7 +68,7 @@ class HotbarHungerElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Poll if (hungerProfile.saturationBar) { val container = when { - hungerEffect -> atlas.hungerContainer + hungerEffect -> atlas.getContainer(true) saturationLeft == 1 -> { saturationLeft -= 1 atlas.getSaturationContainer(true) @@ -79,7 +79,7 @@ class HotbarHungerElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Poll atlas.getSaturationContainer(false) } - else -> atlas.container + else -> atlas.getContainer(false) } AtlasImageElement(guiRenderer, container).render(hungerOffset, consumer, options) } @@ -134,11 +134,13 @@ class HotbarHungerElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Poll } private class HungerAtlas(val atlas: Atlas?) { - val container = atlas["container"] - val hungerContainer = atlas["container_hunger"] + private val container = arrayOf(atlas["container"], atlas["container_hunger"]) + private val saturation = arrayOf(atlas["container_saturation_half"], atlas["container_saturation_full"]) + private val hunger = arrayOf(arrayOf(atlas["full"], atlas["half"]), arrayOf(atlas["full_hunger"], atlas["half_hunger"])) - fun getHunger(half: Boolean, hunger: Boolean): AtlasElement = TODO() - fun getSaturationContainer(half: Boolean): AtlasElement = TODO() + fun getHunger(half: Boolean, hunger: Boolean): AtlasElement? = this.hunger[if (hunger) 1 else 0][if (half) 1 else 0] + fun getContainer(hunger: Boolean): AtlasElement? = container[if (hunger) 1 else 0] + fun getSaturationContainer(half: Boolean): AtlasElement? = saturation[if (half) 0 else 1] } companion object { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HeartAtlas.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HeartAtlas.kt index 809464b57..6ede7e244 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HeartAtlas.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HeartAtlas.kt @@ -13,20 +13,41 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar.health +import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.gui.rendering.gui.atlas.Atlas +import de.bixilon.minosoft.gui.rendering.gui.atlas.Atlas.Companion.get import de.bixilon.minosoft.gui.rendering.gui.atlas.AtlasElement -class HeartAtlas(val atlas: Atlas?) { - val normal = HartType() - val poisoned = HartType() - val withered = HartType() - val absorption = HartType() - val frozen = HartType() +class HeartAtlas(private val atlas: Atlas?) { + val normal = HartType("") + val poisoned = HartType("poisoned") + val withered = HartType("withered") + val absorption = HartType("absorption") + val frozen = HartType("frozen") - class HartType { - fun get(full: Boolean, hardcore: Boolean, blinking: Boolean): AtlasElement = TODO() + val container = atlas["container"] // TODO: There are multiple containers + + inner class HartType(type: String) { + val hearts = Array(2) { full -> + Array(2) { hardcore -> + Array(2) { blinking -> + val name = StringBuilder() + if (type.isNotEmpty()) { + name.append(type) + name.append('_') + } + name.append(if (full > 0) "full" else "half") + if (hardcore > 0) name.append("_hardcore") + if (blinking > 0) name.append("_blinking") + + atlas?.get(name.toString()) + } + } + } // frozen_full_hardcore_blinking + + fun get(full: Boolean, hardcore: Boolean, blinking: Boolean): AtlasElement? = this.hearts[full.toInt()][hardcore.toInt()][blinking.toInt()] } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HotbarHealthElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HotbarHealthElement.kt index d1da63d7c..8548e8826 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HotbarHealthElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HotbarHealthElement.kt @@ -24,7 +24,6 @@ import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.data.text.formatting.color.RGBColor.Companion.asColor import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer -import de.bixilon.minosoft.gui.rendering.gui.atlas.Atlas.Companion.get import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.AtlasImageElement import de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar.AbstractHotbarHealthElement @@ -36,7 +35,6 @@ import java.lang.Float.min class HotbarHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealthElement(guiRenderer), Pollable { private val atlas = HeartAtlas(guiRenderer.atlas[HeartAtlas.ATLAS]) - private val blackHeartContainer = atlas.atlas["container"] // TODO: There are multiple containers private var hardcode = false private var poison = false @@ -55,7 +53,7 @@ class HotbarHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealthElemen return super.forceRender(offset, consumer, options) } // ToDo: Damage animation, regeneration, caching, stacking - drawCanisters(offset, consumer, options, blackHeartContainer) + drawCanisters(offset, consumer, options, atlas.container) var healthLeft = totalHealth diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HotbarVehicleHealthElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HotbarVehicleHealthElement.kt index a23e2b0f1..81b7d27b3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HotbarVehicleHealthElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/HotbarVehicleHealthElement.kt @@ -32,7 +32,7 @@ import java.lang.Float.max class HotbarVehicleHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealthElement(guiRenderer), Pollable { private val atlasManager = guiRenderer.atlas - private val atlas = VehicleHeartAtlas(guiRenderer.atlas[HeartAtlas.ATLAS]) + private val atlas = guiRenderer.atlas[HeartAtlas.ATLAS]?.let { VehicleHeartAtlas(it) } private var shown = false override var totalHealth = 0.0f @@ -45,7 +45,7 @@ class HotbarVehicleHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealt if (text) { return super.forceRender(offset, consumer, options) } - drawCanisters(offset, consumer, options, atlas.getContainer(false)) + drawCanisters(offset, consumer, options, atlas?.getContainer(false)) var healthLeft = totalHealth var heart = 0 @@ -56,7 +56,7 @@ class HotbarVehicleHealthElement(guiRenderer: GUIRenderer) : AbstractHotbarHealt val halfHeart = healthLeft < 1.5f - val image = atlas.getHeart(halfHeart)?.let { AtlasImageElement(guiRenderer, it) } + val image = atlas?.getHeart(halfHeart)?.let { AtlasImageElement(guiRenderer, it) } image?.render(offset + Vec2(column, (rows - 1) - row) * HEART_SIZE, consumer, options) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/VehicleHeartAtlas.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/VehicleHeartAtlas.kt index 867f6547e..2a14354d4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/VehicleHeartAtlas.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/health/VehicleHeartAtlas.kt @@ -16,9 +16,12 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar.health import de.bixilon.minosoft.gui.rendering.gui.atlas.Atlas import de.bixilon.minosoft.gui.rendering.gui.atlas.AtlasElement -class VehicleHeartAtlas(val atlas: Atlas?) { +class VehicleHeartAtlas(atlas: Atlas) { + private val half = atlas["half_vehicle"] + private val full = atlas["full_vehicle"] + private val container = atlas["container_vehicle"] - fun getContainer(half: Boolean): AtlasElement = TODO() + fun getContainer(half: Boolean): AtlasElement? = container - fun getHeart(half: Boolean): AtlasElement = TODO() + fun getHeart(half: Boolean): AtlasElement? = if (half) this.half else this.full } diff --git a/src/main/resources/assets/minecraft/gui/atlas/hud/hotbar/experience.json b/src/main/resources/assets/minecraft/gui/atlas/hud/hotbar/experience.json index 61bb3384a..85c1dc82d 100644 --- a/src/main/resources/assets/minecraft/gui/atlas/hud/hotbar/experience.json +++ b/src/main/resources/assets/minecraft/gui/atlas/hud/hotbar/experience.json @@ -2,7 +2,8 @@ "empty": { "0": { "texture": "gui/icons", - "start": [0, 64] + "start": [0, 64], + "end": [182, 69] }, "18": { "texture": "gui/sprites/hud/experience_bar_background",