From 823523e93cdd80c4ed4b048bf151da5b41ba5494 Mon Sep 17 00:00:00 2001 From: asbyth Date: Mon, 9 Nov 2020 09:23:15 -0500 Subject: [PATCH] new: check wither visibility before spawning particles fixes https://github.com/sp614x/optifine/issues/3616 --- src/main/java/club/sk1er/patcher/Patcher.java | 12 +--- .../sk1er/patcher/config/PatcherConfig.java | 4 +- .../patcher/tweaker/ClassTransformer.java | 2 + .../tweaker/asm/FontRendererTransformer.java | 3 +- .../witherfix/EntityWitherTransformer.java | 59 +++++++++++++++++++ 5 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 src/main/java/club/sk1er/patcher/tweaker/asm/optifine/witherfix/EntityWitherTransformer.java diff --git a/src/main/java/club/sk1er/patcher/Patcher.java b/src/main/java/club/sk1er/patcher/Patcher.java index 9433b9cfa..b80f7abe9 100644 --- a/src/main/java/club/sk1er/patcher/Patcher.java +++ b/src/main/java/club/sk1er/patcher/Patcher.java @@ -306,27 +306,21 @@ public void connectToServer(FMLNetworkEvent.ClientConnectedToServerEvent event) return; } - String serverIP = Minecraft.getMinecraft().getCurrentServerData().serverIP; + final String serverIP = Minecraft.getMinecraft().getCurrentServerData().serverIP; if (blacklistedServers.contains(serverIP)) { logger.info("Current server supports 1.11+, but doesn't allow for 1.8.9 to use a high chat length, setting to 100."); GuiChatTransformer.maxChatLength = 100; return; } - CompletableFuture future = ProtocolDetector.instance.isCompatibleWithVersion( + final CompletableFuture future = ProtocolDetector.instance.isCompatibleWithVersion( serverIP, 315 // 1.11 ); Multithreading.runAsync(() -> { try { - if (future.get()) { - logger.info("Server supports 1.11+, setting string length to 256."); - GuiChatTransformer.maxChatLength = 256; - } else { - logger.info("Server doesn't support 1.11+, setting string length to 100."); - GuiChatTransformer.maxChatLength = 100; - } + GuiChatTransformer.maxChatLength = future.get() ? 256 : 100; } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/club/sk1er/patcher/config/PatcherConfig.java b/src/main/java/club/sk1er/patcher/config/PatcherConfig.java index e74607931..0d00ed5ee 100644 --- a/src/main/java/club/sk1er/patcher/config/PatcherConfig.java +++ b/src/main/java/club/sk1er/patcher/config/PatcherConfig.java @@ -404,11 +404,11 @@ public class PatcherConfig extends Vigilant { public static boolean futureHitBoxes = true; @Property( - type = PropertyType.SWITCH, name = "Clean Text Shadow", + type = PropertyType.SWITCH, name = "Alternate Text Shadow", description = "Change the text shadow to only move down rather than moving to the side.", category = "Miscellaneous", subcategory = "Rendering" ) - public static boolean cleanTextShadow; + public static boolean alternateTextShadow; @Property( type = PropertyType.SWITCH, name = "Add Text Shadow to Nametags", diff --git a/src/main/java/club/sk1er/patcher/tweaker/ClassTransformer.java b/src/main/java/club/sk1er/patcher/tweaker/ClassTransformer.java index 825112d8d..061f80c64 100644 --- a/src/main/java/club/sk1er/patcher/tweaker/ClassTransformer.java +++ b/src/main/java/club/sk1er/patcher/tweaker/ClassTransformer.java @@ -137,6 +137,7 @@ import club.sk1er.patcher.tweaker.asm.lwjgl.WindowsDisplayTransformer; import club.sk1er.patcher.tweaker.asm.lwjgl.WindowsKeycodesTransformer; import club.sk1er.patcher.tweaker.asm.optifine.InventoryPlayerTransformer; +import club.sk1er.patcher.tweaker.asm.optifine.witherfix.EntityWitherTransformer; import club.sk1er.patcher.tweaker.asm.util.ForcePublicTransformer; import club.sk1er.patcher.tweaker.transform.PatcherTransformer; import com.google.common.collect.ArrayListMultimap; @@ -302,6 +303,7 @@ public ClassTransformer() { registerTransformer(new ArmorStandRendererTransformer()); registerTransformer(new BlockFluidRendererTransformer()); registerTransformer(new GuiOptionsTransformer()); + registerTransformer(new EntityWitherTransformer()); // forge classes registerTransformer(new ClientCommandHandlerTransformer()); diff --git a/src/main/java/club/sk1er/patcher/tweaker/asm/FontRendererTransformer.java b/src/main/java/club/sk1er/patcher/tweaker/asm/FontRendererTransformer.java index c045730a4..c41b7e4a2 100644 --- a/src/main/java/club/sk1er/patcher/tweaker/asm/FontRendererTransformer.java +++ b/src/main/java/club/sk1er/patcher/tweaker/asm/FontRendererTransformer.java @@ -11,7 +11,6 @@ package club.sk1er.patcher.tweaker.asm; -import club.sk1er.patcher.config.PatcherConfig; import club.sk1er.patcher.tweaker.transform.PatcherTransformer; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; @@ -83,7 +82,7 @@ public void transform(ClassNode classNode, String name) { private InsnList insertCleanShadowLabel() { final InsnList list = new InsnList(); - list.add(new FieldInsnNode(Opcodes.GETSTATIC, getPatcherConfigClass(), "cleanTextShadow", "Z")); + list.add(new FieldInsnNode(Opcodes.GETSTATIC, getPatcherConfigClass(), "alternateTextShadow", "Z")); final LabelNode ifeq = new LabelNode(); list.add(new JumpInsnNode(Opcodes.IFEQ, ifeq)); list.add(new VarInsnNode(Opcodes.FLOAD, 2)); diff --git a/src/main/java/club/sk1er/patcher/tweaker/asm/optifine/witherfix/EntityWitherTransformer.java b/src/main/java/club/sk1er/patcher/tweaker/asm/optifine/witherfix/EntityWitherTransformer.java new file mode 100644 index 000000000..6c5d1b80c --- /dev/null +++ b/src/main/java/club/sk1er/patcher/tweaker/asm/optifine/witherfix/EntityWitherTransformer.java @@ -0,0 +1,59 @@ +package club.sk1er.patcher.tweaker.asm.optifine.witherfix; + +import club.sk1er.patcher.tweaker.transform.PatcherTransformer; +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.InsnNode; +import org.objectweb.asm.tree.JumpInsnNode; +import org.objectweb.asm.tree.LabelNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.VarInsnNode; + +import java.util.ListIterator; + +public class EntityWitherTransformer implements PatcherTransformer { + @Override + public String[] getClassName() { + return new String[]{"net.minecraft.entity.boss.EntityWither"}; + } + + @Override + public void transform(ClassNode classNode, String name) { + for (MethodNode method : classNode.methods) { + final String methodName = mapMethodName(classNode, method); + + if (methodName.equals("onLivingUpdate") || methodName.equals("func_70636_d")) { + final ListIterator iterator = method.instructions.iterator(); + + while (iterator.hasNext()) { + final AbstractInsnNode next = iterator.next(); + + if (next instanceof MethodInsnNode && next.getOpcode() == Opcodes.INVOKEVIRTUAL) { + final String methodInsnName = mapMethodNameFromNode(next); + + if ((methodInsnName.equals("isArmored") || methodInsnName.equals("func_82205_o")) && next.getNext().getOpcode() == Opcodes.ISTORE) { + method.instructions.insertBefore(next.getNext().getNext(), checkVisibility()); + break; + } + } + } + + break; + } + } + } + + private InsnList checkVisibility() { + InsnList list = new InsnList(); + list.add(new VarInsnNode(Opcodes.ALOAD, 0)); + list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/boss/EntityWither", "func_82150_aj", "()Z", false)); + LabelNode ifeq = new LabelNode(); + list.add(new JumpInsnNode(Opcodes.IFEQ, ifeq)); + list.add(new InsnNode(Opcodes.RETURN)); + list.add(ifeq); + return list; + } +}