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 extends ITransformer>> 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;
+ }
+
+}