aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ftbsc
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/ftbsc')
-rw-r--r--src/main/java/ftbsc/bscv/Boscovicino.java17
-rw-r--r--src/main/java/ftbsc/bscv/system/Bindings.java89
-rw-r--r--src/main/java/ftbsc/bscv/system/Macros.java50
-rw-r--r--src/main/java/ftbsc/bscv/system/ModManager.java10
4 files changed, 161 insertions, 5 deletions
diff --git a/src/main/java/ftbsc/bscv/Boscovicino.java b/src/main/java/ftbsc/bscv/Boscovicino.java
index 8d6ab67..cf03753 100644
--- a/src/main/java/ftbsc/bscv/Boscovicino.java
+++ b/src/main/java/ftbsc/bscv/Boscovicino.java
@@ -6,9 +6,7 @@ import com.mojang.brigadier.tree.CommandNode;
import ftbsc.bscv.api.IModule;
import ftbsc.bscv.patches.CommandsPatch.CommandsBuiltEvent;
-import ftbsc.bscv.system.Friends;
-import ftbsc.bscv.system.ModManager;
-import ftbsc.bscv.system.Ruler;
+import ftbsc.bscv.system.*;
import net.minecraft.client.gui.screen.IngameMenuScreen;
import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.command.CommandSource;
@@ -27,6 +25,7 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.io.IOException;
@Mod("bscv")
public class Boscovicino implements ICommons {
@@ -34,7 +33,7 @@ public class Boscovicino implements ICommons {
public static final Logger LOGGER = LogManager.getLogger();
- public static ModManager modManager; //todo this should not be static
+ public static ModManager modManager; //todo rename
private final CommandDispatcher<CommandSource> dispatcher = new CommandDispatcher<>();
@@ -46,7 +45,10 @@ public class Boscovicino implements ICommons {
@SuppressWarnings("unused") // it just needs to exist to be used by player
private static Ruler ruler;
- public Boscovicino() {
+ public static Bindings bindings;
+ public static Macros macros;
+
+ public Boscovicino() throws IOException {
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSetupComplete);
ForgeConfigSpec.Builder cfg = new ForgeConfigSpec.Builder();
@@ -59,6 +61,10 @@ public class Boscovicino implements ICommons {
Boscovicino.ruler = new Ruler();
+ ForgeConfigSpec.Builder bindingSpec = new ForgeConfigSpec.Builder();
+ Boscovicino.bindings = new Bindings(bindingSpec);
+ Boscovicino.macros = new Macros();
+
Boscovicino.spec = cfg.build();
ForgeConfigSpec.Builder friendSpec = new ForgeConfigSpec.Builder();
@@ -67,6 +73,7 @@ public class Boscovicino implements ICommons {
// register config handler
ModLoadingContext.get().registerConfig(Type.CLIENT, spec, "bscv.toml");
ModLoadingContext.get().registerConfig(Type.CLIENT, friendSpec.build(), "friends.toml");
+ ModLoadingContext.get().registerConfig(Type.CLIENT, bindingSpec.build(), "bindings.toml");
// Register ourselves for server and other game events we are interested in
MinecraftForge.EVENT_BUS.register(this);
diff --git a/src/main/java/ftbsc/bscv/system/Bindings.java b/src/main/java/ftbsc/bscv/system/Bindings.java
new file mode 100644
index 0000000..7081d42
--- /dev/null
+++ b/src/main/java/ftbsc/bscv/system/Bindings.java
@@ -0,0 +1,89 @@
+package ftbsc.bscv.system;
+
+import ftbsc.bscv.Boscovicino;
+import ftbsc.bscv.api.IModule;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.settings.KeyBinding;
+import net.minecraft.client.util.InputMappings;
+import net.minecraftforge.client.event.InputEvent;
+import net.minecraftforge.common.ForgeConfigSpec;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.eventbus.api.SubscribeEvent;
+import net.minecraftforge.fml.client.registry.ClientRegistry;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+
+public class Bindings {
+ public static final int UNBOUND = InputMappings.UNKNOWN.getValue();
+
+ private final HashMap<KeyBinding, Runnable> executorMap;
+
+ private ForgeConfigSpec.ConfigValue<?> store;
+
+ public Bindings(ForgeConfigSpec.Builder spec) {
+ MinecraftForge.EVENT_BUS.register(this);
+ this.executorMap = new HashMap<>();
+ this.store = spec
+ //.comment("actual friend list")
+ .define("lol", () -> null, (u) -> {
+ System.out.println(u.getClass().getName());
+ return true;
+ });
+ }
+
+ public KeyBinding registerBinding(String name, int key, IModule module) {
+ KeyBinding kb = this.createBinding(name, key);
+ this.executorMap.put(kb, module::toggle);
+ return kb;
+ }
+
+ public KeyBinding registerBinding(String name, int key, String macroFileName) {
+ KeyBinding kb = this.createBinding(name, key);
+ this.executorMap.put(kb, () -> {
+ Boscovicino.macros.execute(macroFileName);
+ });
+ return kb;
+ }
+
+ private KeyBinding createBinding(String name, int key) {
+ KeyBinding kb = new KeyBinding(getBindName(name), UNBOUND, getCategory());
+ InputMappings.Input in = 0 <= key && key <= 7
+ ? InputMappings.Type.MOUSE.getOrCreate(key)
+ : InputMappings.Type.KEYSYM.getOrCreate(key);
+ kb.setKey(in);
+ ClientRegistry.registerKeyBinding(kb);
+ return kb;
+ }
+
+ @SubscribeEvent
+ public void onKeyPress(InputEvent.KeyInputEvent event) {
+ this.onKeyPress(event.getKey());
+ }
+
+ @SubscribeEvent
+ public void onKeyPress(InputEvent.MouseInputEvent event) {
+ this.onKeyPress(event.getButton());
+ }
+
+ //TODO on keybind change event
+ private void onKeyPress(int key) {
+ long windowId = Minecraft.getInstance().getWindow().getWindow();
+ for(KeyBinding kb : this.executorMap.keySet()) {
+ if(kb.getKey().getValue() == key) {
+ if(InputMappings.isKeyDown(windowId, key)) this.executorMap.get(kb).run();
+ return;
+ }
+ }
+ }
+
+ private static String getBindName(String name) {
+ return String.format("key.%s.%s", Boscovicino.MOD_ID, name);
+ }
+
+ private static String getCategory() {
+ return String.format("key.category.%s", Boscovicino.MOD_ID);
+ }
+}
diff --git a/src/main/java/ftbsc/bscv/system/Macros.java b/src/main/java/ftbsc/bscv/system/Macros.java
new file mode 100644
index 0000000..ca8d56f
--- /dev/null
+++ b/src/main/java/ftbsc/bscv/system/Macros.java
@@ -0,0 +1,50 @@
+package ftbsc.bscv.system;
+
+import ftbsc.bscv.Boscovicino;
+import party.iroiro.luajava.Lua;
+import party.iroiro.luajava.luajit.LuaJit;
+
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+
+public class Macros {
+ private final Lua lua;
+ private final HashMap<String, String> macroCache;
+
+ public Macros() throws IOException {
+ this.lua = new LuaJit();
+ this.lua.pushJavaClass(Boscovicino.class); //TODO use instance
+ this.lua.setGlobal("BSCV");
+ this.macroCache = new HashMap<>();
+
+ // load macros
+ Path path = Paths.get("macros/");
+ if(!Files.isDirectory(path)) {
+ Files.createDirectories(path);
+ }
+
+ //TODO lazy load setting
+ try(DirectoryStream<Path> stream = Files.newDirectoryStream(path, (p) -> p.toFile().isFile())) {
+ for(Path macro : stream) {
+ String name = macro.getFileName().toString();
+ if(name.endsWith(".lua")) {
+ String code = String.join("\n", Files.readAllLines(macro));
+ this.macroCache.put(name, code);
+ Boscovicino.bindings.registerBinding(name, Bindings.UNBOUND, name);
+ }
+ }
+ }
+ }
+
+ public boolean execute(String macroFilePath) {
+ String code = this.macroCache.get(macroFilePath);
+ if(code == null) return false;
+
+ this.lua.execute(code);
+ return true;
+ }
+}
diff --git a/src/main/java/ftbsc/bscv/system/ModManager.java b/src/main/java/ftbsc/bscv/system/ModManager.java
index 9420d44..9dea139 100644
--- a/src/main/java/ftbsc/bscv/system/ModManager.java
+++ b/src/main/java/ftbsc/bscv/system/ModManager.java
@@ -39,6 +39,16 @@ public class ModManager {
return null;
}
+ @Nullable
+ public IModule get(String name) {
+ for (IModule m : this.mods) {
+ if (m.getName().equals(name)) {
+ return m;
+ }
+ }
+ return null;
+ }
+
public void load() {
for (ILoadable module : ServiceLoader.load(ILoadable.class)) {
if(module instanceof IModule) {