diff options
Diffstat (limited to 'src/main/java/ftbsc')
-rw-r--r-- | src/main/java/ftbsc/bscv/Boscovicino.java | 17 | ||||
-rw-r--r-- | src/main/java/ftbsc/bscv/system/Bindings.java | 89 | ||||
-rw-r--r-- | src/main/java/ftbsc/bscv/system/Macros.java | 50 | ||||
-rw-r--r-- | src/main/java/ftbsc/bscv/system/ModManager.java | 10 |
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) { |