Skip to content

Commit 7fa9ac3

Browse files
committed
Add support to prevent Thaumcraft Taint Biome spread.
1 parent 1f314a6 commit 7fa9ac3

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

src/main/java/myessentials/DepLoader.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public String[] getASMTransformerClass() {
2929
"myessentials.classtransformers.AE2PlaceTransformer",
3030
"myessentials.classtransformers.BlockFarmlandTransformer",
3131
"myessentials.classtransformers.BlockFireTransformer",
32+
"myessentials.classtransformers.BlockTaintFibersTransformer",
3233
"myessentials.classtransformers.EntityFireballTransformer",
3334
"myessentials.classtransformers.EntityThrowableTransformer",
3435
"myessentials.classtransformers.SignClassTransformer"
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package myessentials.classtransformers;
2+
3+
import net.minecraft.launchwrapper.IClassTransformer;
4+
import net.minecraft.world.World;
5+
6+
import org.objectweb.asm.*;
7+
import org.objectweb.asm.commons.GeneratorAdapter;
8+
9+
/**
10+
* Patches BlockTaintFibers to add a hook for the {@link myessentials.event.ModifyBlockEvent}.
11+
* <br/>
12+
*
13+
*/
14+
public class BlockTaintFibersTransformer implements IClassTransformer {
15+
16+
private class BlockTaintFibersGeneratorAdapter extends GeneratorAdapter {
17+
18+
protected BlockTaintFibersGeneratorAdapter(MethodVisitor mv, int access, String name, String desc) {
19+
super(Opcodes.ASM4, mv, access, name, desc);
20+
}
21+
22+
@Override
23+
public void visitJumpInsn(int opcode, Label label) {
24+
super.visitJumpInsn(opcode, label);
25+
if(opcode == Opcodes.IF_ICMPLT) {
26+
super.visitVarInsn(Opcodes.ALOAD, 0);
27+
super.visitVarInsn(Opcodes.ILOAD, 1);
28+
super.visitVarInsn(Opcodes.ILOAD, 6);
29+
super.visitInsn(Opcodes.IADD);
30+
super.visitVarInsn(Opcodes.ILOAD, 3);
31+
super.visitVarInsn(Opcodes.ILOAD, 7);
32+
super.visitInsn(Opcodes.IADD);
33+
super.visitMethodInsn(Opcodes.INVOKESTATIC, "myessentials/event/ModifyBiomeEvent", "checkBiome", "(Lnet/minecraft/world/World;II)Z", false);
34+
35+
Label elseLabel = new Label();
36+
super.visitJumpInsn(Opcodes.IFEQ, elseLabel);
37+
super.visitInsn(Opcodes.RETURN);
38+
super.visitLabel(elseLabel);
39+
}
40+
}
41+
}
42+
43+
@Override
44+
public byte[] transform(String name, String srgName, byte[] bytes) {
45+
if("thaumcraft.common.blocks.BlockTaintFibres".equals(srgName)) {
46+
ClassReader reader = new ClassReader(bytes);
47+
ClassWriter writer = new ClassWriter(reader, Opcodes.ASM4);
48+
49+
ClassVisitor visitor = new ClassVisitor(Opcodes.ASM4, writer) {
50+
@Override
51+
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
52+
MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
53+
54+
if("taintBiomeSpread".equals(name)) {
55+
return new BlockTaintFibersGeneratorAdapter(methodVisitor, access, name, desc);
56+
}
57+
58+
return methodVisitor;
59+
}
60+
};
61+
62+
reader.accept(visitor, ClassReader.EXPAND_FRAMES);
63+
64+
bytes = writer.toByteArray();
65+
}
66+
67+
return bytes;
68+
}
69+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package myessentials.event;
2+
3+
import cpw.mods.fml.common.eventhandler.Cancelable;
4+
import cpw.mods.fml.common.eventhandler.Event;
5+
import net.minecraft.block.Block;
6+
import net.minecraftforge.common.MinecraftForge;
7+
import net.minecraft.world.World;
8+
9+
/**
10+
* Fired when a biome is about to be modified.
11+
* If the event is canceled the biome is not modified.
12+
*/
13+
@Cancelable
14+
public class ModifyBiomeEvent extends Event
15+
{
16+
public final int x;
17+
public final int z;
18+
public final World world;
19+
20+
public ModifyBiomeEvent(World world, int x, int z) {
21+
this.x = x;
22+
this.z = z;
23+
this.world = world;
24+
}
25+
26+
@SuppressWarnings("unused")
27+
public static boolean checkBiome(World world, int x, int z) {
28+
return MinecraftForge.EVENT_BUS.post(new ModifyBiomeEvent(world, x, z));
29+
}
30+
}

0 commit comments

Comments
 (0)