From d2d7bc97bb4c187130e8ca72d05c2cae7951f53b Mon Sep 17 00:00:00 2001 From: Tamaized <9671313+Tamaized@users.noreply.github.com> Date: Fri, 21 Jun 2024 11:56:00 -0400 Subject: [PATCH] Port IsRainingAtTransformer --- src/main/java/twilightforest/ASMHooks.java | 9 +-- src/main/resources/META-INF/asm/cloud.js | 42 ------------- src/main/resources/META-INF/coremods.json | 1 - .../java/twilightforest/asm/TFCoreMod.java | 6 +- .../cloud/IsRainingAtTransformer.java | 62 +++++++++++++++++++ 5 files changed, 72 insertions(+), 48 deletions(-) delete mode 100644 src/main/resources/META-INF/asm/cloud.js create mode 100644 tf-asm/src/main/java/twilightforest/asm/transformers/cloud/IsRainingAtTransformer.java diff --git a/src/main/java/twilightforest/ASMHooks.java b/src/main/java/twilightforest/ASMHooks.java index dc043ff311..a0d66753c0 100644 --- a/src/main/java/twilightforest/ASMHooks.java +++ b/src/main/java/twilightforest/ASMHooks.java @@ -253,11 +253,12 @@ public static int shroom(int o, LevelReader level, BlockPos pos) { } /** - * Injection Point:
- * {@link net.minecraft.world.level.Level#isRainingAt(BlockPos)}
- * [BEFORE ALOAD] + * {@link twilightforest.asm.transformers.cloud.IsRainingAtTransformer}

+ * + * Injection Point:
+ * {@link net.minecraft.world.level.Level#isRainingAt(BlockPos)} */ - public static boolean cloud(boolean isRaining, Level level, BlockPos pos) { + public static boolean isRainingAt(boolean isRaining, Level level, BlockPos pos) { if (!isRaining && TFConfig.commonCloudBlockPrecipitationDistance > 0) { LevelChunk chunk = level.getChunkAt(pos); for (int y = pos.getY(); y < pos.getY() + TFConfig.commonCloudBlockPrecipitationDistance; y++) { diff --git a/src/main/resources/META-INF/asm/cloud.js b/src/main/resources/META-INF/asm/cloud.js deleted file mode 100644 index 495d800e71..0000000000 --- a/src/main/resources/META-INF/asm/cloud.js +++ /dev/null @@ -1,42 +0,0 @@ -// noinspection ES6ConvertVarToLetConst - -var ASM = Java.type('net.neoforged.coremod.api.ASMAPI'); -var Opcodes = Java.type('org.objectweb.asm.Opcodes'); - -var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); -var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); - -// noinspection JSUnusedGlobalSymbols -function initializeCoreMod() { - ASM.loadFile('META-INF/asm/util/util.js'); - return { - 'cloud': { - 'target': { - 'type': 'METHOD', - 'class': 'net.minecraft.world.level.Level', - 'methodName': 'isRainingAt', - 'methodDesc': '(Lnet/minecraft/core/BlockPos;)Z' - }, - 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { - var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; - findAllInstructions(methodNode, Opcodes.IRETURN).forEach((/*org.objectweb.asm.tree.AbstractInsnNode*/ value) => { - instructions.insertBefore( - value, - ASM.listOf( - new VarInsnNode(Opcodes.ALOAD, 0), - new VarInsnNode(Opcodes.ALOAD, 1), - new MethodInsnNode( - Opcodes.INVOKESTATIC, - 'twilightforest/ASMHooks', - 'cloud', - '(ZLnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Z', - false - ) - ) - ) - }); - return methodNode; - } - } - } -} diff --git a/src/main/resources/META-INF/coremods.json b/src/main/resources/META-INF/coremods.json index c519c40b7b..e7af0ee1be 100644 --- a/src/main/resources/META-INF/coremods.json +++ b/src/main/resources/META-INF/coremods.json @@ -7,7 +7,6 @@ "mount": "META-INF/asm/mount.js", "conquered": "META-INF/asm/conquered.js", "shroom": "META-INF/asm/shroom.js", - "cloud": "META-INF/asm/cloud.js", "lead": "META-INF/asm/lead.js", "structure_terraform": "META-INF/asm/structure_terraform.js", "structure_scan": "META-INF/asm/structure_scan.js" diff --git a/tf-asm/src/main/java/twilightforest/asm/TFCoreMod.java b/tf-asm/src/main/java/twilightforest/asm/TFCoreMod.java index 466fd7cd8b..33e902072a 100644 --- a/tf-asm/src/main/java/twilightforest/asm/TFCoreMod.java +++ b/tf-asm/src/main/java/twilightforest/asm/TFCoreMod.java @@ -7,6 +7,7 @@ import twilightforest.asm.transformers.armor.CancelArmorRenderingTransformer; import twilightforest.asm.transformers.book.ModifyWrittenBookNameTransformer; import twilightforest.asm.transformers.chunk.ChunkStatusTaskTransformer; +import twilightforest.asm.transformers.cloud.IsRainingAtTransformer; import java.util.List; @@ -23,7 +24,10 @@ public Iterable> getTransformers() { new ModifyWrittenBookNameTransformer(), // chunk - new ChunkStatusTaskTransformer() + new ChunkStatusTaskTransformer(), + + // cloud + new IsRainingAtTransformer() ); } } \ No newline at end of file diff --git a/tf-asm/src/main/java/twilightforest/asm/transformers/cloud/IsRainingAtTransformer.java b/tf-asm/src/main/java/twilightforest/asm/transformers/cloud/IsRainingAtTransformer.java new file mode 100644 index 0000000000..67891cacb8 --- /dev/null +++ b/tf-asm/src/main/java/twilightforest/asm/transformers/cloud/IsRainingAtTransformer.java @@ -0,0 +1,62 @@ +package twilightforest.asm.transformers.cloud; + +import cpw.mods.modlauncher.api.ITransformer; +import cpw.mods.modlauncher.api.ITransformerVotingContext; +import cpw.mods.modlauncher.api.TargetType; +import cpw.mods.modlauncher.api.TransformerVoteResult; +import net.neoforged.coremod.api.ASMAPI; +import org.jetbrains.annotations.NotNull; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.VarInsnNode; +import twilightforest.asm.AsmUtil; + +import java.util.Set; + +/** + * {@link twilightforest.ASMHooks#isRainingAt} + */ +public class IsRainingAtTransformer implements ITransformer { + + @Override + public @NotNull MethodNode transform(MethodNode node, ITransformerVotingContext context) { + AsmUtil.findInstructions( + node, + Opcodes.IRETURN + ).forEach(target -> node.instructions.insertBefore( + target, + ASMAPI.listOf( + new VarInsnNode(Opcodes.ALOAD, 0), + new VarInsnNode(Opcodes.ALOAD, 1), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + "twilightforest/ASMHooks", + "isRainingAt", + "(ZLnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Z" + ) + ) + )); + return node; + } + + @Override + public @NotNull TransformerVoteResult castVote(ITransformerVotingContext context) { + return TransformerVoteResult.YES; + } + + @Override + public @NotNull Set> targets() { + return Set.of(Target.targetMethod( + "net.minecraft.world.level.Level", + "isRainingAt", + "(Lnet/minecraft/core/BlockPos;)Z" + )); + } + + @Override + public @NotNull TargetType getTargetType() { + return TargetType.METHOD; + } + +}