Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: upgrade bind system #4120

Draft
wants to merge 10 commits into
base: nextgen
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions src-theme/src/integration/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export interface KeyboardKeyEvent {
scanCode: number;
action: number;
mods: number;
key: string;
}

export interface ScaleFactorChangeEvent {
Expand All @@ -37,10 +38,7 @@ export interface NotificationEvent {
}

export interface KeyEvent {
key: {
code: number;
name: string;
};
key: string;
action: number;
mods: number;
}
Expand Down
4 changes: 2 additions & 2 deletions src-theme/src/integration/rest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,8 @@ export async function getPlayerData(): Promise<PlayerData> {
return data;
}

export async function getPrintableKeyName(code: number): Promise<PrintableKey> {
const searchParams = new URLSearchParams({code: code.toString()});
export async function getPrintableKeyName(key: string): Promise<PrintableKey> {
const searchParams = new URLSearchParams({key});

const response = await fetch(`${API_BASE}/client/input?${searchParams.toString()}`);
const data: PrintableKey = await response.json();
Expand Down
23 changes: 15 additions & 8 deletions src-theme/src/integration/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ export interface GroupedModules {

export type ModuleSetting =
BlocksSetting
| KeySetting
| BooleanSetting
| FloatSetting
| FloatRangeSetting
Expand All @@ -27,14 +26,28 @@ export type ModuleSetting =
| TogglableSetting
| ColorSetting
| TextSetting
| TextArraySetting;
| TextArraySetting
| BindSetting;

export interface BlocksSetting {
valueType: string;
name: string;
value: string[];
}

export interface BindSetting {
valueType: string;
name: string;
value: {
boundKey: string;
action: string;
};
defaultValue: {
boundKey: string;
action: string;
};
}

export interface TextSetting {
valueType: string;
name: string;
Expand All @@ -53,12 +66,6 @@ export interface ColorSetting {
value: number;
}

export interface KeySetting {
valueType: string;
name: string;
value: number;
}

export interface BooleanSetting {
valueType: string;
name: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
<script lang="ts">
import {createEventDispatcher, onMount} from "svelte";
import type {KeySetting, ModuleSetting} from "../../../integration/types";
import type {BindSetting, ModuleSetting} from "../../../integration/types";
import {listen} from "../../../integration/ws";
import {getPrintableKeyName} from "../../../integration/rest";
import type {KeyboardKeyEvent} from "../../../integration/events";
import {convertToSpacedString, spaceSeperatedNames} from "../../../theme/theme_config";
import Dropdown from "./common/Dropdown.svelte";

export let setting: ModuleSetting;

const cSetting = setting as KeySetting;
const cSetting = setting as BindSetting;

const UNKNOWN_KEY = "key.keyboard.unknown";

const dispatch = createEventDispatcher();

let binding = false;
let printableKeyName = "";

async function updatePrintableKeyName() {
if (cSetting.value === -1) {
return;
$: {
if (cSetting.value.boundKey !== UNKNOWN_KEY) {
getPrintableKeyName(cSetting.value.boundKey)
.then(printableKey => {
printableKeyName = printableKey.localized;
});
}
printableKeyName = (await getPrintableKeyName(cSetting.value)).localized;
}

listen("keyboardKey", async (e: KeyboardKeyEvent) => {
Expand All @@ -30,11 +35,10 @@
binding = false;

if (e.keyCode !== 256) {
cSetting.value = e.keyCode;
cSetting.value.boundKey = e.key;
} else {
cSetting.value = -1;
cSetting.value.boundKey = UNKNOWN_KEY;
}
await updatePrintableKeyName();

setting = {...cSetting};

Expand All @@ -43,8 +47,7 @@

async function toggleBinding() {
if (binding) {
cSetting.value = -1;
await updatePrintableKeyName();
cSetting.value.boundKey = UNKNOWN_KEY;
}

binding = !binding;
Expand All @@ -54,17 +57,18 @@
dispatch("change");
}

onMount(async () => {
await updatePrintableKeyName();
});
function handleActionChange() {
setting = {...cSetting};
dispatch("change");
}
</script>

<div class="setting">
<div class="setting" class:has-value={cSetting.value.boundKey !== UNKNOWN_KEY}>
<button class="change-bind" on:click={toggleBinding}>
{#if !binding}
<div class="name">{$spaceSeperatedNames ? convertToSpacedString(cSetting.name) : cSetting.name}:</div>
{#if cSetting.value === -1}

{#if cSetting.value.boundKey === UNKNOWN_KEY}
<span class="none">None</span>
{:else}
<span>{printableKeyName}</span>
Expand All @@ -73,21 +77,33 @@
<span>Press any key</span>
{/if}
</button>

{#if cSetting.value.boundKey !== UNKNOWN_KEY}
<Dropdown name={null} options={["Toggle", "Hold"]} bind:value={cSetting.value.action}
on:change={handleActionChange}/>
{/if}
</div>

<style lang="scss">
@import "../../../colors.scss";

.setting {
padding: 7px 0px;
display: grid;
grid-template-columns: 1fr;
column-gap: 5px;

&.has-value {
grid-template-columns: 1fr max-content;
}
}

.change-bind {
background-color: transparent;
border: solid 2px $accent-color;
border-radius: 3px;
cursor: pointer;
padding: 5px;
padding: 4px;
font-weight: 500;
color: $clickgui-text-color;
font-size: 12px;
Expand Down
8 changes: 6 additions & 2 deletions src-theme/src/routes/clickgui/setting/common/Dropdown.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import {createEventDispatcher} from "svelte";
import {convertToSpacedString, spaceSeperatedNames} from "../../../../theme/theme_config";

export let name: string;
export let name: string | null;
export let options: string[];
export let value: string;

Expand All @@ -28,7 +28,11 @@
<!-- svelte-ignore a11y-no-static-element-interactions -->
<div class="dropdown" class:expanded on:click={() => (expanded = !expanded)}>
<div class="head" bind:this={dropdownHead}>
<span class="text">{name} &bull; {$spaceSeperatedNames ? convertToSpacedString(value) : value}</span>
{#if name !== null}
<span class="text">{name} &bull; {$spaceSeperatedNames ? convertToSpacedString(value) : value}</span>
{:else}
<span class="text">{value}</span>
{/if}
</div>

{#if expanded}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@
import TogglableSetting from "../TogglableSetting.svelte";
import ColorSetting from "../ColorSetting.svelte";
import TextSetting from "../TextSetting.svelte";
import KeySetting from "../KeySetting.svelte";
import BlocksSetting from "../blocks/BlocksSetting.svelte";
import {slide} from "svelte/transition";
import {onMount} from "svelte";
import TextArraySetting from "../TextArraySetting.svelte";
import BindSetting from "../BindSetting.svelte";

export let setting: ModuleSetting;
export let path: string;
Expand Down Expand Up @@ -54,12 +54,12 @@
<ColorSetting bind:setting={setting} on:change/>
{:else if setting.valueType === "TEXT"}
<TextSetting bind:setting={setting} on:change/>
{:else if setting.valueType === "KEY"}
<KeySetting bind:setting={setting} on:change/>
{:else if setting.valueType === "BLOCKS"}
<BlocksSetting bind:setting={setting} on:change/>
{:else if setting.valueType === "TEXT_ARRAY"}
<TextArraySetting bind:setting={setting} on:change/>
{:else if setting.valueType === "BIND"}
<BindSetting bind:setting={setting} on:change/>
{:else}
<div style="color: white">Unsupported setting {setting.valueType}</div>
{/if}
Expand Down
4 changes: 2 additions & 2 deletions src-theme/src/routes/hud/elements/keystrokes/Key.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
let active = false;

listen("key", (e: KeyEvent) => {
if (e.key.name !== key?.key.translationKey) {
if (e.key !== key?.key.translationKey) {
return;
}

Expand Down Expand Up @@ -43,4 +43,4 @@
box-shadow: inset 0 0 0 25px $accent-color;
}
}
</style>
</style>
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,11 @@ public class MixinKeyboard {
@Inject(method = "onKey", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;", shift = At.Shift.BEFORE, ordinal = 0))
private void hookKeyboardKey(long window, int key, int scancode, int i, int j, CallbackInfo callback) {
// does if (window == this.client.getWindow().getHandle())
EventManager.INSTANCE.callEvent(new KeyboardKeyEvent(key, scancode, i, j));
var inputKey = InputUtil.fromKeyCode(key, scancode);

EventManager.INSTANCE.callEvent(new KeyboardKeyEvent(inputKey, key, scancode, i, j));
if (client.currentScreen == null) {
var inputKey = InputUtil.fromKeyCode(key, scancode);

EventManager.INSTANCE.callEvent(new KeyEvent(new KeyEvent.Key(inputKey.getCode(),
inputKey.getTranslationKey()), i, j));
EventManager.INSTANCE.callEvent(new KeyEvent(inputKey, i));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import net.ccbluex.liquidbounce.utils.aiming.AimPlan;
import net.ccbluex.liquidbounce.utils.aiming.Rotation;
import net.ccbluex.liquidbounce.utils.aiming.RotationManager;
import net.ccbluex.liquidbounce.utils.client.KeybindExtensionsKt;
import net.ccbluex.liquidbounce.utils.input.InputTracker;
import net.ccbluex.liquidbounce.utils.movement.DirectionalInput;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.input.KeyboardInput;
Expand Down Expand Up @@ -56,13 +56,13 @@ public class MixinKeyboardInput extends MixinInput {
@Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/KeyBinding;isPressed()Z"))
private boolean hookInventoryMove(KeyBinding keyBinding) {
return ModuleInventoryMove.INSTANCE.shouldHandleInputs(keyBinding)
? KeybindExtensionsKt.isPressedOnAny(keyBinding) : keyBinding.isPressed();
? InputTracker.INSTANCE.isPressedOnAny(keyBinding) : keyBinding.isPressed();
}

@Inject(method = "tick", at = @At(value = "FIELD", target = "Lnet/minecraft/client/input/KeyboardInput;pressingBack:Z", ordinal = 0))
private void hookInventoryMoveSprint(boolean slowDown, float f, CallbackInfo ci) {
if (ModuleInventoryMove.INSTANCE.shouldHandleInputs(this.settings.sprintKey)) {
this.settings.sprintKey.setPressed(KeybindExtensionsKt.isPressedOnAny(this.settings.sprintKey));
this.settings.sprintKey.setPressed(InputTracker.INSTANCE.isPressedOnAny(this.settings.sprintKey));
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/main/kotlin/net/ccbluex/liquidbounce/LiquidBounce.kt
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import net.ccbluex.liquidbounce.utils.block.WorldChangeNotifier
import net.ccbluex.liquidbounce.utils.client.*
import net.ccbluex.liquidbounce.utils.combat.CombatManager
import net.ccbluex.liquidbounce.utils.combat.combatTargetsConfigurable
import net.ccbluex.liquidbounce.utils.input.InputTracker
import net.ccbluex.liquidbounce.utils.inventory.InventoryManager
import net.ccbluex.liquidbounce.utils.mappings.Remapper
import net.ccbluex.liquidbounce.utils.render.WorldToScreen
Expand Down Expand Up @@ -132,7 +133,7 @@ object LiquidBounce : Listenable {

ChunkScanner
WorldChangeNotifier
MouseStateTracker
InputTracker

// Features
ModuleManager
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ import net.ccbluex.liquidbounce.render.Fonts
import net.ccbluex.liquidbounce.render.engine.Color4b
import net.ccbluex.liquidbounce.utils.client.logger
import net.ccbluex.liquidbounce.utils.client.mc
import net.ccbluex.liquidbounce.utils.input.InputBind
import net.minecraft.block.Block
import net.minecraft.client.util.InputUtil
import net.minecraft.item.Item
import java.io.File
import java.io.Reader
Expand Down Expand Up @@ -111,6 +113,8 @@ object ConfigSystem {
.registerTypeHierarchyAdapter(Item::class.javaObjectType, ItemValueSerializer)
.registerTypeAdapter(Color4b::class.javaObjectType, ColorSerializer)
.registerTypeHierarchyAdapter(Block::class.javaObjectType, BlockValueSerializer)
.registerTypeHierarchyAdapter(InputUtil.Key::class.javaObjectType, InputUtilKeySerializer)
.registerTypeHierarchyAdapter(InputBind::class.javaObjectType, InputBindSerializer)
.registerTypeAdapter(Fonts.FontInfo::class.javaObjectType, FontDetailSerializer)
.registerTypeAdapter(ChoiceConfigurable::class.javaObjectType, ChoiceConfigurableSerializer)
.registerTypeHierarchyAdapter(NamedChoice::class.javaObjectType, EnumChoiceSerializer)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ package net.ccbluex.liquidbounce.config
import net.ccbluex.liquidbounce.event.Listenable
import net.ccbluex.liquidbounce.render.engine.Color4b
import net.ccbluex.liquidbounce.utils.client.Curves
import net.ccbluex.liquidbounce.utils.input.InputBind
import net.minecraft.block.Block
import net.minecraft.item.Item

Expand Down Expand Up @@ -113,7 +114,7 @@ open class Configurable(
protected fun int(name: String, default: Int, range: IntRange, suffix: String = "") =
rangedValue(name, default, range, suffix, ValueType.INT)

protected fun key(name: String, default: Int) = value(name, default, ValueType.KEY)
protected fun bind(name: String, default: InputBind) = value(name, default, ValueType.BIND)

protected fun intRange(name: String, default: IntRange, range: IntRange, suffix: String = "") =
rangedValue(name, default, range, suffix, ValueType.INT_RANGE)
Expand Down
10 changes: 6 additions & 4 deletions src/main/kotlin/net/ccbluex/liquidbounce/config/Value.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ import net.ccbluex.liquidbounce.features.misc.FriendManager
import net.ccbluex.liquidbounce.features.misc.ProxyManager
import net.ccbluex.liquidbounce.render.engine.Color4b
import net.ccbluex.liquidbounce.script.ScriptApi
import net.ccbluex.liquidbounce.utils.client.key
import net.ccbluex.liquidbounce.utils.client.logger
import net.ccbluex.liquidbounce.utils.input.inputByName
import net.ccbluex.liquidbounce.utils.inventory.findBlocksEndingWith
import net.ccbluex.liquidbounce.web.socket.protocol.ProtocolExclude
import net.minecraft.client.util.InputUtil
import net.minecraft.registry.Registries
import net.minecraft.util.Identifier
import java.awt.Color
Expand Down Expand Up @@ -337,11 +338,11 @@ open class Value<T : Any>(
set(items as T)
}

ValueType.KEY -> {
ValueType.BIND -> {
val newValue = try {
string.toInt()
InputUtil.Type.KEYSYM.createFromCode(string.toInt())
} catch (e: NumberFormatException) {
key(string)
inputByName(string)
}

set(newValue as T)
Expand Down Expand Up @@ -439,6 +440,7 @@ enum class ValueType {
BLOCK, BLOCKS,
ITEM, ITEMS,
KEY,
BIND,
CHOICE, CHOOSE,
INVALID,
PROXY,
Expand Down
Loading
Loading