From 5e2f49d407031d01f3e6c137ce4fe17a47a66fc7 Mon Sep 17 00:00:00 2001 From: Sam Kirby Date: Mon, 8 Jul 2024 16:21:13 +0100 Subject: [PATCH] fix(infoacc): bearing now stays in expected range --- gradle.properties | 2 +- .../core/SevPatchesLoadingPlugin.java | 8 +++ .../core/SevPatchesTransformer.java | 2 + .../core/patches/PatchInfoAccCompass.java | 51 +++++++++++++++++++ src/main/resources/mcmod.info | 2 +- 5 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 src/main/java/tv/darkosto/sevpatches/core/patches/PatchInfoAccCompass.java diff --git a/gradle.properties b/gradle.properties index ff72872..4e88a6f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version_base = 1.12.0 +version_base = 1.13.0 # Sets default memory used for gradle commands. Can be overridden by user or command line properties. # This is required to provide enough memory for the Minecraft decompilation process. diff --git a/src/main/java/tv/darkosto/sevpatches/core/SevPatchesLoadingPlugin.java b/src/main/java/tv/darkosto/sevpatches/core/SevPatchesLoadingPlugin.java index fab1a47..3e66e1b 100644 --- a/src/main/java/tv/darkosto/sevpatches/core/SevPatchesLoadingPlugin.java +++ b/src/main/java/tv/darkosto/sevpatches/core/SevPatchesLoadingPlugin.java @@ -55,6 +55,10 @@ public class SevPatchesLoadingPlugin implements IFMLLoadingPlugin { public static String WOODEN_HOE; public static String PRISMARINE_SHARD; + public static String ENTITY_ROTATION_YAW; + public static String POSITIVE_MODULO; + public static String FLOOR; + public SevPatchesLoadingPlugin() { LOGGER.info("setting up mixin environment"); MixinBootstrap.init(); @@ -121,6 +125,10 @@ public void injectData(Map data) { SevPatchesLoadingPlugin.WOODEN_HOE = dev ? "WOODEN_HOE" : "field_151017_I"; SevPatchesLoadingPlugin.PRISMARINE_SHARD = dev ? "PRISMARINE_SHARD" : "field_179562_cC"; + + SevPatchesLoadingPlugin.ENTITY_ROTATION_YAW = dev ? "rotationYaw" : "field_70177_z"; + SevPatchesLoadingPlugin.POSITIVE_MODULO = dev ? "positiveModulo" : "func_188207_b"; + SevPatchesLoadingPlugin.FLOOR = dev ? "floor" : "func_76141_d"; } @Override diff --git a/src/main/java/tv/darkosto/sevpatches/core/SevPatchesTransformer.java b/src/main/java/tv/darkosto/sevpatches/core/SevPatchesTransformer.java index 139bc78..94f8253 100644 --- a/src/main/java/tv/darkosto/sevpatches/core/SevPatchesTransformer.java +++ b/src/main/java/tv/darkosto/sevpatches/core/SevPatchesTransformer.java @@ -40,6 +40,8 @@ public byte[] transform(String name, String transformedName, byte[] basicClass) return new PatchGalacticraftInventories(basicClass).apply(); case "micdoodle8.mods.galacticraft.planets.mars.entities.EntitySlimeling": return new PatchGalacticraftSlimeling(basicClass).apply(); + case "net.darkhax.infoaccessories.info.InfoType": + return new PatchInfoAccCompass(basicClass).apply(); default: return basicClass; } diff --git a/src/main/java/tv/darkosto/sevpatches/core/patches/PatchInfoAccCompass.java b/src/main/java/tv/darkosto/sevpatches/core/patches/PatchInfoAccCompass.java new file mode 100644 index 0000000..304224d --- /dev/null +++ b/src/main/java/tv/darkosto/sevpatches/core/patches/PatchInfoAccCompass.java @@ -0,0 +1,51 @@ +package tv.darkosto.sevpatches.core.patches; + +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.*; +import tv.darkosto.sevpatches.core.utils.AsmUtils; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import static tv.darkosto.sevpatches.core.SevPatchesLoadingPlugin.*; + +public class PatchInfoAccCompass extends Patch { + public PatchInfoAccCompass(byte[] inputClass) { + super(inputClass); + } + + @Override + protected boolean patch() { + MethodNode addDirectionInfo = AsmUtils.findMethod(this.classNode, "addDirectionInfo"); + if (addDirectionInfo == null) return false; + InsnList insnlist = addDirectionInfo.instructions; + + Iterable insnsIter = insnlist::iterator; + Stream insns = StreamSupport.stream(insnsIter.spliterator(), false); + + // - int yaw = MathHelper.floor(player.rotationYaw % 360.0); + List labels = insns.filter(insn -> insn instanceof LabelNode).collect(Collectors.toList()); + int startIndex = insnlist.indexOf(labels.get(0)) + 2; + int endIndex = insnlist.indexOf(labels.get(1)); + + for (int i = startIndex; i < endIndex; i++) { + AbstractInsnNode insn = insnlist.get(startIndex); + insnlist.remove(insn); + } + + // + int yaw = MathHelper.floor(MathHelper.positiveModulo(player.rotationYaw)); + InsnList modYaw = new InsnList(); + modYaw.add(new VarInsnNode(Opcodes.ALOAD, 1)); + modYaw.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/player/EntityPlayer", ENTITY_ROTATION_YAW, "F")); + modYaw.add(new LdcInsnNode(360.0f)); + modYaw.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "net/minecraft/util/math/MathHelper", POSITIVE_MODULO, "(FF)F", false)); + modYaw.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "net/minecraft/util/math/MathHelper", FLOOR, "(F)I", false)); + modYaw.add(new VarInsnNode(Opcodes.ISTORE, 3)); + + insnlist.insert(labels.get(0), modYaw); + + return true; + } +} diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index dea9c29..fc6919a 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "sevpatches", "name": "SevPatches", "description": "Consolidated patches for mods that are EOL used in SevTech: Ages", - "version": "1.12.0", + "version": "1.13.0", "mcversion": "1.12.2", "url": "https://www.curseforge.com/minecraft/mc-mods/sevpatches", "updateUrl": "",