Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Rsge

Members
  • Joined

  • Last visited

Everything posted by Rsge

  1. That's why I'm trying to update it so it does work. I don't think Vazkii will disable these checks as they have their security reasons. Also, it seems to be different on different servers/modpacks, as another 1.12.2-modpack I played didn't have this issue - at least not as bad as in the other pack. So I don't think this is necessarily a bug in Psi itself... - I'll report it regardless, if he still does 1.12.2-fixes...
  2. Hi. I am trying to write a small coremod for my 1.12.2 private server to disable the "Moved wrongly" and maybe the "Moved too quickly" checks in NetHandlerPlayServer, as it is very buggy with Psi's Blink-spell, just teleports you back constantly. First of all, I know this is a security risk because of hacking, but as I said, it's a private server so I don't care about that. Second, I sadly don't have much experience in modding Minecraft and especially not in bytecode and that sort of stuff in Java. So I got most of the code from this post and just tried to update it for 1.12.2. But according to the printlns I added in analyzeClass the methods I need to patch (processVehicleMove and processPlayer) aren't even scanned through. So I don't know if I'm doing the scanning wrong or if there is something else. Everything else seems to work, the mod is loaded and is shown in the Mods-section as expected, so the error must be in this class. Any help would be appreciated. Thanks : ) package rsge.mods.blinkfixer.asm; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.JumpInsnNode; import org.objectweb.asm.tree.LabelNode; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodNode; import net.minecraft.launchwrapper.IClassTransformer; /** * Removes the "Moved Wrongly" checks from {@link net.minecraft.network.NetHandlerPlayServer} * * @author Rsge */ public class NetHandlerPlayServerTransformer implements IClassTransformer { private static enum MovedWronglyState { FIND_LDC, FIND_DCMPL, FIND_IFLE, DONE } /** * Before: LDC2_W 0.0625 DCMPL IFLE <label> (code to execute if the value was greater) After: LDC2_W 0.0625 DCMPL IFLE <label> GOTO <same label> (code that * no longer ever gets executed) I leave the IFLE in just so the DCMPL result gets popped off the stack */ private boolean disableMovedWrongly(MethodNode node) { MovedWronglyState state = MovedWronglyState.FIND_LDC; InsnList insnList = node.instructions; AbstractInsnNode insn = insnList.getFirst(); AbstractInsnNode patchTarget = null; LabelNode gotoLabel = null; while (insn != null && state != MovedWronglyState.DONE) { switch (state) { case FIND_LDC: if (insn.getOpcode() == Opcodes.LDC) { Object value = ((LdcInsnNode) insn).cst; // 0.0625 is 1/16, which can be perfectly represented by a float (power of two denominator) if (value instanceof Double && ((Double) value).doubleValue() == 0.0625) { state = MovedWronglyState.FIND_DCMPL; } } break; case FIND_DCMPL: if (insn.getOpcode() == Opcodes.DCMPL) { state = MovedWronglyState.FIND_IFLE; } else { state = MovedWronglyState.FIND_LDC; } break; case FIND_IFLE: if (insn.getOpcode() == Opcodes.IFLE) { state = MovedWronglyState.DONE; gotoLabel = ((JumpInsnNode) insn).label; patchTarget = insn; } else { state = MovedWronglyState.FIND_LDC; } break; case DONE: break; default: break; } insn = insn.getNext(); } if (state == MovedWronglyState.DONE) { applyGotoPatch(insnList, gotoLabel, patchTarget); return true; } else { return false; } } /* ————————————————————————————————————————————————————— */ private static enum MovedTooQuicklyState { FIND_LDC, FIND_DCMPL, FIND_IFLE, DONE } /** * Before: LDC2_W 100.0 DCMPL IFLE <label> (code to execute if the value was greater) After: LDC2_W 100.0 DCMPL IFLE <label> GOTO <same label> (code that no * longer ever gets executed) As above, I leave the IFLE in so the DCMPL result gets popped off the stack */ private boolean disableMovedTooQuickly(MethodNode node) { MovedTooQuicklyState state = MovedTooQuicklyState.FIND_LDC; InsnList insnList = node.instructions; AbstractInsnNode insn = insnList.getFirst(); AbstractInsnNode patchTarget = null; LabelNode gotoLabel = null; while (insn != null && state != MovedTooQuicklyState.DONE) { switch (state) { case FIND_LDC: if (insn.getOpcode() == Opcodes.LDC) { Object value = ((LdcInsnNode) insn).cst; if (value instanceof Double && ((Double) value).doubleValue() == 100.0) { state = MovedTooQuicklyState.FIND_DCMPL; } } break; case FIND_DCMPL: if (insn.getOpcode() == Opcodes.DCMPL) { state = MovedTooQuicklyState.FIND_IFLE; } else { state = MovedTooQuicklyState.FIND_LDC; } break; case FIND_IFLE: if (insn.getOpcode() == Opcodes.IFLE) { state = MovedTooQuicklyState.DONE; gotoLabel = ((JumpInsnNode) insn).label; patchTarget = insn; } else { state = MovedTooQuicklyState.FIND_LDC; } break; case DONE: break; default: break; } insn = insn.getNext(); } if (state == MovedTooQuicklyState.DONE) { applyGotoPatch(insnList, gotoLabel, patchTarget); return true; } else { return false; } } /* ————————————————————————————————————————————————————— */ private void applyGotoPatch(InsnList instr, LabelNode lbl, AbstractInsnNode trg) { instr.insert(trg, generatePatch(lbl)); } private InsnList generatePatch(LabelNode lbl) { InsnList list = new InsnList(); list.add(new JumpInsnNode(Opcodes.GOTO, lbl)); return list; } /* ————————————————————————————————————————————————————— */ private boolean analyzeClass(ClassNode node) { boolean successVehicleMove = false; boolean successProcessPlayer = false; for (MethodNode method : node.methods) { System.out.println("Method: " + method.name); // Method processVehicleMove if (method.name.equals("a") && method.desc.equals("(Lll;)V")) { successVehicleMove = disableMovedTooQuickly(method) && disableMovedWrongly(method); } // Method processPlayer if (method.name.equals("a") && method.desc.equals("(Llk;)V")) { successProcessPlayer = disableMovedTooQuickly(method) && disableMovedWrongly(method); } } if (!(successVehicleMove && successProcessPlayer)) System.out.println("Unabled to find method to patch"); return successVehicleMove && successProcessPlayer; } @Override public byte[] transform(String name, String transname, byte[] bytes) { if (transname.contains("net.minecraft.network")) System.out.println(name + "; " + transname); if (transname.contains("net.minecraft.network.NetHandlerPlayServer")) { System.out.println("Class to transform: " + transname); ClassReader reader = new ClassReader(bytes); ClassNode node = new ClassNode(); reader.accept(node, 0); if (analyzeClass(node)) { ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); node.accept(writer); bytes = writer.toByteArray(); } else { System.out.println("Failed to patch methods"); } } return bytes; } }

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.