diff --git a/src/main/java/de/bixilon/minosoft/data/world/AbstractAudioPlayer.kt b/src/main/java/de/bixilon/minosoft/data/world/AbstractAudioPlayer.kt index dd09c0bc4..98dcd6d72 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/AbstractAudioPlayer.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/AbstractAudioPlayer.kt @@ -26,6 +26,10 @@ interface AbstractAudioPlayer { fun playSoundEvent(sound: ResourceLocation, position: Vec3? = null, volume: Float = 1.0f, pitch: Float = 1.0f) + fun playSoundEvent(sound: ResourceLocation, volume: Float = 1.0f, pitch: Float = 1.0f) { + playSoundEvent(sound, null as Vec3?, volume, pitch) + } + fun stopSound(sound: ResourceLocation) // ToDo: Stop category diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt index 382673a79..43a0282b0 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt @@ -236,4 +236,6 @@ abstract class Element(val guiRenderer: GUIRenderer) : InputElement { * Called every tick to execute time based actions */ open fun tick() = Unit + + open fun onClose() = Unit } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ButtonElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ButtonElement.kt index a8f3e2d54..0ebb149c2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ButtonElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ButtonElement.kt @@ -27,6 +27,7 @@ import de.bixilon.minosoft.gui.rendering.gui.input.mouse.MouseButtons import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes +import de.bixilon.minosoft.util.KUtil.toResourceLocation import glm_.vec2.Vec2i open class ButtonElement( @@ -143,6 +144,7 @@ open class ButtonElement( open fun submit() { onSubmit() + guiRenderer.connection.world.playSoundEvent(CLICK_SOUND) } override fun onChildChange(child: Element) { @@ -156,6 +158,7 @@ open class ButtonElement( } private companion object { + val CLICK_SOUND = "minecraft:ui.button.click".toResourceLocation() const val TEXT_PADDING = 4 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ConfirmButtonElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/NeutralizedButtonElement.kt similarity index 61% rename from src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ConfirmButtonElement.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/NeutralizedButtonElement.kt index 4faac082d..07f8b1e6a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/ConfirmButtonElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/input/button/NeutralizedButtonElement.kt @@ -15,32 +15,43 @@ package de.bixilon.minosoft.gui.rendering.gui.elements.input.button import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer -open class ConfirmButtonElement( +open class NeutralizedButtonElement( guiRenderer: GUIRenderer, - val text: Any, - val confirmText: Any, + val neutralizedText: Any, + val confirmText: Any = "§cAre you sure?", disabled: Boolean = false, onSubmit: () -> Unit, -) : ButtonElement(guiRenderer, text, disabled, onSubmit) { - private var confirming = false +) : ButtonElement(guiRenderer, neutralizedText, disabled, onSubmit) { + private var neutrealized = true + private var autoNeutralizeTicks = 0 override fun submit() { - if (confirming) { - super.submit() - cancelConfirm() - } else { - confirming = true + if (neutrealized) { + neutrealized = false + autoNeutralizeTicks = 20 textElement.text = confirmText + } else { + super.submit() + neutralize() } } - private fun cancelConfirm() { - confirming = false - textElement.text = text + private fun neutralize() { + neutrealized = true + textElement.text = neutralizedText } - override fun onMouseLeave() { - cancelConfirm() - super.onMouseLeave() + override fun tick() { + if (autoNeutralizeTicks-- < 0) { + neutralize() + } + super.tick() + } + + override fun onClose() { + if (neutrealized) { + return + } + neutralize() } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/Menu.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/Menu.kt index 05d404543..c75743350 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/Menu.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/Menu.kt @@ -124,6 +124,20 @@ abstract class Menu( return Pair(delta, element) } + override fun tick() { + for (element in elements) { + element.tick() + } + super.tick() + } + + override fun onClose() { + super.onClose() + for (element in elements) { + element.onClose() + } + } + private companion object { const val BUTTON_Y_MARGIN = 5 } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/pause/PauseMenu.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/pause/PauseMenu.kt index 1d4eca613..a64a42bd6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/pause/PauseMenu.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/screen/menu/pause/PauseMenu.kt @@ -15,7 +15,7 @@ package de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu.pause import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ButtonElement -import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.ConfirmButtonElement +import de.bixilon.minosoft.gui.rendering.gui.elements.input.button.NeutralizedButtonElement import de.bixilon.minosoft.gui.rendering.gui.gui.screen.menu.Menu import de.bixilon.minosoft.util.ShutdownManager @@ -24,7 +24,7 @@ class PauseMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer) { init { addButton(ButtonElement(guiRenderer, "Back to game") { guiRenderer.gui.pause(false) }) addButton(ButtonElement(guiRenderer, "Debug options", disabled = true) { TODO() }) - addButton(ConfirmButtonElement(guiRenderer, "§cDisconnect", "§cClick again to disconnect!") { guiRenderer.connection.network.disconnect() }) - addButton(ConfirmButtonElement(guiRenderer, "§4Exit", "§4Click again to exit!") { guiRenderer.connection.network.disconnect(); ShutdownManager.shutdown() }) + addButton(NeutralizedButtonElement(guiRenderer, "Disconnect", "§cClick again to disconnect!") { guiRenderer.connection.network.disconnect() }) + addButton(NeutralizedButtonElement(guiRenderer, "Exit", "§cClick again to exit!") { guiRenderer.connection.network.disconnect(); ShutdownManager.shutdown() }) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/LayoutedGUIElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/LayoutedGUIElement.kt index 0b4065a3f..6e542cc24 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/LayoutedGUIElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/LayoutedGUIElement.kt @@ -39,12 +39,21 @@ class LayoutedGUIElement( val elementLayout = layout.unsafeCast() override val guiRenderer: GUIRenderer = elementLayout.guiRenderer override val renderWindow: RenderWindow = guiRenderer.renderWindow - override var enabled = true var mesh: GUIMesh = GUIMesh(renderWindow, guiRenderer.matrix, DirectArrayFloatList(1000)) private var lastRevision = 0L override val skipDraw: Boolean get() = if (layout is Drawable) layout.skipDraw else false private var lastPosition: Vec2i = Vec2i(-1, -1) + override var enabled = true + set(value) { + if (field == value) { + return + } + field = value + if (!value) { + elementLayout.onClose() + } + } override fun tick() { elementLayout.tick()