diff --git a/gradle.properties b/gradle.properties index ab6d6db..1e01ed9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.11.2 # Mod Properties - mod_version = 0.2.0.0-SNAPSHOT + mod_version = 0.2.1.0-SNAPSHOT maven_group = pm.j4 archives_base_name = kerosene diff --git a/src/main/java/pm/j4/kerosene/KeroseneMod.java b/src/main/java/pm/j4/kerosene/KeroseneMod.java index f56a45b..65382e5 100644 --- a/src/main/java/pm/j4/kerosene/KeroseneMod.java +++ b/src/main/java/pm/j4/kerosene/KeroseneMod.java @@ -7,6 +7,7 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.minecraft.client.options.KeyBinding; import pm.j4.kerosene.modules.ExampleModule; import pm.j4.kerosene.modules.bindings.BindingManager; +import pm.j4.kerosene.modules.bindings.ChatCommands; import pm.j4.kerosene.util.config.ConfigHolder; import pm.j4.kerosene.util.config.ConfigManager; import pm.j4.kerosene.util.config.Module; @@ -21,6 +22,7 @@ import pm.j4.kerosene.util.module.ModuleFunction; @Module(ExampleModule.class) @Module(BindingManager.class) +@Module(ChatCommands.class) public class KeroseneMod implements ModInitializer { @Override public void onInitialize() { diff --git a/src/main/java/pm/j4/kerosene/mixin/ChatMessageMixin.java b/src/main/java/pm/j4/kerosene/mixin/ChatMessageMixin.java new file mode 100644 index 0000000..63a9bc8 --- /dev/null +++ b/src/main/java/pm/j4/kerosene/mixin/ChatMessageMixin.java @@ -0,0 +1,38 @@ +package pm.j4.kerosene.mixin; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import net.minecraft.client.network.ClientPlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import pm.j4.kerosene.modules.bindings.ChatCommands; +import pm.j4.kerosene.util.data.ChatCommand; + +@Mixin(ClientPlayerEntity.class) +public class ChatMessageMixin { + @Inject( + at = @At("HEAD"), + method = "sendChatMessage", + cancellable = true + ) + public void onChatMessage(String message, CallbackInfo ci) { + if(message.startsWith(".")) { + String[] args = message.split(" "); + String command = args[0].substring(1); + Optional matchingCommands = ChatCommands.findCommand(command); + + List newArgs = new ArrayList<>(); + for(int i = 1;i < args.length; i++) { + newArgs.add(args[i]); + } + + if (matchingCommands.isPresent()) { + matchingCommands.get().execute(newArgs); + } + ci.cancel(); + } + } +} diff --git a/src/main/java/pm/j4/kerosene/modules/ExampleModule.java b/src/main/java/pm/j4/kerosene/modules/ExampleModule.java index 3cf3fdc..91fdaa1 100644 --- a/src/main/java/pm/j4/kerosene/modules/ExampleModule.java +++ b/src/main/java/pm/j4/kerosene/modules/ExampleModule.java @@ -8,6 +8,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.options.KeyBinding; import net.minecraft.client.util.InputUtil; import org.lwjgl.glfw.GLFW; +import pm.j4.kerosene.util.data.ChatCommand; import pm.j4.kerosene.util.module.ModuleBase; import pm.j4.kerosene.util.module.ModuleFunction; import pm.j4.kerosene.util.module.option.BooleanOption; @@ -29,6 +30,26 @@ public class ExampleModule extends ModuleBase { true); } + @Override + protected List getChatCommands() { + List commands = new ArrayList<>(); + ChatCommand example = new ChatCommand("test") { + @Override + public void execute(List args) { + System.out.println("EXECUTED TEST COMMAND"); + args.forEach( + (arg) -> { + System.out.println("args: " + arg); + } + ); + } + }; + + commands.add(example); + + return commands; + } + @Override public List getDefaultConfig() { List options = new ArrayList<>(); diff --git a/src/main/java/pm/j4/kerosene/modules/bindings/ChatCommands.java b/src/main/java/pm/j4/kerosene/modules/bindings/ChatCommands.java new file mode 100644 index 0000000..29e078e --- /dev/null +++ b/src/main/java/pm/j4/kerosene/modules/bindings/ChatCommands.java @@ -0,0 +1,43 @@ +package pm.j4.kerosene.modules.bindings; + +import java.util.*; +import java.util.stream.Collectors; +import pm.j4.kerosene.util.data.ChatCommand; +import pm.j4.kerosene.util.module.ModuleBase; + +public class ChatCommands extends ModuleBase { + /** + * Instantiates a new Module base. + * Parameters should be constant across restarts. + */ + public ChatCommands() { + super("kerosene", + "kerosene.chatcommands", + "kerosene.misc", + false, + true, + false); + } + + private static Map commands = new HashMap<>(); + + public static void registerCommands(List commandList) { + for(ChatCommand command : commandList) { + if(commands.containsKey(command.getName())) { + return; + } + System.out.println("REGISTERING COMMAND " + command.getName()); + commands.put(command.getName(), command); + } + } + + public static Optional findCommand(String text) { + if (commands.containsKey(text)) { + return Optional.of(commands.get(text)); + } + else { + System.out.println("COULD NOT FIND CHAT COMMAND WITH NAME " + text); + return Optional.empty(); + } + } +} diff --git a/src/main/java/pm/j4/kerosene/util/data/ChatCommand.java b/src/main/java/pm/j4/kerosene/util/data/ChatCommand.java new file mode 100644 index 0000000..bd57ddc --- /dev/null +++ b/src/main/java/pm/j4/kerosene/util/data/ChatCommand.java @@ -0,0 +1,17 @@ +package pm.j4.kerosene.util.data; + +import java.util.List; + +public abstract class ChatCommand { + public ChatCommand(String name) { + this.name = name; + } + + private final String name; + + public String getName() { + return name; + } + + public abstract void execute(List args); +} diff --git a/src/main/java/pm/j4/kerosene/util/module/ModuleBase.java b/src/main/java/pm/j4/kerosene/util/module/ModuleBase.java index 63cd829..4ca883d 100644 --- a/src/main/java/pm/j4/kerosene/util/module/ModuleBase.java +++ b/src/main/java/pm/j4/kerosene/util/module/ModuleBase.java @@ -9,8 +9,10 @@ import net.minecraft.text.TranslatableText; import pm.j4.kerosene.gui.PModuleConfigEntry; import pm.j4.kerosene.gui.PModuleConfigPane; import pm.j4.kerosene.modules.bindings.BindingManager; +import pm.j4.kerosene.modules.bindings.ChatCommands; import pm.j4.kerosene.util.config.ConfigHolder; import pm.j4.kerosene.util.config.ConfigManager; +import pm.j4.kerosene.util.data.ChatCommand; import pm.j4.kerosene.util.module.option.ConfigurationOption; /** @@ -45,6 +47,7 @@ public abstract class ModuleBase { */ public void init() { BindingManager.registerBindings(this); + ChatCommands.registerCommands(this.getChatCommands()); } /** @@ -253,6 +256,10 @@ public abstract class ModuleBase { return Optional.empty(); } + protected List getChatCommands() { + return new ArrayList<>(); + }; + private Map attachedBinds = new HashMap<>(); public Map getDefaultBindings() { diff --git a/src/main/resources/kerosene.mixins.json b/src/main/resources/kerosene.mixins.json index b498c12..d043c3f 100644 --- a/src/main/resources/kerosene.mixins.json +++ b/src/main/resources/kerosene.mixins.json @@ -7,7 +7,8 @@ ], "client": [ "EntryListWidgetAccessor", - "OptionsMenuMixin" + "OptionsMenuMixin", + "ChatMessageMixin" ], "injectors": { "defaultRequire": 1