Skip to content

Commit d5d55ac

Browse files
authored
Cleanup and improve key pressed released event (#14)
* Cleanup, support mouse clicks * Better keypad key naming * Make type a switch * Add `toggled` * Improve event format, rename `type` to `device` * Rename `Keys` to `Key`
1 parent c05206f commit d5d55ac

File tree

3 files changed

+77
-48
lines changed

3 files changed

+77
-48
lines changed

src/main/java/com/denizenscript/clientizen/events/ClientizenScriptEventRegistry.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
public class ClientizenScriptEventRegistry {
66

77
public static void registerEvents() {
8-
ScriptEvent.registerScriptEvent(KeyPressReleaseEvent.class);
8+
ScriptEvent.registerScriptEvent(KeyPressReleaseScriptEvent.class);
99
ScriptEvent.registerScriptEvent(ScreenOpenCloseEvent.class);
1010
}
1111
}

src/main/java/com/denizenscript/clientizen/events/KeyPressReleaseEvent.java renamed to src/main/java/com/denizenscript/clientizen/events/KeyPressReleaseScriptEvent.java

+70-40
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,64 @@
33
import com.denizenscript.denizencore.events.ScriptEvent;
44
import com.denizenscript.denizencore.objects.ObjectTag;
55
import com.denizenscript.denizencore.objects.core.ElementTag;
6+
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
7+
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
8+
import net.minecraft.client.util.InputUtil;
69

7-
import java.util.Arrays;
8-
import java.util.Map;
9-
import java.util.stream.Collectors;
10+
public class KeyPressReleaseScriptEvent extends ScriptEvent {
1011

11-
public class KeyPressReleaseEvent extends ScriptEvent {
12+
public static KeyPressReleaseScriptEvent instance;
1213

13-
public static KeyPressReleaseEvent instance;
14-
15-
public KeyboardKeys key;
14+
public Key key;
1615
public boolean pressed;
16+
public InputDevice device;
1717

1818

19-
public KeyPressReleaseEvent() {
20-
registerCouldMatcher("keyboard <'key'> pressed|released");
19+
public KeyPressReleaseScriptEvent() {
20+
registerCouldMatcher("<'input_device'> key pressed|released|toggled");
21+
registerSwitches("name");
2122
instance = this;
2223
}
2324

2425
@Override
2526
public boolean matches(ScriptPath path) {
26-
String keyMatcher = path.eventArgLowerAt(1);
27-
if (!keyMatcher.equals("key") && !runGenericCheck(keyMatcher, key.getName())) {
27+
if (!runGenericSwitchCheck(path, "name", key.getName())) {
28+
return false;
29+
}
30+
if (!runGenericCheck(path.eventArgLowerAt(0), device.name())) {
31+
return false;
32+
}
33+
String operation = path.eventArgLowerAt(2);
34+
if (operation.equals("pressed") && !pressed) {
2835
return false;
2936
}
30-
if (pressed != path.eventArgLowerAt(2).equals("pressed")) {
37+
if (operation.equals("released") && pressed) {
3138
return false;
3239
}
3340
return super.matches(path);
3441
}
3542

3643
@Override
3744
public ObjectTag getContext(String name) {
38-
switch (name) {
39-
case "key": return new ElementTag(key.getName());
40-
}
41-
return super.getContext(name);
45+
return switch (name) {
46+
case "key" -> new ElementTag(key.getName(), true);
47+
case "device" -> new ElementTag(device);
48+
default -> super.getContext(name);
49+
};
4250
}
4351

44-
public void handleKeyPressStateChange(int code, boolean pressed) {
45-
key = KeyboardKeys.keysByCode.get(code);
52+
public void handleKeyPressStateChange(InputUtil.Key key, boolean pressed) {
53+
this.key = Key.keysByCode.get(key.getCode());
4654
this.pressed = pressed;
55+
this.device = key.getCategory() == InputUtil.Type.KEYSYM ? InputDevice.KEYBOARD : InputDevice.MOUSE;
4756
fire();
4857
}
4958

50-
enum KeyboardKeys {
59+
enum InputDevice { KEYBOARD, MOUSE }
60+
61+
enum Key {
5162
UNKNOWN(-1),
63+
// Keyboard keys
5264
SPACE(32),
5365
APOSTROPHE(39),
5466
COMMA(44),
@@ -143,23 +155,23 @@ enum KeyboardKeys {
143155
F23(312),
144156
F24(313),
145157
F25(314),
146-
KP_0(320),
147-
KP_1(321),
148-
KP_2(322),
149-
KP_3(323),
150-
KP_4(324),
151-
KP_5(325),
152-
KP_6(326),
153-
KP_7(327),
154-
KP_8(328),
155-
KP_9(329),
156-
KP_DECIMAL(330),
157-
KP_DIVIDE(331),
158-
KP_MULTIPLY(332),
159-
KP_SUBTRACT(333),
160-
KP_ADD(334),
161-
KP_ENTER(335),
162-
KP_EQUAL(336),
158+
KEYPAD_0(320),
159+
KEYPAD_1(321),
160+
KEYPAD_2(322),
161+
KEYPAD_3(323),
162+
KEYPAD_4(324),
163+
KEYPAD_5(325),
164+
KEYPAD_6(326),
165+
KEYPAD_7(327),
166+
KEYPAD_8(328),
167+
KEYPAD_9(329),
168+
KEYPAD_DECIMAL(330),
169+
KEYPAD_DIVIDE(331),
170+
KEYPAD_MULTIPLY(332),
171+
KEYPAD_SUBTRACT(333),
172+
KEYPAD_ADD(334),
173+
KEYPAD_ENTER(335),
174+
KEYPAD_EQUAL(336),
163175
LEFT_SHIFT(340),
164176
LEFT_CONTROL(341),
165177
LEFT_ALT(342),
@@ -168,16 +180,26 @@ enum KeyboardKeys {
168180
RIGHT_CONTROL(345),
169181
RIGHT_ALT(346),
170182
RIGHT_SUPER(347),
171-
MENU(348);
183+
MENU(348),
184+
185+
// Mouse buttons
186+
MOUSE_LEFT(0),
187+
MOUSE_RIGHT(1),
188+
MOUSE_MIDDLE(2),
189+
MOUSE_BUTTON_4(3),
190+
MOUSE_BUTTON_5(4),
191+
MOUSE_BUTTON_6(5),
192+
MOUSE_BUTTON_7(6),
193+
MOUSE_BUTTON_8(7);
172194

173195
public final int code;
174196
public String alternateName;
175197

176-
KeyboardKeys(int code) {
198+
Key(int code) {
177199
this.code = code;
178200
}
179201

180-
KeyboardKeys(int code, String alternateName) {
202+
Key(int code, String alternateName) {
181203
this.code = code;
182204
this.alternateName = alternateName;
183205
}
@@ -186,6 +208,14 @@ public String getName() {
186208
return alternateName == null ? name() : alternateName;
187209
}
188210

189-
public static final Map<Integer, KeyboardKeys> keysByCode = Arrays.stream(KeyboardKeys.values()).collect(Collectors.toMap(key -> key.code, key -> key));
211+
public static final Int2ObjectMap<Key> keysByCode;
212+
213+
static {
214+
Key[] keys = Key.values();
215+
keysByCode = new Int2ObjectOpenHashMap<>(keys.length);
216+
for (Key key : keys) {
217+
keysByCode.put(key.code, key);
218+
}
219+
}
190220
}
191221
}

src/main/java/com/denizenscript/clientizen/mixin/KeyBindingMixin.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.denizenscript.clientizen.mixin;
22

3-
import com.denizenscript.clientizen.events.KeyPressReleaseEvent;
3+
import com.denizenscript.clientizen.events.KeyPressReleaseScriptEvent;
44
import it.unimi.dsi.fastutil.ints.IntArraySet;
55
import it.unimi.dsi.fastutil.ints.IntSet;
66
import net.minecraft.client.option.KeyBinding;
@@ -17,16 +17,15 @@ public class KeyBindingMixin {
1717

1818
@Inject(method = "setKeyPressed", at = @At("HEAD"))
1919
private static void clientizen$onKeyPressStateChanged(InputUtil.Key key, boolean pressed, CallbackInfo ci) {
20-
if (key.getCategory() == InputUtil.Type.KEYSYM) {
21-
int code = key.getCode();
22-
if (!pressed || !pressedKeys.contains(code)) {
23-
KeyPressReleaseEvent.instance.handleKeyPressStateChange(code, pressed);
20+
if (key.getCategory() == InputUtil.Type.KEYSYM || key.getCategory() == InputUtil.Type.MOUSE) {
21+
if (!pressed || !pressedKeys.contains(key.getCode())) {
22+
KeyPressReleaseScriptEvent.instance.handleKeyPressStateChange(key, pressed);
2423
}
2524
if (pressed) {
26-
pressedKeys.add(code);
25+
pressedKeys.add(key.getCode());
2726
}
2827
else {
29-
pressedKeys.remove(code);
28+
pressedKeys.remove(key.getCode());
3029
}
3130
}
3231
}

0 commit comments

Comments
 (0)