rendering: MouseScrollEvent, interaction: hotbar scrolling

This commit is contained in:
Bixilon 2021-10-20 22:13:33 +02:00
parent a7e2d462e3
commit 614d12978a
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
12 changed files with 93 additions and 10 deletions

View File

@ -22,5 +22,5 @@ object StaticConfiguration {
@Deprecated(message = "Just for hud development purposes")
const val HUD_ONLY = true
const val HUD_ONLY = false
}

View File

@ -19,7 +19,6 @@ data class CameraGameConfig(
@Json(name = "render_distance") var renderDistance: Int = 10,
var fov: Double = 60.0,
@Json(name = "dynamic_fov") var dynamicFov: Boolean = true,
@Json(name = "mouse_sensitivity") var moseSensitivity: Float = 0.1f,
@Json(name = "no_clip_movement") var noCipMovement: Boolean = false,
@Json(name = "disable_movement_sending") var disableMovementSending: Boolean = true, // ToDo: This should get false once the physics are "complete"
)

View File

@ -20,4 +20,7 @@ data class ControlsGameConfig(
@Json(name = "enable_flattening") var enableFlattening: Boolean = true,
@Json(name = "enable_stripping") var enableStripping: Boolean = true,
@Json(name = "enable_tilling") var enableTilling: Boolean = true,
@Json(name = "mouse_sensitivity") var moseSensitivity: Float = 0.1f,
@Json(name = "hotbar_scroll_sensitivity") var hotbarScrollSensitivity: Double = 1.0,
)

View File

@ -19,6 +19,7 @@ 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.HUDElement
import de.bixilon.minosoft.modding.event.events.ExperienceChangeEvent
import de.bixilon.minosoft.modding.event.events.SelectHotbarSlotEvent
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
import de.bixilon.minosoft.util.KUtil.toResourceLocation
import glm_.vec2.Vec2i
@ -46,6 +47,10 @@ class HotbarHUDElement(hudRenderer: HUDRenderer) : HUDElement<HotbarElement>(hud
connection.registerEvent(CallbackEventInvoker.of<GamemodeChangeEvent> {
layout.forceApply()
})
connection.registerEvent(CallbackEventInvoker.of<SelectHotbarSlotEvent> {
layout.base.apply()
})
}

View File

@ -60,7 +60,7 @@ class Camera(
) {
var fogColor = Previous(ChatColors.GREEN)
var fogStart = 100.0f
private var mouseSensitivity = Minosoft.config.config.game.camera.moseSensitivity
private var mouseSensitivity = Minosoft.config.config.game.controls.moseSensitivity
@Deprecated("", ReplaceWith("connection.player"))
val entity: LocalPlayerEntity

View File

@ -13,11 +13,16 @@
package de.bixilon.minosoft.gui.rendering.input.interaction
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.config.key.KeyAction
import de.bixilon.minosoft.config.key.KeyBinding
import de.bixilon.minosoft.config.key.KeyCodes
import de.bixilon.minosoft.data.registries.other.containers.PlayerInventory
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.modding.events.input.MouseScrollEvent
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.modding.event.events.SelectHotbarSlotEvent
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
import de.bixilon.minosoft.protocol.packets.c2s.play.HotbarSlotSetC2SP
import de.bixilon.minosoft.util.KUtil.toResourceLocation
@ -26,6 +31,8 @@ class HotbarInteractionHandler(
) {
private val connection = renderWindow.connection
private var currentScrollOffset = 0.0
fun selectSlot(slot: Int) {
// ToDo: Rate limit?
@ -34,6 +41,7 @@ class HotbarInteractionHandler(
}
connection.player.selectedHotbarSlot = slot
connection.sendPacket(HotbarSlotSetC2SP(slot))
connection.fireEvent(SelectHotbarSlotEvent(connection, EventInitiators.CLIENT, slot))
}
@ -47,5 +55,27 @@ class HotbarInteractionHandler(
selectSlot(i - 1)
}
}
connection.registerEvent(CallbackEventInvoker.of<MouseScrollEvent> {
currentScrollOffset += it.offset.y
val limit = Minosoft.config.config.game.controls.hotbarScrollSensitivity
var nextSlot = connection.player.selectedHotbarSlot
if (currentScrollOffset >= limit && currentScrollOffset > 0) {
nextSlot--
} else if (currentScrollOffset <= -limit && currentScrollOffset < 0) {
nextSlot++
} else {
return@of
}
currentScrollOffset = 0.0
if (nextSlot < 0) {
nextSlot = PlayerInventory.HOTBAR_SLOTS - 1
} else if (nextSlot > PlayerInventory.HOTBAR_SLOTS - 1) {
nextSlot = 0
}
selectSlot(nextSlot)
})
}
}

