diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderUtil.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderUtil.kt index 282af9ba8..c2d0f6b1b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderUtil.kt @@ -30,7 +30,7 @@ object RenderUtil { } } - fun RenderContext.runAsync(runnable: () -> Unit) { + inline fun RenderContext.runAsync(crossinline runnable: () -> Unit) { DefaultThreadPool += SimplePoolRunnable(ThreadPool.HIGHER) { try { runnable() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/GUIRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/GUIRenderer.kt index d481c341e..4849801d4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/GUIRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/GUIRenderer.kt @@ -64,7 +64,6 @@ class GUIRenderer( gui.init() hud.init() popper.init() - dragged.init() } override fun postInit(latch: AbstractLatch) { @@ -77,7 +76,6 @@ class GUIRenderer( gui.postInit() hud.postInit() popper.postInit() - dragged.postInit() } private fun updateResolution(windowSize: Vec2 = Vec2(context.window.size), scale: Float = profile.scale, systemScale: Vec2 = context.window.systemScale) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasManager.kt index bceb74dc5..fc73d9375 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/atlas/AtlasManager.kt @@ -33,6 +33,7 @@ class AtlasManager(val context: RenderContext) { } operator fun get(atlas: ResourceLocation): Atlas? { + if (loader != null) throw IllegalStateException("Atlas is still in loading phase!") return this.atlas[atlas] } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/dragged/DraggedManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/dragged/DraggedManager.kt index 3faff033e..794d3412d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/dragged/DraggedManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/dragged/DraggedManager.kt @@ -26,11 +26,10 @@ import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable import de.bixilon.minosoft.gui.rendering.system.window.CursorModes import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition -import de.bixilon.minosoft.util.Initializable class DraggedManager( private val guiRenderer: GUIRenderer, -) : Initializable, InputHandler, AsyncDrawable, Drawable { +) : InputHandler, AsyncDrawable, Drawable { private val clickCounter = MouseClickCounter() var element: DraggedGUIElement<*>? = null set(value) { @@ -52,12 +51,6 @@ class DraggedManager( } private var lastTickTime: Long = -1L - override fun init() { - } - - override fun postInit() { - } - fun onScreenChange() { element?.element?.forceSilentApply() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDManager.kt index b7d94eaf5..65858064f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/HUDManager.kt @@ -54,7 +54,7 @@ class HUDManager( private var values: Collection = emptyList() - fun registerElement(hudBuilder: HUDBuilder<*>) { + fun register(hudBuilder: HUDBuilder<*>) { val hudElement = hudBuilder.build(guiRenderer) hudElements[hudBuilder.identifier] = hudElement @@ -64,13 +64,18 @@ class HUDManager( context.input.bindings.register(toggleKeyBindingName, toggleKeyBinding, pressed = hudBuilder.DEFAULT_ENABLED) { hudElement.enabled = it } } - private fun registerDefaultElements() { - val latch = SimpleLatch(DEFAULT_ELEMENTS.size + 1) + private fun registerDefaults() { + for (builder in DEFAULT_ELEMENTS) { + builder.register(guiRenderer) + } + } + + private fun buildDefaults() { + val latch = SimpleLatch(DEFAULT_ELEMENTS.size) for (builder in DEFAULT_ELEMENTS) { - context.runAsync { registerElement(builder); latch.dec() } + context.runAsync { register(builder); latch.dec() } } - latch.dec() latch.await() } @@ -86,7 +91,7 @@ class HUDManager( } override fun init() { - registerDefaultElements() + registerDefaults() for (element in this.hudElements.toSynchronizedMap().values) { element.init() @@ -100,6 +105,8 @@ class HUDManager( } override fun postInit() { + buildDefaults() + for (element in this.hudElements.toSynchronizedMap().values) { element.postInit() if (element is LayoutedGUIElement<*>) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/ChatElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/ChatElement.kt index 4bcb5844e..83762950c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/ChatElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/ChatElement.kt @@ -81,7 +81,7 @@ class ChatElement(guiRenderer: GUIRenderer) : AbstractChatElement(guiRenderer), } - override fun init() { + override fun postInit() { connection.events.listen { if (it.message.type.position == ChatTextPositions.HOTBAR) { return@listen @@ -108,7 +108,7 @@ class ChatElement(guiRenderer: GUIRenderer) : AbstractChatElement(guiRenderer), this.input.value = "/" } - internal.init() + internal.postInit() } override fun forceRender(offset: Vec2, consumer: GUIVertexConsumer, options: GUIVertexOptions?) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/InternalChatElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/InternalChatElement.kt index eb429f5f7..e8709de85 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/InternalChatElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/chat/InternalChatElement.kt @@ -47,7 +47,7 @@ class InternalChatElement(guiRenderer: GUIRenderer) : AbstractChatElement(guiRen } - override fun init() { + override fun postInit() { connection.events.listen { if (it.message !is InternalChatMessage || profile.chat.internal.hidden) { return@listen diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarBaseElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarBaseElement.kt index a0d4afbdc..c679b412a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarBaseElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarBaseElement.kt @@ -31,7 +31,7 @@ class HotbarBaseElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Pollab private val atlas = guiRenderer.atlas[ATLAS] private val baseAtlasElement = atlas["base"] private val base = AtlasImageElement(guiRenderer, baseAtlasElement) - private val frame = AtlasImageElement(guiRenderer, atlas["frame"]!!, size = Vec2i(FRAME_SIZE)) + private val frame = AtlasImageElement(guiRenderer, atlas["frame"], size = Vec2i(FRAME_SIZE)) private val containerElement = ContainerItemsElement(guiRenderer, guiRenderer.context.connection.player.items.inventory, baseAtlasElement?.slots ?: Int2ObjectOpenHashMap()) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarOffhandElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarOffhandElement.kt index 49dbce163..2dd899299 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarOffhandElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarOffhandElement.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar import de.bixilon.kotlinglm.vec2.Vec2 +import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.minosoft.data.entities.entities.player.Arms import de.bixilon.minosoft.data.entities.entities.player.Arms.Companion.opposite import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer @@ -23,6 +24,7 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.items.ContainerItemsElemen import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.AtlasImageElement import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions +import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.vec.vec4.Vec4Util.marginOf import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap @@ -34,13 +36,13 @@ class HotbarOffhandElement(guiRenderer: GUIRenderer) : Element(guiRenderer) { ) val offArm = guiRenderer.context.connection.player.mainArm.opposite // ToDo: Support arm change - private val frame = frames[offArm.ordinal]!! + private val frame = frames[offArm.ordinal] private var frameImage = AtlasImageElement(guiRenderer, frame) - private val containerElement = ContainerItemsElement(guiRenderer, guiRenderer.context.connection.player.items.inventory, frame.slots ?: Int2ObjectOpenHashMap()) + private val containerElement = ContainerItemsElement(guiRenderer, guiRenderer.context.connection.player.items.inventory, frame?.slots ?: Int2ObjectOpenHashMap()) init { - _size = Vec2(frame.size) + _size = Vec2(frame?.size ?: Vec2i.EMPTY) val margin = if (offArm == Arms.LEFT) { marginOf(right = 5.0f) } else { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt index e202b3c9b..e66ff71ae 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt @@ -39,7 +39,7 @@ class CrosshairHUDElement(guiRenderer: GUIRenderer) : CustomHUDElement(guiRender private var reapply = true private var previousNeedsDraw = needsDraw - override fun init() { + override fun postInit() { crosshairAtlasElement = guiRenderer.atlas[ATLAS]?.get("crosshair") crosshairProfile::color.observe(this) { reapply = true } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/debug/DebugHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/debug/DebugHUDElement.kt index 88339e8d3..c576e3a29 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/debug/DebugHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/debug/DebugHUDElement.kt @@ -82,7 +82,7 @@ class DebugHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Layouted } - override fun init() { + override fun postInit() { layout[Vec2i(0, 0)] = initLeft() layout[Vec2i(2, 0)] = initRight() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/scoreboard/ScoreboardSideElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/scoreboard/ScoreboardSideElement.kt index 3aa36aba1..945f71707 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/scoreboard/ScoreboardSideElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/scoreboard/ScoreboardSideElement.kt @@ -161,7 +161,7 @@ class ScoreboardSideElement(guiRenderer: GUIRenderer) : Element(guiRenderer), La queueSizeRecalculation() } - override fun init() { + override fun postInit() { val connection = context.connection connection.events.listen { if (it.position != ScoreboardPositions.SIDEBAR) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListElement.kt index 668da3c35..c4d62ec57 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListElement.kt @@ -216,7 +216,7 @@ class TabListElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedE } - override fun init() { + override fun postInit() { val connection = context.connection connection.tabList::header.observe(this) { header.text = it } connection.tabList::footer.observe(this) { footer.text = it } 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 e910c2065..59ef57a19 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 @@ -106,7 +106,7 @@ class TitleElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedEle times = DEFAULT_TIMES } - override fun init() { + override fun postInit() { val connection = context.connection connection.events.listen {