summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-02-22 22:05:15 +0100
committerLinnea Gräf <nea@nea.moe>2024-02-22 22:06:01 +0100
commitaef074886b587745bd814fe965d55e7b4cf11a07 (patch)
treeacc62b9aaf9f95bdce17a85683c42cbec93fe800 /src/main/java
parente8196b0b5e02ec21f75109ab7aba8d48220c8d05 (diff)
downloadKowalski-aef074886b587745bd814fe965d55e7b4cf11a07.tar.gz
Kowalski-aef074886b587745bd814fe965d55e7b4cf11a07.tar.bz2
Kowalski-aef074886b587745bd814fe965d55e7b4cf11a07.zip
Add event cancellation watcher
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/moe/nea/kowalski/KowalskiCommand.kt61
-rw-r--r--src/main/java/moe/nea/kowalski/init/EventClassTransformer.java47
-rw-r--r--src/main/java/moe/nea/kowalski/init/KowalskiTweaker.java29
3 files changed, 137 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/kowalski/KowalskiCommand.kt b/src/main/java/moe/nea/kowalski/KowalskiCommand.kt
new file mode 100644
index 0000000..b2a975a
--- /dev/null
+++ b/src/main/java/moe/nea/kowalski/KowalskiCommand.kt
@@ -0,0 +1,61 @@
+package moe.nea.kowalski
+
+import net.minecraft.client.Minecraft
+import net.minecraft.command.CommandBase
+import net.minecraft.command.ICommandSender
+import net.minecraft.util.BlockPos
+import net.minecraft.util.ChatComponentText
+
+object KowalskiCommand : CommandBase() {
+ override fun getCommandName(): String {
+ return "kowalski"
+ }
+
+ override fun canCommandSenderUseCommand(sender: ICommandSender?): Boolean {
+ return true
+ }
+
+ override fun getCommandUsage(sender: ICommandSender?): String {
+ return ""
+ }
+
+
+ override fun addTabCompletionOptions(
+ sender: ICommandSender?,
+ args: Array<out String>,
+ pos: BlockPos?
+ ): List<String> {
+ return when (args.size) {
+ 1 -> getListOfStringsMatchingLastWord(args, "whocancels")
+ 2 -> when (args[0]) {
+ "whocancels" -> getListOfStringsMatchingLastWord(args, "ClientChatReceivedEvent")
+ else -> emptyList()
+ }
+ else -> emptyList()
+ }
+ }
+
+ fun chat(text: String) {
+ Minecraft.getMinecraft().ingameGUI.chatGUI.printChatMessage(ChatComponentText("§e[§fKW§e]§r $text"))
+ }
+
+ override fun processCommand(sender: ICommandSender, args: Array<out String>) {
+ when (args.firstOrNull()) {
+ "whocancels" -> {
+ if (args.size != 2) {
+ chat("§cPlease provide an event to listen to: §bwhocancels <eventname>")
+ return
+ }
+ val eventName = args[1]
+ if (eventName in Kowalski.watchedEvents) {
+ Kowalski.watchedEvents.remove(eventName)
+ chat("§fRemoved §c$eventName §ffrom watched events")
+ } else {
+ Kowalski.watchedEvents.add(eventName)
+ chat("§fAdded §b$eventName §fto watched events")
+ }
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/moe/nea/kowalski/init/EventClassTransformer.java b/src/main/java/moe/nea/kowalski/init/EventClassTransformer.java
new file mode 100644
index 0000000..a80a5b5
--- /dev/null
+++ b/src/main/java/moe/nea/kowalski/init/EventClassTransformer.java
@@ -0,0 +1,47 @@
+package moe.nea.kowalski.init;
+
+import net.minecraft.launchwrapper.IClassTransformer;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.*;
+
+import java.util.ListIterator;
+
+public class EventClassTransformer implements IClassTransformer {
+ @Override
+ public byte[] transform(String name, String transformedName, byte[] basicClass) {
+ if (!"net.minecraftforge.fml.common.eventhandler.Event".equals(name))
+ return basicClass;
+ ClassNode classNode = new ClassNode();
+ ClassReader classReader = new ClassReader(basicClass);
+ classReader.accept(classNode, 0);
+ for (MethodNode method : classNode.methods) {
+ if (method.name.equals("setCanceled")) {
+ transformCancelMethod(method);
+ }
+ }
+ ClassWriter writer = new ClassWriter(0);
+ classNode.accept(writer);
+ return writer.toByteArray();
+ }
+
+ private void transformCancelMethod(MethodNode method) {
+ ListIterator<AbstractInsnNode> iterator =
+ method.instructions.iterator();
+ while (iterator.hasNext()) {
+ AbstractInsnNode insn = iterator.next();
+ if (insn.getOpcode() != Opcodes.PUTFIELD) {
+ continue;
+ }
+ method.instructions.insert(insn, buildCallKowalski());
+ }
+ }
+
+ private InsnList buildCallKowalski() {
+ InsnList insnList = new InsnList();
+ insnList.add(new VarInsnNode(Opcodes.ALOAD, 0));
+ insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "moe/nea/kowalski/Kowalski", "eventIsBeingCancelled", "(Lnet/minecraftforge/fml/common/eventhandler/Event;)V", false));
+ return insnList;
+ }
+}
diff --git a/src/main/java/moe/nea/kowalski/init/KowalskiTweaker.java b/src/main/java/moe/nea/kowalski/init/KowalskiTweaker.java
new file mode 100644
index 0000000..4cb836c
--- /dev/null
+++ b/src/main/java/moe/nea/kowalski/init/KowalskiTweaker.java
@@ -0,0 +1,29 @@
+package moe.nea.kowalski.init;
+
+import net.minecraft.launchwrapper.ITweaker;
+import net.minecraft.launchwrapper.LaunchClassLoader;
+
+import java.io.File;
+import java.util.List;
+
+public class KowalskiTweaker implements ITweaker {
+ @Override
+ public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile) {
+
+ }
+
+ @Override
+ public void injectIntoClassLoader(LaunchClassLoader classLoader) {
+classLoader.registerTransformer("moe.nea.kowalski.init.EventClassTransformer");
+ }
+
+ @Override
+ public String getLaunchTarget() {
+ return null;
+ }
+
+ @Override
+ public String[] getLaunchArguments() {
+ return new String[0];
+ }
+}