From 99fde997de096df4f573c16408b02d8a3a94a9a5 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Tue, 22 Mar 2022 11:30:49 +0100 Subject: [PATCH] BiomeUndergroundDecorator --- .../endlessids/asm/ClassEdit.java | 3 +- ...groundBiomesBiomeUndergroundDecorator.java | 46 ---------------- .../ubc/BiomeUndergroundDecoratorMixin.java | 52 +++++++++++++++++++ .../endlessids/mixin/plugin/Mixin.java | 3 +- 4 files changed, 55 insertions(+), 49 deletions(-) delete mode 100644 src/main/java/com/falsepattern/endlessids/asm/transformer/UndergroundBiomesBiomeUndergroundDecorator.java create mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/common/ubc/BiomeUndergroundDecoratorMixin.java diff --git a/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java b/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java index 75417bb..2838b25 100644 --- a/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java +++ b/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java @@ -3,7 +3,6 @@ package com.falsepattern.endlessids.asm; import java.util.HashMap; import com.falsepattern.endlessids.asm.transformer.WorldEditBaseBlock; import com.falsepattern.endlessids.asm.transformer.MFQM; -import com.falsepattern.endlessids.asm.transformer.UndergroundBiomesBiomeUndergroundDecorator; import com.falsepattern.endlessids.asm.transformer.CofhBlockHelper; import com.falsepattern.endlessids.asm.transformer.FmlRegistry; import java.util.Map; @@ -29,7 +28,7 @@ public enum ClassEdit FmlRegistry(new FmlRegistry(), new String[] { "cpw.mods.fml.common.registry.GameData", "cpw.mods.fml.common.registry.FMLControlledNamespacedRegistry" }), CofhBlockHelper(new CofhBlockHelper(), new String[] { "cofh.lib.util.helpers.BlockHelper" }), //UndergroundBiomesOreUBifier(new UndergroundBiomesOreUBifier(), new String[] { "exterminatorJeff.undergroundBiomes.worldGen.OreUBifier" }), - UndergroundBiomesBiomeUndergroundDecorator(new UndergroundBiomesBiomeUndergroundDecorator(), new String[] { "exterminatorJeff.undergroundBiomes.worldGen.BiomeUndergroundDecorator" }), + //UndergroundBiomesBiomeUndergroundDecorator(new UndergroundBiomesBiomeUndergroundDecorator(), new String[] { "exterminatorJeff.undergroundBiomes.worldGen.BiomeUndergroundDecorator" }), MFQM(new MFQM(), new String[] { "MoreFunQuicksandMod.main.MFQM" }), WorldEditBaseBlock(new WorldEditBaseBlock(), new String[] { "com.sk89q.worldedit.blocks.BaseBlock" }); diff --git a/src/main/java/com/falsepattern/endlessids/asm/transformer/UndergroundBiomesBiomeUndergroundDecorator.java b/src/main/java/com/falsepattern/endlessids/asm/transformer/UndergroundBiomesBiomeUndergroundDecorator.java deleted file mode 100644 index 9ea7d07..0000000 --- a/src/main/java/com/falsepattern/endlessids/asm/transformer/UndergroundBiomesBiomeUndergroundDecorator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.falsepattern.endlessids.asm.transformer; - -import java.util.ListIterator; -import org.objectweb.asm.tree.InsnList; -import org.objectweb.asm.tree.VarInsnNode; -import org.objectweb.asm.tree.MethodInsnNode; -import org.objectweb.asm.tree.AbstractInsnNode; -import org.objectweb.asm.tree.MethodNode; -import com.falsepattern.endlessids.asm.AsmUtil; -import com.falsepattern.endlessids.asm.Name; -import org.objectweb.asm.tree.ClassNode; -import com.falsepattern.endlessids.asm.IClassNodeTransformer; - -public class UndergroundBiomesBiomeUndergroundDecorator implements IClassNodeTransformer -{ - public UndergroundBiomesBiomeUndergroundDecorator() { - super(); - } - - @Override - public void transform(final ClassNode cn, final boolean obfuscated) { - MethodNode method = AsmUtil.findMethod(cn, Name.ub_bud_replaceChunkOres_world); - this.transformReplaceChunkOres(cn, method, obfuscated, 1); - method = AsmUtil.findMethod(cn, Name.ub_bud_replaceChunkOres_iChunkProvider); - this.transformReplaceChunkOres(cn, method, obfuscated, 0); - } - - private void transformReplaceChunkOres(final ClassNode cn, final MethodNode method, final boolean obfuscated, final int varOffset) { - final InsnList code = method.instructions; - final ListIterator iterator = (ListIterator)code.iterator(); - while (iterator.hasNext()) { - final AbstractInsnNode insn = (AbstractInsnNode)iterator.next(); - if (insn.getOpcode() == 182 && Name.ebs_getBlockLSBArray.matches((MethodInsnNode)insn, obfuscated)) { - iterator.remove(); - iterator.add((AbstractInsnNode)new VarInsnNode(21, 9 + varOffset)); - iterator.add((AbstractInsnNode)new VarInsnNode(21, 18 + varOffset)); - iterator.add((AbstractInsnNode)new VarInsnNode(21, 10 + varOffset)); - iterator.add((AbstractInsnNode)Name.hooks_getBlockId.staticInvocation(obfuscated)); - while (((AbstractInsnNode)iterator.next()).getOpcode() != 54) { - iterator.remove(); - } - break; - } - } - } -} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/ubc/BiomeUndergroundDecoratorMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/ubc/BiomeUndergroundDecoratorMixin.java new file mode 100644 index 0000000..950e502 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/ubc/BiomeUndergroundDecoratorMixin.java @@ -0,0 +1,52 @@ +package com.falsepattern.endlessids.mixin.mixins.common.ubc; + +import com.falsepattern.endlessids.mixin.helpers.IExtendedBlockStorageMixin; +import exterminatorJeff.undergroundBiomes.worldGen.BiomeUndergroundDecorator; +import exterminatorJeff.undergroundBiomes.worldGen.OreUBifier; +import net.minecraft.world.chunk.NibbleArray; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value = BiomeUndergroundDecorator.class, remap = false) +public abstract class BiomeUndergroundDecoratorMixin { + private static NibbleArray fakeArray; + private ThreadLocal ebs; + + @Redirect(method = {"replaceChunkOres(IILnet/minecraft/world/World;)V", "replaceChunkOres(Lnet/minecraft/world/chunk/IChunkProvider;II)V"}, + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;func_76658_g()[B"), + require = 2) + private byte[] returnMSBasLSB(ExtendedBlockStorage instance) { + if (ebs == null) ebs = new ThreadLocal<>(); + IExtendedBlockStorageMixin iebs = (IExtendedBlockStorageMixin) instance; + ebs.set(iebs); + return iebs.getMSB(); + } + + @Redirect(method = {"replaceChunkOres(IILnet/minecraft/world/World;)V", "replaceChunkOres(Lnet/minecraft/world/chunk/IChunkProvider;II)V"}, + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/storage/ExtendedBlockStorage;func_76660_i()Lnet/minecraft/world/chunk/NibbleArray;"), + require = 4) + private NibbleArray returnFakeArray(ExtendedBlockStorage instance) { + return fakeArray == null ? (fakeArray = new NibbleArray(4096, 4)) : fakeArray; + } + + @Redirect(method = {"replaceChunkOres(IILnet/minecraft/world/World;)V", "replaceChunkOres(Lnet/minecraft/world/chunk/IChunkProvider;II)V"}, + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/NibbleArray;func_76582_a(III)I"), + require = 2) + private int returnRestOfID(NibbleArray instance, int x, int y, int z) { + return ebs.get().getLSB()[y << 8 | z << 4 | x] & 0xFFFF; + } + + @Redirect(method = {"replaceChunkOres(IILnet/minecraft/world/World;)V", "replaceChunkOres(Lnet/minecraft/world/chunk/IChunkProvider;II)V"}, + at = @At(value = "INVOKE", + target = "LexterminatorJeff/undergroundBiomes/worldGen/OreUBifier;blockReplacer(I)LexterminatorJeff/undergroundBiomes/worldGen/OreUBifier$BlockReplacer;"), + require = 2) + private OreUBifier.BlockReplacer reshuffleID(OreUBifier instance, int blockID) { + blockID = ((blockID & 0xFF) << 16) | ((blockID & 0xFFFF00) >>> 8); + return instance.blockReplacer(blockID); + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java index 238069a..4fbcd9f 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java @@ -40,7 +40,8 @@ public enum Mixin { //END Minecraft //BEGIN UBC //BEGIN common - OreUBifierMixin(builder(Side.COMMON).target(TargetedMod.UBC).mixin("ubc.OreUBifierMixin")) + OreUBifierMixin(builder(Side.COMMON).target(TargetedMod.UBC).mixin("ubc.OreUBifierMixin")), + BiomeUndergroundDecoratorMixin(builder(Side.COMMON).target(TargetedMod.UBC).mixin("ubc.BiomeUndergroundDecoratorMixin")) //END common //END ubc ;