diff --git a/src/main/java/de/bixilon/minosoft/config/StaticConfiguration.kt b/src/main/java/de/bixilon/minosoft/config/StaticConfiguration.kt index a9e3f2e6f..f83896062 100644 --- a/src/main/java/de/bixilon/minosoft/config/StaticConfiguration.kt +++ b/src/main/java/de/bixilon/minosoft/config/StaticConfiguration.kt @@ -22,5 +22,5 @@ object StaticConfiguration { @Deprecated(message = "Just for hud development purposes") - const val HUD_ONLY = true + const val HUD_ONLY = false } diff --git a/src/main/java/de/bixilon/minosoft/config/config/game/CameraGameConfig.kt b/src/main/java/de/bixilon/minosoft/config/config/game/CameraGameConfig.kt index f489e8f85..fdd48bbce 100644 --- a/src/main/java/de/bixilon/minosoft/config/config/game/CameraGameConfig.kt +++ b/src/main/java/de/bixilon/minosoft/config/config/game/CameraGameConfig.kt @@ -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" ) diff --git a/src/main/java/de/bixilon/minosoft/config/config/game/controls/ControlsGameConfig.kt b/src/main/java/de/bixilon/minosoft/config/config/game/controls/ControlsGameConfig.kt index 99bf7ffa8..34d3f48ee 100644 --- a/src/main/java/de/bixilon/minosoft/config/config/game/controls/ControlsGameConfig.kt +++ b/src/main/java/de/bixilon/minosoft/config/config/game/controls/ControlsGameConfig.kt @@ -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, ) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHUDElement.kt index ba59bf567..fccca776e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarHUDElement.kt @@ -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(hud connection.registerEvent(CallbackEventInvoker.of { layout.forceApply() }) + + connection.registerEvent(CallbackEventInvoker.of { + layout.base.apply() + }) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt index 6a7636de8..abd96a44b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt @@ -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 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/HotbarInteractionHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/HotbarInteractionHandler.kt index ffbc45df3..26bd2387e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/HotbarInteractionHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/HotbarInteractionHandler.kt @@ -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 { + 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) + }) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt index 77b4b7cbb..cfc553962 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt @@ -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 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/MouseMoveEvent.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/MouseMoveEvent.kt similarity index 89% rename from src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/MouseMoveEvent.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/MouseMoveEvent.kt index e8350ae37..1561107ef 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/MouseMoveEvent.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/MouseMoveEvent.kt @@ -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( diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/MouseScrollEvent.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/MouseScrollEvent.kt new file mode 100644 index 000000000..166f0f6d3 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/MouseScrollEvent.kt @@ -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 . + * + * 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) +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/RawCharInputEvent.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/RawCharInputEvent.kt similarity index 88% rename from src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/RawCharInputEvent.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/RawCharInputEvent.kt index 84049d64d..a1ff1f2e9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/RawCharInputEvent.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/RawCharInputEvent.kt @@ -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!!, diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/RawKeyInputEvent.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/RawKeyInputEvent.kt similarity index 90% rename from src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/RawKeyInputEvent.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/RawKeyInputEvent.kt index 39dad13d9..117021068 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/RawKeyInputEvent.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/input/RawKeyInputEvent.kt @@ -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( diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/GLFWWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/GLFWWindow.kt index 74106857c..817c68280 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/GLFWWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/window/GLFWWindow.kt @@ -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() {