diff --git a/src/main/java/net/minecraft/block/BlockLeavesBase.java b/src/main/java/net/minecraft/block/BlockLeavesBase.java index da0b8b2..ad7cdf4 100644 --- a/src/main/java/net/minecraft/block/BlockLeavesBase.java +++ b/src/main/java/net/minecraft/block/BlockLeavesBase.java @@ -29,9 +29,14 @@ Block block = p_149646_1_.getBlock(p_149646_2_, p_149646_3_, p_149646_4_); return !this.field_150121_P && block == this ? false : super.shouldSideBeRendered(p_149646_1_, p_149646_2_, p_149646_3_, p_149646_4_, p_149646_5_); } - + + /** + * This method added by UltraMine and may be replaced by mods. + * @see org.ultramine.server.asm.transformers.BlockLeavesBaseFixer + */ public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + // If you modifying this code, don't forget to change signature in BlockLeavesBaseFixer if(!world.isRemote && ((WorldServer)world).getConfig().settings.fastLeafDecay) { int meta = world.getBlockMetadata(x, y, z); diff --git a/src/main/java/org/ultramine/server/asm/transformers/BlockLeavesBaseFixer.java b/src/main/java/org/ultramine/server/asm/transformers/BlockLeavesBaseFixer.java new file mode 100644 index 0000000..a1350d3 --- /dev/null +++ b/src/main/java/org/ultramine/server/asm/transformers/BlockLeavesBaseFixer.java @@ -0,0 +1,75 @@ +package org.ultramine.server.asm.transformers; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.MethodNode; +import org.ultramine.server.asm.UMTBatchTransformer.IUMClassTransformer; +import org.ultramine.server.asm.UMTBatchTransformer.TransformResult; + +import java.util.Iterator; + +/** + * Removing conflicting {@link net.minecraft.block.BlockLeavesBase#onNeighborBlockChange} methods + */ +public class BlockLeavesBaseFixer implements IUMClassTransformer +{ + private static final Logger log = LogManager.getLogger(); + private static final String TARGET_METHOD_NAME = "onNeighborBlockChange"; + private static final String TARGET_METHOD_NAME_OBF = "func_149695_a"; + + @Override + public TransformResult transform(String name, String transformedName, ClassReader classReader, ClassNode classNode) + { + boolean modified = false; + int methodCount = 0; + for(MethodNode m : classNode.methods) + { + if(isTargetMethod(m.name)) + methodCount++; + } + + // removing ultramine method + if(methodCount > 1) + { + for(Iterator it = classNode.methods.iterator(); it.hasNext();) + { + MethodNode m = it.next(); + // ultramine BlockLeavesBase.onNeighborBlockChange signature + if(isTargetMethod(m.name) && m.maxStack == 8 && m.maxLocals == 7 && m.instructions.size() == 48) + { + log.warn("Method net.minecraft.block.BlockLeavesBase.onNeighborBlockChange() is now overridden by other mod, fastLeafDecay world setting will not work"); + it.remove(); + --methodCount; + modified = true; + break; + } + } + } + + // removing other mod methods if still conflicting + if(methodCount > 1) + { + for(Iterator it = classNode.methods.iterator(); it.hasNext();) + { + MethodNode m = it.next(); + if(isTargetMethod(m.name)) + { + log.warn("Removed conflicted method net.minecraft.block.BlockLeavesBase.onNeighborBlockChange()"); + it.remove(); + modified = true; + if(--methodCount == 1) + break; + } + } + } + + return modified ? TransformResult.MODIFIED : TransformResult.NOT_MODIFIED; + } + + private static boolean isTargetMethod(String name) + { + return name.equals(TARGET_METHOD_NAME) || name.equals(TARGET_METHOD_NAME_OBF); + } +} diff --git a/src/main/java/org/ultramine/server/asm/transformers/UMTransformerCollection.java b/src/main/java/org/ultramine/server/asm/transformers/UMTransformerCollection.java index 1e1b64b..abe143e 100644 --- a/src/main/java/org/ultramine/server/asm/transformers/UMTransformerCollection.java +++ b/src/main/java/org/ultramine/server/asm/transformers/UMTransformerCollection.java @@ -8,5 +8,6 @@ { registerGlobalTransformer(new PrintStackTraceTransformer()); registerGlobalTransformer(new TrigMathTransformer()); + registerSpecialTransformer(new BlockLeavesBaseFixer(), "net.minecraft.block.BlockLeavesBase"); } }