From 3baab7fe7897a818b25aefa5d923a6fc61b1741c Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 5 Feb 2020 19:33:18 -0500 Subject: [PATCH] added key binding system --- .../seedcracker/gui/GuiScreen.java | 7 ++- .../seedcracker/init/KeyBindings.java | 43 +++++++++++++++++++ .../mixin/ClientPlayNetworkHandlerMixin.java | 2 +- .../mixin/ClientPlayerEntityMixin.java | 9 +++- .../seedcracker/mixin/GameOptionsMixin.java | 36 ++++++++++++++++ .../seedcracker/mixin/KeyBindingMixin.java | 24 +++++++++++ .../assets/seedcracker/lang/en_us.json | 4 ++ src/main/resources/seedcracker.mixins.json | 4 +- 8 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 src/main/java/kaptainwutax/seedcracker/init/KeyBindings.java create mode 100644 src/main/java/kaptainwutax/seedcracker/mixin/GameOptionsMixin.java create mode 100644 src/main/java/kaptainwutax/seedcracker/mixin/KeyBindingMixin.java create mode 100644 src/main/resources/assets/seedcracker/lang/en_us.json diff --git a/src/main/java/kaptainwutax/seedcracker/gui/GuiScreen.java b/src/main/java/kaptainwutax/seedcracker/gui/GuiScreen.java index 1d392fe..ce7cb46 100644 --- a/src/main/java/kaptainwutax/seedcracker/gui/GuiScreen.java +++ b/src/main/java/kaptainwutax/seedcracker/gui/GuiScreen.java @@ -5,7 +5,7 @@ import net.minecraft.text.LiteralText; public class GuiScreen extends Screen { - protected GuiScreen(String name) { + public GuiScreen(String name) { super(new LiteralText(name)); } @@ -14,4 +14,9 @@ public class GuiScreen extends Screen { this.renderBackground(); } + @Override + public boolean isPauseScreen() { + return false; + } + } diff --git a/src/main/java/kaptainwutax/seedcracker/init/KeyBindings.java b/src/main/java/kaptainwutax/seedcracker/init/KeyBindings.java new file mode 100644 index 0000000..91e9f93 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/init/KeyBindings.java @@ -0,0 +1,43 @@ +package kaptainwutax.seedcracker.init; + +import kaptainwutax.seedcracker.util.Log; +import net.minecraft.client.options.KeyBinding; + +import java.util.LinkedHashSet; + +public class KeyBindings { + + public static LinkedHashSet KEY_REGISTRY = new LinkedHashSet<>(); + public static LinkedHashSet CATEGORY_REGISTRY = new LinkedHashSet<>(); + + public static KeyBinding OPEN_MENU = new KeyBinding(getName("open_menu"), 'M', getCategory("seedcracker")); + + static { + registerKeyBinding(OPEN_MENU); + } + + /* + * Registers keys and their categories. Remember that everything is FIFO. + */ + private static void registerKeyBinding(KeyBinding keyBinding) { + if(keyBinding == null) { + throw new NullPointerException("Cannot register a null key binding!"); + } else { + KEY_REGISTRY.add(keyBinding); + CATEGORY_REGISTRY.add(keyBinding.getCategory()); + Log.debug("Registering key [" + keyBinding.getName() + ", " + keyBinding.getId() + "] from category [" + keyBinding.getCategory() + "]."); + } + } + + /* + * Generates the category and key prefixes for the language files. + */ + public static String getCategory(String registryName) { + return "key.categories." + registryName; + } + + public static String getName(String registryName) { + return "key." + registryName.toLowerCase(); + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayNetworkHandlerMixin.java index ce54609..a37ae99 100644 --- a/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayNetworkHandlerMixin.java @@ -3,7 +3,7 @@ package kaptainwutax.seedcracker.mixin; import com.mojang.authlib.GameProfile; import com.mojang.brigadier.CommandDispatcher; import kaptainwutax.seedcracker.SeedCracker; -import kaptainwutax.seedcracker.command.ClientCommands; +import kaptainwutax.seedcracker.init.ClientCommands; import kaptainwutax.seedcracker.cracker.storage.HashedSeedData; import kaptainwutax.seedcracker.finder.FinderQueue; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayerEntityMixin.java b/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayerEntityMixin.java index da34d8c..9c214be 100644 --- a/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/kaptainwutax/seedcracker/mixin/ClientPlayerEntityMixin.java @@ -2,7 +2,10 @@ package kaptainwutax.seedcracker.mixin; import com.mojang.brigadier.StringReader; import kaptainwutax.seedcracker.SeedCracker; -import kaptainwutax.seedcracker.command.ClientCommands; +import kaptainwutax.seedcracker.gui.GuiScreen; +import kaptainwutax.seedcracker.init.ClientCommands; +import kaptainwutax.seedcracker.init.KeyBindings; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -17,6 +20,10 @@ public abstract class ClientPlayerEntityMixin { @Inject(method = "tick", at = @At("HEAD")) private void tick(CallbackInfo ci) { SeedCracker.get().getDataStorage().tick(); + + if(MinecraftClient.getInstance().currentScreen == null && KeyBindings.OPEN_MENU.isPressed()) { + MinecraftClient.getInstance().openScreen(new GuiScreen("Test")); + } } @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/kaptainwutax/seedcracker/mixin/GameOptionsMixin.java b/src/main/java/kaptainwutax/seedcracker/mixin/GameOptionsMixin.java new file mode 100644 index 0000000..c3d05e9 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/mixin/GameOptionsMixin.java @@ -0,0 +1,36 @@ +package kaptainwutax.seedcracker.mixin; + +import kaptainwutax.seedcracker.init.KeyBindings; +import net.minecraft.client.options.GameOptions; +import net.minecraft.client.options.KeyBinding; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Iterator; + +@Mixin(GameOptions.class) +public class GameOptionsMixin { + + @Shadow public KeyBinding[] keysAll; + + @Inject(method = "", at = @At("RETURN")) + private void init(CallbackInfo ci) { + KeyBinding[] oldKeys = this.keysAll; + KeyBinding[] newKeys = new KeyBinding[oldKeys.length + KeyBindings.KEY_REGISTRY.size()]; + Iterator keyBindingIterator = KeyBindings.KEY_REGISTRY.iterator(); + + for(int i = 0; i < newKeys.length; i++) { + if(i < oldKeys.length) { + newKeys[i] = oldKeys[i]; + } else { + newKeys[i] = keyBindingIterator.next(); + } + } + + this.keysAll = newKeys; + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/mixin/KeyBindingMixin.java b/src/main/java/kaptainwutax/seedcracker/mixin/KeyBindingMixin.java new file mode 100644 index 0000000..6abadb5 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/mixin/KeyBindingMixin.java @@ -0,0 +1,24 @@ +package kaptainwutax.seedcracker.mixin; + +import kaptainwutax.seedcracker.init.KeyBindings; +import net.minecraft.client.options.KeyBinding; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + +@Mixin(KeyBinding.class) +public class KeyBindingMixin { + + @Shadow @Final private static Map categoryOrderMap; + + static { + int start = categoryOrderMap.size(); + + for(String category: KeyBindings.CATEGORY_REGISTRY) { + categoryOrderMap.put(category, start++); + } + } + +} diff --git a/src/main/resources/assets/seedcracker/lang/en_us.json b/src/main/resources/assets/seedcracker/lang/en_us.json new file mode 100644 index 0000000..bb18606 --- /dev/null +++ b/src/main/resources/assets/seedcracker/lang/en_us.json @@ -0,0 +1,4 @@ +{ + "key.categories.seedcracker": "Seed Cracker", + "key.open_menu": "Open Menu" +} \ No newline at end of file diff --git a/src/main/resources/seedcracker.mixins.json b/src/main/resources/seedcracker.mixins.json index a86a770..98380e0 100644 --- a/src/main/resources/seedcracker.mixins.json +++ b/src/main/resources/seedcracker.mixins.json @@ -9,7 +9,9 @@ "GameRendererMixin", "ClientPlayNetworkHandlerMixin", "ClientWorldMixin", - "ClientPlayerEntityMixin" + "ClientPlayerEntityMixin", + "GameOptionsMixin", + "KeyBindingMixin" ], "injectors": { "defaultRequire": 1