From 45d97bacc9f4467496a32dfc3fc90fe052ed6d8a Mon Sep 17 00:00:00 2001 From: videogame hacker Date: Thu, 3 Feb 2022 22:01:41 +0000 Subject: [PATCH] Add keybinds and a feature list overlay --- .../hibiscus/mixins/MixinMinecraftClient.java | 4 +- .../kotlin/codes/som/hibiscus/HibiscusMod.kt | 6 +++ .../hibiscus/api/feature/FeatureCategory.kt | 1 + .../hibiscus/api/keybinds/KeybindRegistry.kt | 22 ++++++++++ .../som/hibiscus/api/keybinds/KeyboardKey.kt | 14 ++++++ .../codes/som/hibiscus/events/RenderEvents.kt | 2 +- .../som/hibiscus/features/FeatureList.kt | 2 + .../hibiscus/features/overlay/FeatureList.kt | 44 +++++++++++++++++++ .../hibiscus/util/input/KeybindDispatcher.kt | 25 +++++++++++ 9 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/codes/som/hibiscus/api/keybinds/KeybindRegistry.kt create mode 100644 src/main/kotlin/codes/som/hibiscus/api/keybinds/KeyboardKey.kt create mode 100644 src/main/kotlin/codes/som/hibiscus/features/overlay/FeatureList.kt create mode 100644 src/main/kotlin/codes/som/hibiscus/util/input/KeybindDispatcher.kt diff --git a/src/main/java/codes/som/hibiscus/mixins/MixinMinecraftClient.java b/src/main/java/codes/som/hibiscus/mixins/MixinMinecraftClient.java index 5879629..b683282 100644 --- a/src/main/java/codes/som/hibiscus/mixins/MixinMinecraftClient.java +++ b/src/main/java/codes/som/hibiscus/mixins/MixinMinecraftClient.java @@ -1,7 +1,7 @@ package codes.som.hibiscus.mixins; import codes.som.hibiscus.HibiscusMod; -import codes.som.hibiscus.events.RenderOverlayEvent; +import codes.som.hibiscus.events.PostRenderAllEvent; import codes.som.hibiscus.gui.ImGuiRenderer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.RunArgs; @@ -39,7 +39,7 @@ public abstract class MixinMinecraftClient { @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;endWrite()V", shift = At.Shift.BEFORE)) private void onPostRenderEverything(boolean tick, CallbackInfo ci) { float delta = this.paused ? this.pausedTickDelta : this.renderTickCounter.tickDelta; - HibiscusMod.bus().fire(new RenderOverlayEvent(delta)); + HibiscusMod.bus().fire(new PostRenderAllEvent(delta)); ImGuiRenderer.INSTANCE.finishFrame(delta); } } diff --git a/src/main/kotlin/codes/som/hibiscus/HibiscusMod.kt b/src/main/kotlin/codes/som/hibiscus/HibiscusMod.kt index 48fb39e..f391c8a 100644 --- a/src/main/kotlin/codes/som/hibiscus/HibiscusMod.kt +++ b/src/main/kotlin/codes/som/hibiscus/HibiscusMod.kt @@ -3,10 +3,12 @@ package codes.som.hibiscus import codes.som.hibiscus.api.command.CommandManager import codes.som.hibiscus.api.event.EventBus import codes.som.hibiscus.api.event.EventPhase +import codes.som.hibiscus.api.keybinds.KeybindRegistry import codes.som.hibiscus.events.KeyEvent import codes.som.hibiscus.features.FeaturesRegistry import codes.som.hibiscus.gui.ImGuiScreen import codes.som.hibiscus.util.command.ChatCommandListener +import codes.som.hibiscus.util.input.KeybindDispatcher import codes.som.hibiscus.util.netmoving.NetworkMovingDispatcher import net.fabricmc.api.ModInitializer import org.lwjgl.glfw.GLFW @@ -22,12 +24,15 @@ object HibiscusMod : ModInitializer { val features = FeaturesRegistry() val commands = CommandManager() + val keybinds = KeybindRegistry() override fun onInitialize() { for (feature in features.getAllFeatures()) { commands.register(feature.createFeatureCommand()) } + keybinds.register(GLFW.GLFW_KEY_R, "flight") + bus.register { event: KeyEvent -> if (event.key != GLFW_KEY_RIGHT_SHIFT || event.action != GLFW.GLFW_PRESS) return@register @@ -40,5 +45,6 @@ object HibiscusMod : ModInitializer { bus.register(NetworkMovingDispatcher(), EventPhase.AFTER) bus.register(ChatCommandListener()) + bus.register(KeybindDispatcher()) } } diff --git a/src/main/kotlin/codes/som/hibiscus/api/feature/FeatureCategory.kt b/src/main/kotlin/codes/som/hibiscus/api/feature/FeatureCategory.kt index ab9360d..4687d01 100644 --- a/src/main/kotlin/codes/som/hibiscus/api/feature/FeatureCategory.kt +++ b/src/main/kotlin/codes/som/hibiscus/api/feature/FeatureCategory.kt @@ -3,4 +3,5 @@ package codes.som.hibiscus.api.feature enum class FeatureCategory(val humanName: String) { PLAYER("Player"), MOVEMENT("Movement"), + OVERLAY("Overlay"), } diff --git a/src/main/kotlin/codes/som/hibiscus/api/keybinds/KeybindRegistry.kt b/src/main/kotlin/codes/som/hibiscus/api/keybinds/KeybindRegistry.kt new file mode 100644 index 0000000..6f75ded --- /dev/null +++ b/src/main/kotlin/codes/som/hibiscus/api/keybinds/KeybindRegistry.kt @@ -0,0 +1,22 @@ +package codes.som.hibiscus.api.keybinds + +class KeybindRegistry { + private val keybinds = mutableMapOf>() + + fun register(key: Int, command: String) { + keybinds.getOrPut(key, ::mutableListOf).add(command) + } + + fun unregister(key: Int, command: String) { + keybinds.getOrPut(key, ::mutableListOf).remove(command) + } + + operator fun iterator(): Iterator>> = keybinds.iterator() + + fun getBinds(key: Int): List = + keybinds.getOrDefault(key, emptyList()) + + fun reset() { + keybinds.clear() + } +} diff --git a/src/main/kotlin/codes/som/hibiscus/api/keybinds/KeyboardKey.kt b/src/main/kotlin/codes/som/hibiscus/api/keybinds/KeyboardKey.kt new file mode 100644 index 0000000..043a905 --- /dev/null +++ b/src/main/kotlin/codes/som/hibiscus/api/keybinds/KeyboardKey.kt @@ -0,0 +1,14 @@ +package codes.som.hibiscus.api.keybinds + +import codes.som.hibiscus.util.input.Keys + +data class KeyboardKey(val code: Int) { + val name + get() = + Keys.KEY_MAP.inverse()[code] ?: "UNKNOWN" + + companion object { + fun fromName(name: String) = + Keys.KEY_MAP[name]?.let(::KeyboardKey) + } +} diff --git a/src/main/kotlin/codes/som/hibiscus/events/RenderEvents.kt b/src/main/kotlin/codes/som/hibiscus/events/RenderEvents.kt index 5e7c752..214944c 100644 --- a/src/main/kotlin/codes/som/hibiscus/events/RenderEvents.kt +++ b/src/main/kotlin/codes/som/hibiscus/events/RenderEvents.kt @@ -2,4 +2,4 @@ package codes.som.hibiscus.events import codes.som.hibiscus.api.event.Event -class RenderOverlayEvent(val delta: Float) : Event +class PostRenderAllEvent(val delta: Float) : Event diff --git a/src/main/kotlin/codes/som/hibiscus/features/FeatureList.kt b/src/main/kotlin/codes/som/hibiscus/features/FeatureList.kt index e2855a6..098299d 100644 --- a/src/main/kotlin/codes/som/hibiscus/features/FeatureList.kt +++ b/src/main/kotlin/codes/som/hibiscus/features/FeatureList.kt @@ -2,9 +2,11 @@ package codes.som.hibiscus.features import codes.som.hibiscus.api.feature.Feature import codes.som.hibiscus.features.movement.Flight +import codes.som.hibiscus.features.overlay.FeatureList import codes.som.hibiscus.features.player.NoFallDamage val ALL_FEATURES: Array<() -> Feature> = arrayOf( ::NoFallDamage, ::Flight, + ::FeatureList, ) diff --git a/src/main/kotlin/codes/som/hibiscus/features/overlay/FeatureList.kt b/src/main/kotlin/codes/som/hibiscus/features/overlay/FeatureList.kt new file mode 100644 index 0000000..792f9bc --- /dev/null +++ b/src/main/kotlin/codes/som/hibiscus/features/overlay/FeatureList.kt @@ -0,0 +1,44 @@ +package codes.som.hibiscus.features.overlay + +import codes.som.hibiscus.HibiscusMod +import codes.som.hibiscus.api.feature.Feature +import codes.som.hibiscus.api.feature.FeatureCategory +import codes.som.hibiscus.events.PostRenderAllEvent +import imgui.ImGui +import imgui.flag.ImGuiCol +import imgui.flag.ImGuiWindowFlags + +class FeatureList : Feature("Feature List", FeatureCategory.OVERLAY) { + init { + on { _: PostRenderAllEvent -> + val viewport = ImGui.getMainViewport() + ImGui.setNextWindowPos(viewport.posX, viewport.posY) + + val enabledFeatures = + HibiscusMod.features.getAllFeatures() + .filter { it.category != FeatureCategory.OVERLAY } + .filter { it.enabled }.toList() + if (enabledFeatures.isEmpty()) + return@on + + ImGui.pushStyleColor(ImGuiCol.WindowBg, 10, 10, 10, 104) + + if (ImGui.begin( + "Feature List", + ImGuiWindowFlags.NoDecoration + ImGuiWindowFlags.NoInputs + + ImGuiWindowFlags.NoMove + ImGuiWindowFlags.AlwaysAutoResize + ) + ) { + ImGui.pushStyleColor(ImGuiCol.Text, 244, 161, 255, 255) + for (feature in enabledFeatures) + ImGui.text(feature.name) + ImGui.popStyleColor() + } + + ImGui.popStyleColor() + ImGui.end() + } + + enabled = true + } +} diff --git a/src/main/kotlin/codes/som/hibiscus/util/input/KeybindDispatcher.kt b/src/main/kotlin/codes/som/hibiscus/util/input/KeybindDispatcher.kt new file mode 100644 index 0000000..7966c07 --- /dev/null +++ b/src/main/kotlin/codes/som/hibiscus/util/input/KeybindDispatcher.kt @@ -0,0 +1,25 @@ +package codes.som.hibiscus.util.input + +import codes.som.hibiscus.HibiscusLog +import codes.som.hibiscus.HibiscusMod +import codes.som.hibiscus.api.command.CommandContext +import codes.som.hibiscus.api.command.exceptions.CommandExecutionException +import codes.som.hibiscus.api.event.TypedListener +import codes.som.hibiscus.events.KeyEvent +import codes.som.hibiscus.mc +import org.lwjgl.glfw.GLFW + +class KeybindDispatcher : TypedListener(KeyEvent::class.java) { + override fun on(event: KeyEvent) { + if (mc.isWindowFocused && mc.currentScreen == null && event.action == GLFW.GLFW_PRESS) { + HibiscusMod.keybinds.getBinds(event.key).forEach { + HibiscusMod.commands.context = CommandContext.KEYBIND + try { + HibiscusMod.commands.executeCommand(it) + } catch (e: CommandExecutionException) { + e.cause?.message?.let { HibiscusLog.error(it) } + } + } + } + } +}