Skip to content

Commit

Permalink
Added // required: client option for scripts, rewrote keybind event…
Browse files Browse the repository at this point in the history
…s, fixed some PR issues
  • Loading branch information
LatvianModder committed Jan 21, 2025
1 parent 0a700f6 commit 9205ad7
Show file tree
Hide file tree
Showing 15 changed files with 274 additions and 145 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package dev.latvian.mods.kubejs.bindings;

import dev.latvian.mods.kubejs.util.Lazy;
import org.lwjgl.glfw.GLFW;

import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

public interface GLFWInputWrapper {
Lazy<Map<String, Integer>> MAP = Lazy.of(() -> {
var map = new HashMap<String, Integer>();

try {
for (var field : GLFW.class.getDeclaredFields()) {
int mod = field.getModifiers();

if (field.getType() == int.class && Modifier.isPublic(mod) && Modifier.isStatic(mod) && Modifier.isFinal(mod)) {
var n = field.getName();

if (n.startsWith("GLFW_KEY_") || n.startsWith("GLFW_MOUSE_") || n.startsWith("GLFW_GAMEPAD_") || n.startsWith("GLFW_CURSOR_")) {
map.put(n.substring(5), field.getInt(null));
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}

return Map.copyOf(map);
});

static int get(String name) {
return MAP.get().getOrDefault(name, -1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import dev.latvian.mods.kubejs.client.ClientPlayerKubeEvent;
import dev.latvian.mods.kubejs.client.DebugInfoKubeEvent;
import dev.latvian.mods.kubejs.client.EntityRendererRegistryKubeEvent;
import dev.latvian.mods.kubejs.client.KeybindRegistryKubeEvent;
import dev.latvian.mods.kubejs.client.LangKubeEvent;
import dev.latvian.mods.kubejs.client.MenuScreenRegistryKubeEvent;
import dev.latvian.mods.kubejs.client.ParticleProviderRegistryKubeEvent;
Expand All @@ -32,8 +31,4 @@ public interface ClientEvents {
TargetedEventHandler<ResourceLocation> ATLAS_SPRITE_REGISTRY = GROUP.client("atlasSpriteRegistry", () -> AtlasSpriteRegistryKubeEvent.class).requiredTarget(EventTargetType.ID);
TargetedEventHandler<String> LANG = GROUP.client("lang", () -> LangKubeEvent.class).requiredTarget(EventTargetType.STRING);
EventHandler PARTICLE_PROVIDER_REGISTRY = GROUP.client("particleProviderRegistry", () -> ParticleProviderRegistryKubeEvent.class);
EventHandler KEYBIND_REGISTRY = GROUP.startup("keybindRegistry", () -> KeybindRegistryKubeEvent.class);
TargetedEventHandler<String> KEY_DOWN = GROUP.client("keyDown", () -> ClientPlayerKubeEvent.class).requiredTarget(EventTargetType.STRING);
TargetedEventHandler<String> KEY_UP = GROUP.client("keyUp", () -> ClientPlayerKubeEvent.class).requiredTarget(EventTargetType.STRING);
TargetedEventHandler<String> KEY_PRESSED = GROUP.client("keyPressed", () -> ClientPlayerKubeEvent.class).requiredTarget(EventTargetType.STRING);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package dev.latvian.mods.kubejs.bindings.event;

import dev.latvian.mods.kubejs.client.KeybindRegistryKubeEvent;
import dev.latvian.mods.kubejs.client.KubeJSKeybinds;
import dev.latvian.mods.kubejs.event.EventGroup;
import dev.latvian.mods.kubejs.event.EventHandler;
import dev.latvian.mods.kubejs.event.TargetedEventHandler;

public interface KeyBindEvents {
EventGroup GROUP = EventGroup.of("KeyBindEvents");

EventHandler REGISTRY = GROUP.startup("registry", () -> KeybindRegistryKubeEvent.class);
TargetedEventHandler<KubeJSKeybinds.KubeKey> PRESSED = GROUP.client("pressed", () -> KubeJSKeybinds.KeyEvent.class).requiredTarget(KubeJSKeybinds.TARGET);
TargetedEventHandler<KubeJSKeybinds.KubeKey> RELEASED = GROUP.client("released", () -> KubeJSKeybinds.TickingKeyEvent.class).requiredTarget(KubeJSKeybinds.TARGET);
TargetedEventHandler<KubeJSKeybinds.KubeKey> TICK = GROUP.client("tick", () -> KubeJSKeybinds.TickingKeyEvent.class).requiredTarget(KubeJSKeybinds.TARGET);
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ static BlockStatePredicate wrap(Context cx, Object o) {

if (list.isEmpty()) {
return Simple.NONE;
} else {
} else if (list.size() > 1) {
var predicates = new ArrayList<BlockStatePredicate>();

for (var o1 : list) {
Expand All @@ -102,7 +102,8 @@ static BlockStatePredicate wrap(Context cx, Object o) {
return predicates.isEmpty() ? Simple.NONE : predicates.size() == 1 ? predicates.getFirst() : new OrMatch(predicates);
}

var map = cx.optionalMapOf(o);
var first = list.getFirst();
var map = cx.optionalMapOf(first);

if (map != null) {
if (map.isEmpty()) {
Expand All @@ -122,7 +123,7 @@ static BlockStatePredicate wrap(Context cx, Object o) {
return new AndMatch(predicates);
}

return ofSingle(cx, o);
return ofSingle(cx, first);
}

static RuleTest wrapRuleTest(Context cx, Object o) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package dev.latvian.mods.kubejs.client;

import dev.latvian.mods.kubejs.KubeJS;
import dev.latvian.mods.kubejs.bindings.GLFWInputWrapper;
import dev.latvian.mods.kubejs.bindings.event.ClientEvents;
import dev.latvian.mods.kubejs.bindings.event.KeyBindEvents;
import dev.latvian.mods.kubejs.event.EventGroupRegistry;
import dev.latvian.mods.kubejs.plugin.KubeJSPlugin;
import dev.latvian.mods.kubejs.script.BindingRegistry;
Expand All @@ -18,6 +20,7 @@ public class BuiltinKubeJSClientPlugin implements KubeJSPlugin {
@Override
public void registerEvents(EventGroupRegistry registry) {
registry.register(ClientEvents.GROUP);
registry.register(KeyBindEvents.GROUP);
}

@Override
Expand All @@ -32,6 +35,8 @@ public void registerBindings(BindingRegistry bindings) {
bindings.add("setInterval", new ScheduledEvents.TimeoutJSFunction(se, false, true));
bindings.add("clearInterval", new ScheduledEvents.TimeoutJSFunction(se, true, true));
}

bindings.add("GLFWInput", GLFWInputWrapper.MAP.get());
}

@Override
Expand All @@ -56,13 +61,14 @@ public void generateLang(LangKubeEvent event) {
}
}
}

KubeJSKeybinds.generateLang(event);
}

@Override
public void afterScriptsLoaded(ScriptManager manager) {
if (manager.scriptType != ScriptType.CLIENT) {
return;
if (manager.scriptType == ScriptType.CLIENT) {
KubeJSKeybinds.triggerReload();
}
KubeJSKeybinds.triggerReload();
}
}
Original file line number Diff line number Diff line change
@@ -1,50 +1,60 @@
package dev.latvian.mods.kubejs.client;

import com.mojang.blaze3d.platform.InputConstants;
import dev.latvian.mods.kubejs.util.ClassWrapper;
import dev.latvian.mods.kubejs.bindings.GLFWInputWrapper;
import dev.latvian.mods.rhino.util.HideFromJS;
import net.minecraft.client.KeyMapping;
import net.neoforged.neoforge.client.settings.KeyConflictContext;
import net.neoforged.neoforge.client.settings.KeyModifier;
import org.lwjgl.glfw.GLFW;

import java.util.ArrayList;
import java.util.List;

public class KeybindRegistryKubeEvent implements ClientKubeEvent {
private final List<Builder> builders = new ArrayList<>();
public final ClassWrapper<GLFW> GLFW = new ClassWrapper<>(GLFW.class);

public Builder register(String keybindId) {
Builder builder = new Builder(keybindId);
public Builder register(String id) {
var builder = new Builder(id);
builders.add(builder);
return builder;
}

public Builder register(String id, String defaultKey) {
return register(id).defaultKey(defaultKey);
}

@HideFromJS
public List<KubeJSKeybinds.KubeKeybind> build() {
public List<KubeJSKeybinds.KubeKey> build() {
return builders.stream().map(Builder::create).toList();
}

public static class Builder {
private final String id;
private KeyConflictContext keyConflictContext = KeyConflictContext.UNIVERSAL;
private KeyModifier keyModifier = KeyModifier.NONE;
private KeyModifier modifier = KeyModifier.NONE;
private InputConstants.Type inputType = InputConstants.Type.KEYSYM;
private int keyId = -1;
private int defaultKey = -1;
private String category = "key.categories.kubejs";

public Builder(String id) {
private Builder(String id) {
this.id = id;
}

public Builder keyConflictContext(KeyConflictContext keyConflictContext) {
public Builder conflictContext(KeyConflictContext keyConflictContext) {
this.keyConflictContext = keyConflictContext;
return this;
}

public Builder keyModifier(KeyModifier keyModifier) {
this.keyModifier = keyModifier;
public Builder gui() {
return conflictContext(KeyConflictContext.GUI);
}

public Builder inGame() {
return conflictContext(KeyConflictContext.IN_GAME);
}

public Builder modifier(KeyModifier modifier) {
this.modifier = modifier;
return this;
}

Expand All @@ -53,8 +63,16 @@ public Builder inputType(InputConstants.Type inputType) {
return this;
}

public Builder keyId(int keyId) {
this.keyId = keyId;
public Builder scanCodeInputType() {
return inputType(InputConstants.Type.SCANCODE);
}

public Builder mouseInputType() {
return inputType(InputConstants.Type.MOUSE);
}

public Builder defaultKey(String keyName) {
this.defaultKey = GLFWInputWrapper.get(keyName);
return this;
}

Expand All @@ -64,8 +82,10 @@ public Builder category(String category) {
}

@HideFromJS
public KubeJSKeybinds.KubeKeybind create() {
return new KubeJSKeybinds.KubeKeybind(id, new KeyMapping("key.kubejs.%s".formatted(id), keyConflictContext, keyModifier, inputType, keyId, category));
public KubeJSKeybinds.KubeKey create() {
var key = KubeJSKeybinds.getOrCreate(id);
key.mapping = new KeyMapping("key.kubejs.%s".formatted(id), keyConflictContext, modifier, inputType, defaultKey, category);
return key;
}
}
}
Loading

0 comments on commit 9205ad7

Please sign in to comment.