Skip to content

Commit

Permalink
Add support to prevent Thaumcraft Taint Biome spread.
Browse files Browse the repository at this point in the history
  • Loading branch information
krwminer committed Dec 7, 2015
1 parent 1f314a6 commit 7fa9ac3
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/main/java/myessentials/DepLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public String[] getASMTransformerClass() {
"myessentials.classtransformers.AE2PlaceTransformer",
"myessentials.classtransformers.BlockFarmlandTransformer",
"myessentials.classtransformers.BlockFireTransformer",
"myessentials.classtransformers.BlockTaintFibersTransformer",
"myessentials.classtransformers.EntityFireballTransformer",
"myessentials.classtransformers.EntityThrowableTransformer",
"myessentials.classtransformers.SignClassTransformer"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package myessentials.classtransformers;

import net.minecraft.launchwrapper.IClassTransformer;
import net.minecraft.world.World;

import org.objectweb.asm.*;
import org.objectweb.asm.commons.GeneratorAdapter;

/**
* Patches BlockTaintFibers to add a hook for the {@link myessentials.event.ModifyBlockEvent}.
* <br/>
*
*/
public class BlockTaintFibersTransformer implements IClassTransformer {

private class BlockTaintFibersGeneratorAdapter extends GeneratorAdapter {

protected BlockTaintFibersGeneratorAdapter(MethodVisitor mv, int access, String name, String desc) {
super(Opcodes.ASM4, mv, access, name, desc);
}

@Override
public void visitJumpInsn(int opcode, Label label) {
super.visitJumpInsn(opcode, label);
if(opcode == Opcodes.IF_ICMPLT) {
super.visitVarInsn(Opcodes.ALOAD, 0);
super.visitVarInsn(Opcodes.ILOAD, 1);
super.visitVarInsn(Opcodes.ILOAD, 6);
super.visitInsn(Opcodes.IADD);
super.visitVarInsn(Opcodes.ILOAD, 3);
super.visitVarInsn(Opcodes.ILOAD, 7);
super.visitInsn(Opcodes.IADD);
super.visitMethodInsn(Opcodes.INVOKESTATIC, "myessentials/event/ModifyBiomeEvent", "checkBiome", "(Lnet/minecraft/world/World;II)Z", false);

Label elseLabel = new Label();
super.visitJumpInsn(Opcodes.IFEQ, elseLabel);
super.visitInsn(Opcodes.RETURN);
super.visitLabel(elseLabel);
}
}
}

@Override
public byte[] transform(String name, String srgName, byte[] bytes) {
if("thaumcraft.common.blocks.BlockTaintFibres".equals(srgName)) {
ClassReader reader = new ClassReader(bytes);
ClassWriter writer = new ClassWriter(reader, Opcodes.ASM4);

ClassVisitor visitor = new ClassVisitor(Opcodes.ASM4, writer) {
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);

if("taintBiomeSpread".equals(name)) {
return new BlockTaintFibersGeneratorAdapter(methodVisitor, access, name, desc);
}

return methodVisitor;
}
};

reader.accept(visitor, ClassReader.EXPAND_FRAMES);

bytes = writer.toByteArray();
}

return bytes;
}
}
30 changes: 30 additions & 0 deletions src/main/java/myessentials/event/ModifyBiomeEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package myessentials.event;

import cpw.mods.fml.common.eventhandler.Cancelable;
import cpw.mods.fml.common.eventhandler.Event;
import net.minecraft.block.Block;
import net.minecraftforge.common.MinecraftForge;
import net.minecraft.world.World;

/**
* Fired when a biome is about to be modified.
* If the event is canceled the biome is not modified.
*/
@Cancelable
public class ModifyBiomeEvent extends Event
{
public final int x;
public final int z;
public final World world;

public ModifyBiomeEvent(World world, int x, int z) {
this.x = x;
this.z = z;
this.world = world;
}

@SuppressWarnings("unused")
public static boolean checkBiome(World world, int x, int z) {
return MinecraftForge.EVENT_BUS.post(new ModifyBiomeEvent(world, x, z));
}
}

0 comments on commit 7fa9ac3

Please sign in to comment.