View File

@ -24,9 +24,9 @@ import de.bixilon.minosoft.gui.rendering.input.LeftClickHandler
import de.bixilon.minosoft.gui.rendering.input.RightClickHandler
import de.bixilon.minosoft.gui.rendering.input.camera.Camera
import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionManager
import de.bixilon.minosoft.gui.rendering.modding.events.MouseMoveEvent
import de.bixilon.minosoft.gui.rendering.modding.events.RawCharInputEvent
import de.bixilon.minosoft.gui.rendering.modding.events.RawKeyInputEvent
import de.bixilon.minosoft.gui.rendering.modding.events.input.MouseMoveEvent
import de.bixilon.minosoft.gui.rendering.modding.events.input.RawCharInputEvent
import de.bixilon.minosoft.gui.rendering.modding.events.input.RawKeyInputEvent
import de.bixilon.minosoft.gui.rendering.system.window.CursorModes
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker

View File

@ -11,10 +11,11 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.modding.events
package de.bixilon.minosoft.gui.rendering.modding.events.input
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.Rendering
import de.bixilon.minosoft.gui.rendering.modding.events.RenderEvent
import glm_.vec2.Vec2d
class MouseMoveEvent(

View File

@ -0,0 +1,27 @@
/*
* Minosoft
* Copyright (C) 2021 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.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.modding.events.input
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.Rendering
import de.bixilon.minosoft.gui.rendering.modding.events.RenderEvent
import glm_.vec2.Vec2d
class MouseScrollEvent(
renderWindow: RenderWindow = Rendering.currentContext!!,
offset: Vec2d,
) : RenderEvent(renderWindow) {
val offset: Vec2d = offset
get() = Vec2d(field)
}

View File

@ -11,10 +11,11 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.modding.events
package de.bixilon.minosoft.gui.rendering.modding.events.input
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.Rendering
import de.bixilon.minosoft.gui.rendering.modding.events.RenderEvent
class RawCharInputEvent(
renderWindow: RenderWindow = Rendering.currentContext!!,

View File

@ -11,11 +11,12 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.modding.events
package de.bixilon.minosoft.gui.rendering.modding.events.input
import de.bixilon.minosoft.config.key.KeyCodes
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.Rendering
import de.bixilon.minosoft.gui.rendering.modding.events.RenderEvent
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
class RawKeyInputEvent(

View File

@ -14,7 +14,14 @@
package de.bixilon.minosoft.gui.rendering.system.window
import de.bixilon.minosoft.config.key.KeyCodes
import de.bixilon.minosoft.gui.rendering.modding.events.*
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent
import de.bixilon.minosoft.gui.rendering.modding.events.WindowCloseEvent
import de.bixilon.minosoft.gui.rendering.modding.events.WindowFocusChangeEvent
import de.bixilon.minosoft.gui.rendering.modding.events.WindowIconifyChangeEvent
import de.bixilon.minosoft.gui.rendering.modding.events.input.MouseMoveEvent
import de.bixilon.minosoft.gui.rendering.modding.events.input.MouseScrollEvent
import de.bixilon.minosoft.gui.rendering.modding.events.input.RawCharInputEvent
import de.bixilon.minosoft.gui.rendering.modding.events.input.RawKeyInputEvent
import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow.Companion.DEFAULT_MAXIMUM_WINDOW_SIZE
import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow.Companion.DEFAULT_MINIMUM_WINDOW_SIZE
import de.bixilon.minosoft.gui.rendering.system.window.BaseWindow.Companion.DEFAULT_WINDOW_SIZE
@ -153,6 +160,7 @@ class GLFWWindow(
glfwSetWindowCloseCallback(window, this::onClose)
glfwSetWindowFocusCallback(window, this::onFocusChange)
glfwSetWindowIconifyCallback(window, this::onIconify)
glfwSetScrollCallback(window, this::onScroll)
}
override fun destroy() {
@ -252,6 +260,14 @@ class GLFWWindow(
eventMaster.fireEvent(MouseMoveEvent(position = Vec2d(x, y)))
}
private fun onScroll(window: Long, xOffset: Double, yOffset: Double) {
if (window != this.window) {
return
}
eventMaster.fireEvent(MouseScrollEvent(offset = Vec2d(xOffset, yOffset)))
}
companion object {
val CursorModes.glfw: Int
get() {