diff --git a/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java b/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java index 633703f..2b9cdb2 100644 --- a/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java +++ b/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java @@ -11,7 +11,6 @@ import com.falsepattern.endlessids.asm.transformer.VanillaItemInWorldManager; import com.falsepattern.endlessids.asm.transformer.VanillaPlayerControllerMP; import com.falsepattern.endlessids.asm.transformer.VanillaS26PacketMapChunkBulk; import com.falsepattern.endlessids.asm.transformer.VanillaS24PacketBlockActivation; -import com.falsepattern.endlessids.asm.transformer.VanillaS22PacketMultiBlockChange; import java.util.Map; public enum ClassEdit @@ -25,7 +24,7 @@ public enum ClassEdit //VanillaDataWatcher(new VanillaDataWatcher(), new String[] { "net.minecraft.entity.DataWatcher" }), //VanillaNetHandlerPlayClient(new VanillaNetHandlerPlayClient(), new String[] { "net.minecraft.client.network.NetHandlerPlayClient" }), //VanillaS21PacketChunkData(new VanillaS21PacketChunkData(), new String[] { "net.minecraft.network.play.server.S21PacketChunkData" }), - VanillaS22PacketMultiBlockChange(new VanillaS22PacketMultiBlockChange(), new String[] { "net.minecraft.network.play.server.S22PacketMultiBlockChange" }), + //VanillaS22PacketMultiBlockChange(new VanillaS22PacketMultiBlockChange(), new String[] { "net.minecraft.network.play.server.S22PacketMultiBlockChange" }), VanillaS24PacketBlockActivation(new VanillaS24PacketBlockActivation(), new String[] { "net.minecraft.network.play.server.S24PacketBlockAction" }), VanillaS26PacketMapChunkBulk(new VanillaS26PacketMapChunkBulk(), new String[] { "net.minecraft.network.play.server.S26PacketMapChunkBulk" }), //VanillaRenderGlobal(new VanillaRenderGlobal(), new String[] { "net.minecraft.client.renderer.RenderGlobal" }), diff --git a/src/main/java/com/falsepattern/endlessids/asm/transformer/VanillaS22PacketMultiBlockChange.java b/src/main/java/com/falsepattern/endlessids/asm/transformer/VanillaS22PacketMultiBlockChange.java deleted file mode 100644 index 1bf2707..0000000 --- a/src/main/java/com/falsepattern/endlessids/asm/transformer/VanillaS22PacketMultiBlockChange.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.falsepattern.endlessids.asm.transformer; - -import java.util.ListIterator; -import org.objectweb.asm.tree.InsnList; -import org.objectweb.asm.tree.MethodNode; -import com.falsepattern.endlessids.asm.AsmTransformException; -import org.objectweb.asm.tree.VarInsnNode; -import org.objectweb.asm.tree.MethodInsnNode; -import org.objectweb.asm.tree.InsnNode; -import org.objectweb.asm.tree.AbstractInsnNode; -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 VanillaS22PacketMultiBlockChange implements IClassNodeTransformer -{ - public VanillaS22PacketMultiBlockChange() { - super(); - } - - @Override - public void transform(final ClassNode cn, final boolean obfuscated) { - final MethodNode method = AsmUtil.findMethod(cn, Name.s22_init_server); - final InsnList code = method.instructions; - int part = 0; - final ListIterator iterator = (ListIterator)code.iterator(); - while (iterator.hasNext()) { - final AbstractInsnNode insn = (AbstractInsnNode)iterator.next(); - if (part == 0) { - if (insn.getOpcode() != 7) { - continue; - } - iterator.set((AbstractInsnNode)new InsnNode(8)); - ++part; - } - else if (part == 1) { - if (insn.getOpcode() != 184) { - continue; - } - final MethodInsnNode node = (MethodInsnNode)insn; - if (!Name.block_getIdFromBlock.matches(node, obfuscated)) { - continue; - } - iterator.add((AbstractInsnNode)new MethodInsnNode(182, "java/io/DataOutputStream", "writeShort", "(I)V", false)); - ++part; - } - else if (part == 2) { - if (insn.getOpcode() == 25) { - ++part; - } - else { - iterator.remove(); - } - } - else if (part == 3) { - if (insn.getOpcode() != 182) { - continue; - } - iterator.add((AbstractInsnNode)new VarInsnNode(25, 6)); - iterator.add((AbstractInsnNode)new InsnNode(95)); - iterator.add((AbstractInsnNode)new MethodInsnNode(182, "java/io/DataOutputStream", "writeByte", "(I)V", false)); - ++part; - } - else { - iterator.remove(); - if (insn.getOpcode() == 182) { - return; - } - continue; - } - } - throw new AsmTransformException("no match for part " + part); - } -} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/S22PacketMultiBlockChangeMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/S22PacketMultiBlockChangeMixin.java new file mode 100644 index 0000000..d848714 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/S22PacketMultiBlockChangeMixin.java @@ -0,0 +1,37 @@ +package com.falsepattern.endlessids.mixin.mixins.common; + +import net.minecraft.block.Block; +import net.minecraft.network.play.server.S22PacketMultiBlockChange; +import net.minecraft.world.chunk.Chunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.io.DataOutputStream; +import java.io.IOException; + +@Mixin(S22PacketMultiBlockChange.class) +public abstract class S22PacketMultiBlockChangeMixin { + private int id; + private int meta; + @Redirect(method = "(I[SLnet/minecraft/world/chunk/Chunk;)V", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;getBlock(III)Lnet/minecraft/block/Block;"), + require = 1) + private Block extractBlockInfo(Chunk instance, int x, int y, int z) { + Block block = instance.getBlock(x, y, z); + id = Block.getIdFromBlock(block); + meta = instance.getBlockMetadata(x, y, z); + return block; + } + + @Redirect(method = "(I[SLnet/minecraft/world/chunk/Chunk;)V", + at = @At(value = "INVOKE", + target = "Ljava/io/DataOutputStream;writeShort(I)V", + ordinal = 1), + require = 1) + private void hackWrite(DataOutputStream instance, int value) throws IOException { + instance.writeShort(id); + instance.writeByte(meta); + } +} 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 b1159a1..49f9778 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java @@ -17,6 +17,7 @@ public enum Mixin { WorldMixin(builder(Side.COMMON).mixin("WorldMixin")), ExtendedBlockStorageMixin(builder(Side.COMMON).mixin("ExtendedBlockStorageMixin")), S21PacketChunkDataMixin(builder(Side.COMMON).mixin("S21PacketChunkDataMixin")), + S22PacketMultiBlockChangeMixin(builder(Side.COMMON).mixin("S22PacketMultiBlockChangeMixin")), NetHandlerPlayClientMixin(builder(Side.CLIENT).mixin("NetHandlerPlayClientMixin")), RenderGlobalMixin(builder(Side.CLIENT).mixin("RenderGlobalMixin")), ;