Skip to content

Commit

Permalink
keybind scrolling (closes #91)
Browse files Browse the repository at this point in the history
  • Loading branch information
isXander committed Sep 23, 2022
1 parent 46d703f commit b0c01d0
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 37 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ plugins {
}

group = "dev.isxander"
version = "2.6.0"
version = "2.7.0"

repositories {
mavenCentral()
Expand Down
2 changes: 2 additions & 0 deletions changelogs/2.7.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Keybind Scrolling: Instead of using scroll wheel, use keybinds! (Configurable)
- Fix funky behaviour with Spyglass integration
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ yet_another_config_lib = "1.2.0"
mod_menu = "4.0.6"
mixin_extras = "0.0.12"

settxi = "2.10.2"
settxi = "2.10.3"

[libraries]
minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class MouseMixin {
cancellable = true
)
private void scrollStepCounter(CallbackInfo ci) {
if (ZoomifySettings.INSTANCE.getScrollZoom() && Zoomify.INSTANCE.getZooming() && eventDeltaWheel != 0) {
if (ZoomifySettings.INSTANCE.getScrollZoom() && Zoomify.INSTANCE.getZooming() && eventDeltaWheel != 0 && !ZoomifySettings.INSTANCE.getKeybindScrolling()) {
Zoomify.mouseZoom(eventDeltaWheel);
ci.cancel();
}
Expand Down
84 changes: 53 additions & 31 deletions src/main/kotlin/dev/isxander/zoomify/Zoomify.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ import org.slf4j.LoggerFactory
object Zoomify : ClientModInitializer {
val LOGGER = LoggerFactory.getLogger("Zoomify")!!

val zoomKey = KeyBinding("zoomify.key.zoom", InputUtil.Type.KEYSYM, InputUtil.GLFW_KEY_C, "zoomify.key.category")
private val zoomKey = KeyBinding("zoomify.key.zoom", InputUtil.Type.KEYSYM, InputUtil.GLFW_KEY_C, "zoomify.key.category")
private val scrollZoomIn = KeyBinding("zoomify.key.zoom.in", -1, "zoomify.key.category")
private val scrollZoomOut = KeyBinding("zoomify.key.zoom.out", -1, "zoomify.key.category")

var zooming = false
private val zoomHelper = ZoomHelper()
Expand All @@ -40,6 +42,10 @@ object Zoomify : ClientModInitializer {
ZoomifySettings

KeyBindingHelper.registerKeyBinding(zoomKey)
if (ZoomifySettings.keybindScrolling) {
KeyBindingHelper.registerKeyBinding(scrollZoomIn)
KeyBindingHelper.registerKeyBinding(scrollZoomOut)
}

ClientCommandRegistrationCallback.EVENT.register { dispatcher, _ ->
dispatcher.register(
Expand All @@ -54,7 +60,6 @@ object Zoomify : ClientModInitializer {
}

private fun tick(client: MinecraftClient) {
val cameraEntity = client.cameraEntity
val prevZooming = zooming

when (ZoomifySettings.zoomKeyBehaviour) {
Expand All @@ -66,6 +71,52 @@ object Zoomify : ClientModInitializer {
}
}

if (ZoomifySettings.keybindScrolling) {
while (scrollZoomIn.wasPressed()) {
scrollSteps++
}
while (scrollZoomOut.wasPressed()) {
scrollSteps--
}

scrollSteps = scrollSteps.coerceIn(0..maxScrollTiers)
}

handleSpyglass(client, prevZooming)

zoomHelper.tick(zooming, scrollSteps)

if (displayGui) {
displayGui = false
client.setScreen(ZoomifySettings.gui(client.currentScreen))
}
}

@JvmStatic
fun getZoomDivisor(tickDelta: Float): Double {
if (!zooming) {
if (!ZoomifySettings.retainZoomSteps)
scrollSteps = 0

zoomHelper.reset()
}

return zoomHelper.getZoomDivisor(tickDelta).also { previousZoomDivisor = it }
}

@JvmStatic
fun mouseZoom(mouseDelta: Double) {
if (mouseDelta > 0) {
scrollSteps++
} else if (mouseDelta < 0) {
scrollSteps--
}
scrollSteps = scrollSteps.coerceIn(0..maxScrollTiers)
}

private fun handleSpyglass(client: MinecraftClient, prevZooming: Boolean) {
val cameraEntity = client.cameraEntity

if (cameraEntity is AbstractClientPlayerEntity) {
when (ZoomifySettings.spyglassBehaviour) {
SpyglassBehaviour.ONLY_ZOOM_WHILE_HOLDING -> {
Expand Down Expand Up @@ -108,35 +159,6 @@ object Zoomify : ClientModInitializer {
}
}
}

zoomHelper.tick(zooming, scrollSteps)

if (displayGui) {
displayGui = false
client.setScreen(ZoomifySettings.gui(client.currentScreen))
}
}

@JvmStatic
fun getZoomDivisor(tickDelta: Float): Double {
if (!zooming) {
if (!ZoomifySettings.retainZoomSteps)
scrollSteps = 0

zoomHelper.reset()
}

return zoomHelper.getZoomDivisor(tickDelta).also { previousZoomDivisor = it }
}

@JvmStatic
fun mouseZoom(mouseDelta: Double) {
if (mouseDelta > 0) {
scrollSteps++
} else if (mouseDelta < 0) {
scrollSteps--
}
scrollSteps = scrollSteps.coerceIn(0..maxScrollTiers)
}

@JvmStatic
Expand Down
14 changes: 13 additions & 1 deletion src/main/kotlin/dev/isxander/zoomify/config/ZoomifySettings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import dev.isxander.settxi.serialization.PrimitiveType
import dev.isxander.settxi.serialization.SettxiFileConfig
import dev.isxander.settxi.serialization.kotlinxSerializer
import dev.isxander.yacl.api.Option
import dev.isxander.yacl.api.OptionFlag
import dev.isxander.yacl.api.utils.OptionUtils
import dev.isxander.zoomify.Zoomify
import dev.isxander.zoomify.utils.TransitionType
Expand Down Expand Up @@ -169,6 +170,16 @@ object ZoomifySettings : SettxiFileConfig(
}
}

var keybindScrolling = false
private set

private var _keybindScrolling by boolean(false) {
name = "zoomify.gui.keybindScrolling.name"
description = "zoomify.gui.keybindScrolling.description"
category = CONTROLS
yaclFlags = setOf(OptionFlag.GAME_RESTART)
}

var relativeSensitivity by int(100) {
name = "zoomify.gui.relativeSensitivity.name"
description = "zoomify.gui.relativeSensitivity.description"
Expand Down Expand Up @@ -254,7 +265,6 @@ object ZoomifySettings : SettxiFileConfig(
val presetGroup = Group(Text.translatable("zoomify.gui.subcategory.presets"))

yaclLabel(Text.translatable("zoomify.gui.preset.apply.warning").formatted(Formatting.RED)) {
name = ""
yaclGroup = presetGroup
category = MISC
}
Expand Down Expand Up @@ -284,6 +294,8 @@ object ZoomifySettings : SettxiFileConfig(
export()
needsSaving = false
}

keybindScrolling = _keybindScrolling
}

fun gui(parent: Screen? = null): Screen =
Expand Down
5 changes: 4 additions & 1 deletion src/main/resources/assets/zoomify/lang/en_gb.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"zoomify.key.zoom": "Zoom",
"zoomify.key.gui": "Open GUI",
"zoomify.key.zoom.in": "Scroll Zoom In",
"zoomify.key.zoom.out": "Scroll Zoom Out",
"zoomify.key.category": "Zoomify",


Expand Down Expand Up @@ -37,6 +38,8 @@
"zoomify.gui.category.controls": "Controls",
"zoomify.gui.zoomKeyBehaviour.name": "Zoom Key Behaviour",
"zoomify.gui.zoomKeyBehaviour.description": "The behaviour of the zoom key.",
"zoomify.gui.keybindScrolling.name": "Keybind Scrolling",
"zoomify.gui.keybindScrolling.description": "Use Minecraft keybinds to control scroll zoom instead of the scroll wheel.",
"zoomify.gui.relativeSensitivity.name": "Relative Sensitivity",
"zoomify.gui.relativeSensitivity.description": "Controls the sensitivity based on the zoom level.",
"zoomify.gui.relativeViewBobbing.name": "Relative View Bobbing",
Expand Down
5 changes: 4 additions & 1 deletion src/main/resources/assets/zoomify/lang/en_us.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"zoomify.key.zoom": "Zoom",
"zoomify.key.gui": "Open GUI",
"zoomify.key.zoom.in": "Scroll Zoom In",
"zoomify.key.zoom.out": "Scroll Zoom Out",
"zoomify.key.category": "Zoomify",


Expand Down Expand Up @@ -37,6 +38,8 @@
"zoomify.gui.category.controls": "Controls",
"zoomify.gui.zoomKeyBehaviour.name": "Zoom Key Behavior",
"zoomify.gui.zoomKeyBehaviour.description": "The behavior of the zoom key.",
"zoomify.gui.keybindScrolling.name": "Keybind Scrolling",
"zoomify.gui.keybindScrolling.description": "Use Minecraft keybinds to control scroll zoom instead of the scroll wheel.",
"zoomify.gui.relativeSensitivity.name": "Relative Sensitivity",
"zoomify.gui.relativeSensitivity.description": "Controls the sensitivity based on the zoom level.",
"zoomify.gui.relativeViewBobbing.name": "Relative View Bobbing",
Expand Down

0 comments on commit b0c01d0

Please sign in to comment.