diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/title/TitleElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/title/TitleElement.kt index 1e2042f2c..1580a7710 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/title/TitleElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/title/TitleElement.kt @@ -14,32 +14,88 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.title import de.bixilon.minosoft.gui.rendering.gui.elements.Element +import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments +import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments.Companion.getOffset import de.bixilon.minosoft.gui.rendering.gui.elements.text.FadingTextElement +import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import glm_.vec2.Vec2i +import java.lang.Integer.max class TitleElement(hudRenderer: HUDRenderer) : Element(hudRenderer) { - val text = FadingTextElement(hudRenderer, "", scale = 4.0f) - val subTest = FadingTextElement(hudRenderer, "") - var fadeInTime = DEFAULT_FADE_IN_TIME - var stayTime = DEFAULT_STAY_TIME - var fadeOutTime = DEFAULT_FADE_OUT_TIME + val title = FadingTextElement(hudRenderer, "", scale = 4.0f, parent = this) + val subtitle = FadingTextElement(hudRenderer, "", parent = this) + var fadeInTime = 0L + set(value) { + title.fadeInTime = value + subtitle.fadeInTime = value + field = value + } + var stayTime = 0L + set(value) { + title.stayTime = value + subtitle.stayTime = value + field = value + } + var fadeOutTime = 0L + set(value) { + title.fadeOutTime = value + subtitle.fadeOutTime = value + field = value + } + init { + fadeInTime = DEFAULT_FADE_IN_TIME + stayTime = DEFAULT_STAY_TIME + fadeOutTime = DEFAULT_FADE_OUT_TIME + } + + override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer, options: GUIVertexOptions?): Int { + val size = size + title.render(offset + Vec2i(HorizontalAlignments.CENTER.getOffset(size.x, title.size.x), 0), z, consumer, options) + subtitle.render(offset + Vec2i(HorizontalAlignments.CENTER.getOffset(size.x, subtitle.size.x), title.size.y + SUBTITLE_VERTICAL_OFFSET), z, consumer, options) + + + return TextElement.LAYERS + } + + override fun forceSilentApply() { + val size = title.size + + size.x = max(size.x, subtitle.size.x) + size.y += subtitle.size.y + + this._size = size + } + + fun show() { + title.show() + subtitle.show() + } + + fun hide() { + title.hide() + subtitle.hide() + } + + fun reset() { + title.forceHide() + subtitle.forceHide() + title.text = "" + subtitle.text = "" + + fadeInTime = DEFAULT_FADE_IN_TIME + stayTime = DEFAULT_STAY_TIME + fadeOutTime = DEFAULT_FADE_OUT_TIME + } companion object { + const val SUBTITLE_VERTICAL_OFFSET = 10 const val DEFAULT_FADE_IN_TIME = 20L * ProtocolDefinition.TICK_TIME const val DEFAULT_STAY_TIME = 60L * ProtocolDefinition.TICK_TIME const val DEFAULT_FADE_OUT_TIME = 20L * ProtocolDefinition.TICK_TIME } - - override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer, options: GUIVertexOptions?): Int { - TODO("Not yet implemented") - } - - override fun forceSilentApply() { - TODO("Not yet implemented") - } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/title/TitleHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/title/TitleHUDElement.kt index e7df45c59..c98e65db3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/title/TitleHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/title/TitleHUDElement.kt @@ -17,13 +17,50 @@ import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.gui.hud.elements.HUDBuilder import de.bixilon.minosoft.gui.rendering.gui.hud.elements.LayoutedHUDElement +import de.bixilon.minosoft.gui.rendering.util.vec.Vec2Util.EMPTY +import de.bixilon.minosoft.modding.event.events.title.* +import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker +import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.KUtil.toResourceLocation import glm_.vec2.Vec2i class TitleHUDElement(hudRenderer: HUDRenderer) : LayoutedHUDElement(hudRenderer) { override val layout: TitleElement = TitleElement(hudRenderer) override val layoutOffset: Vec2i - get() = TODO("Not yet implemented") + get() { + val layoutOffset = Vec2i.EMPTY + + val scaledSize = hudRenderer.scaledSize + + layoutOffset.x = (scaledSize.x - layout.size.x / 2) / 2 + layoutOffset.y = (scaledSize.y - layout.title.size.y) / 2 + + return layoutOffset + } + + override fun init() { + val connection = hudRenderer.connection + + connection.registerEvent(CallbackEventInvoker.of { + layout.reset() + }) + connection.registerEvent(CallbackEventInvoker.of { + layout.hide() + }) + connection.registerEvent(CallbackEventInvoker.of { + layout.title.text = it.title + layout.show() + }) + connection.registerEvent(CallbackEventInvoker.of { + layout.subtitle.text = it.subtitle + // layout.show() // non vanilla behavior + }) + connection.registerEvent(CallbackEventInvoker.of { + layout.fadeInTime = it.fadeInTime * ProtocolDefinition.TICK_TIME.toLong() + layout.stayTime = it.stayTime * ProtocolDefinition.TICK_TIME.toLong() + layout.fadeOutTime = it.fadeOutTime * ProtocolDefinition.TICK_TIME.toLong() + }) + } companion object : HUDBuilder {