From 60bc4e250cb759fd6531afce985cd02a9754f4bf Mon Sep 17 00:00:00 2001 From: Su5eD Date: Thu, 8 Aug 2024 23:20:55 +0200 Subject: [PATCH 1/8] Replace failing entity attributes during loading Fixes #1298 --- .github/workflows/release.yml | 4 +-- build.gradle.kts | 23 +++++++-------- gradle.properties | 4 +-- .../mod/compat/LazyEntityAttributes.java | 6 +++- .../mixin/AttributeSupplierBuilderMixin.java | 28 +++++++++++++++++++ src/mod/resources/connector.mixins.json | 1 + 6 files changed, 48 insertions(+), 18 deletions(-) create mode 100644 src/mod/java/org/sinytra/connector/mod/mixin/AttributeSupplierBuilderMixin.java diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d183597f..b3962f0c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,7 +36,7 @@ jobs: with: distribution: 'microsoft' java-version: '21' - - uses: gradle/wrapper-validation-action@v1 + - uses: gradle/actions/wrapper-validation@v3 - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 with: @@ -75,7 +75,7 @@ jobs: with: distribution: 'microsoft' java-version: '21' - - uses: gradle/wrapper-validation-action@v1 + - uses: gradle/actions/wrapper-validation@v3 - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 with: diff --git a/build.gradle.kts b/build.gradle.kts index afbeb3e5..39731a4a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -47,10 +47,7 @@ logger.lifecycle("Project version: $version") val mod: SourceSet by sourceSets.creating val test: SourceSet by sourceSets -val shade: Configuration by configurations.creating { - isTransitive = false -} -val legacyClasspath: Configuration by configurations.creating { isTransitive = false } +val shade: Configuration by configurations.creating val adapterData: Configuration by configurations.creating java { @@ -72,7 +69,7 @@ configurations { } additionalRuntimeClasspath { - extendsFrom(legacyClasspath) + extendsFrom(shade) } } @@ -134,10 +131,9 @@ repositories { dependencies { shade(group = "org.sinytra", name = "forgified-fabric-loader", version = versionForgifiedFabricLoader) - legacyClasspath(group = "org.sinytra", name = "forgified-fabric-loader", version = versionForgifiedFabricLoader, classifier = "full") - legacyClasspath(shade(group = "net.fabricmc", name = "access-widener", version = versionAccessWidener)) - legacyClasspath(shade(group = "org.sinytra", name = "ForgeAutoRenamingTool", version = versionForgeAutoRenamingTool)) - legacyClasspath(shade(group = "org.sinytra.adapter", name = "definition", version = versionAdapterDefinition) { isTransitive = false }) + shade(group = "net.fabricmc", name = "access-widener", version = versionAccessWidener) { isTransitive = false } + shade(group = "org.sinytra", name = "ForgeAutoRenamingTool", version = versionForgeAutoRenamingTool) { isTransitive = false } + shade(group = "org.sinytra.adapter", name = "definition", version = versionAdapterDefinition) { isTransitive = false } adapterData(group = "org.sinytra.adapter", name = "adapter", version = versionAdapter) jarJar(implementation(group = "org.sinytra.adapter", name = "runtime", version = versionAdapterRuntime)) @@ -160,10 +156,11 @@ localJarJar("modJarConfig", "org.sinytra:connector-mod", project.version.toStrin val depsJar: ShadowJar by tasks.creating(ShadowJar::class) { configurations = listOf(shade) - exclude("assets/fabricloader/**") - exclude("META-INF/*.SF") - exclude("META-INF/*.RSA") - exclude("META-INF/maven/**") + exclude( + "assets/fabricloader/**", + "META-INF/*.SF", "META-INF/*.RSA", + "META-INF/maven/**", "META-INF/jars/**", "META-INF/jarjar/**" + ) exclude("META-INF/services/net.neoforged.neoforgespi.language.IModLanguageLoader") exclude("ui/**") exclude("*.json", "*.html", "*.version") diff --git a/gradle.properties b/gradle.properties index 747fc345..ca056afe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ org.gradle.caching=true #org.gradle.configuration-cache=true # Versions -versionConnector=2.0.0-beta.1 +versionConnector=2.0.0-beta.2 versionAdapter=1.13.1+1.21-20240719.094540 versionAdapterDefinition=1.13.16+1.21 versionAdapterRuntime=1.0.0+1.21 @@ -16,7 +16,7 @@ versionMc=1.21 versionNeoForge=21.0.160 versionParchment=2024.06.23 versionForgeAutoRenamingTool=1.0.12 -versionForgifiedFabricLoader=2.5.29+0.16.0+1.21 +versionForgifiedFabricLoader=2.5.30+0.16.0+1.21 versionAccessWidener=2.1.0 versionForgifiedFabricApi=0.100.7+2.0.8+1.21 diff --git a/src/mod/java/org/sinytra/connector/mod/compat/LazyEntityAttributes.java b/src/mod/java/org/sinytra/connector/mod/compat/LazyEntityAttributes.java index f3e53cd9..d3072528 100644 --- a/src/mod/java/org/sinytra/connector/mod/compat/LazyEntityAttributes.java +++ b/src/mod/java/org/sinytra/connector/mod/compat/LazyEntityAttributes.java @@ -29,7 +29,7 @@ public class LazyEntityAttributes { public static void inject() { for (Holder holder : ATTRIBUTES) { - Holder lazyAttribute = PLACEHOLDERS.computeIfAbsent(holder, s -> Holder.direct(new PlaceholderAttribute())); + Holder lazyAttribute = replaceAttribute(holder); try { DEFERRED_HOLDER_SET_VALUE.invoke(holder, lazyAttribute); } catch (Throwable e) { @@ -48,6 +48,10 @@ public static void release() { } } + public static Holder replaceAttribute(Holder original) { + return PLACEHOLDERS.computeIfAbsent(original, s -> Holder.direct(new PlaceholderAttribute())); + } + public static void initializeLazyAttributes(EntityAttributeModificationEvent event) { updateAttributeSuppliers(ObfuscationReflectionHelper.getPrivateValue(DefaultAttributes.class, null, "SUPPLIERS")); updateAttributeSuppliers(CommonHooks.getAttributesView()); diff --git a/src/mod/java/org/sinytra/connector/mod/mixin/AttributeSupplierBuilderMixin.java b/src/mod/java/org/sinytra/connector/mod/mixin/AttributeSupplierBuilderMixin.java new file mode 100644 index 00000000..3b0f8080 --- /dev/null +++ b/src/mod/java/org/sinytra/connector/mod/mixin/AttributeSupplierBuilderMixin.java @@ -0,0 +1,28 @@ +package org.sinytra.connector.mod.mixin; + +import net.minecraft.core.Holder; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import org.sinytra.connector.mod.ConnectorLoader; +import org.sinytra.connector.mod.compat.LazyEntityAttributes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(AttributeSupplier.Builder.class) +public abstract class AttributeSupplierBuilderMixin { + + // Mitigates https://github.com/Sinytra/Connector/issues/1298 + @ModifyVariable(method = "create", at = @At("HEAD"), argsOnly = true) + private Holder onCreate(Holder original) { + if (ConnectorLoader.isLoading()) { + try { + original.value(); + } catch (NullPointerException n) { + // Likely a deferred holder that has not been initialized yet + return LazyEntityAttributes.replaceAttribute(original); + } + } + return original; + } +} diff --git a/src/mod/resources/connector.mixins.json b/src/mod/resources/connector.mixins.json index 8af1a8d8..e8370ec5 100644 --- a/src/mod/resources/connector.mixins.json +++ b/src/mod/resources/connector.mixins.json @@ -5,6 +5,7 @@ "compatibilityLevel": "JAVA_17", "plugin": "org.sinytra.connector.mod.ConnectorBootstrap", "mixins": [ + "AttributeSupplierBuilderMixin", "CommonHooksMixin", "PlayerListMixin", "ChunkGeneratorMixin", From 3577a230a996b10edca0c301cb4ec417852bec54 Mon Sep 17 00:00:00 2001 From: Su5eD Date: Fri, 9 Aug 2024 13:36:45 +0200 Subject: [PATCH 2/8] Bump fabric loader to 2.5.31+0.16.0+1.21 Fixes #1292 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ca056afe..cc6368ac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ versionMc=1.21 versionNeoForge=21.0.160 versionParchment=2024.06.23 versionForgeAutoRenamingTool=1.0.12 -versionForgifiedFabricLoader=2.5.30+0.16.0+1.21 +versionForgifiedFabricLoader=2.5.31+0.16.0+1.21 versionAccessWidener=2.1.0 versionForgifiedFabricApi=0.100.7+2.0.8+1.21 From 556cb22e71a790933847a8616925bd837eb56b86 Mon Sep 17 00:00:00 2001 From: Su5eD Date: Fri, 9 Aug 2024 23:45:32 +0200 Subject: [PATCH 3/8] Update adapter definition to 1.13.19 Fixes #1303 --- gradle.properties | 2 +- .../org/sinytra/connector/transformer/MixinPatches.java | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/gradle.properties b/gradle.properties index cc6368ac..b32f7d5b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ org.gradle.caching=true # Versions versionConnector=2.0.0-beta.2 versionAdapter=1.13.1+1.21-20240719.094540 -versionAdapterDefinition=1.13.16+1.21 +versionAdapterDefinition=1.13.19+1.21 versionAdapterRuntime=1.0.0+1.21 versionMc=1.21 diff --git a/src/main/java/org/sinytra/connector/transformer/MixinPatches.java b/src/main/java/org/sinytra/connector/transformer/MixinPatches.java index 229bed8e..ff3a1262 100644 --- a/src/main/java/org/sinytra/connector/transformer/MixinPatches.java +++ b/src/main/java/org/sinytra/connector/transformer/MixinPatches.java @@ -151,13 +151,6 @@ public static List getPatches() { }) .modifyInjectionPoint("Lnet/minecraft/client/renderer/entity/layers/ElytraLayer;shouldRender(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/LivingEntity;)Z") .build(), - // ======= GUI Rendering patches TODO Can adapter automate these? - Patch.builder() - .targetClass("net/minecraft/client/gui/Gui") - .targetMethod("renderPlayerHealth") - .targetInjectionPoint("Lnet/minecraft/client/gui/Gui;renderHearts(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/world/entity/player/Player;IIIIFIIIZ)V") - .modifyTarget("renderHealthLevel") - .build(), // ======= TODO Handle in adapter Patch.builder() .targetClass("net/minecraft/world/entity/vehicle/Boat") From 1c69d61630096dfa7eba6d3267aa3a612b392bb9 Mon Sep 17 00:00:00 2001 From: Su5eD Date: Sat, 10 Aug 2024 13:22:20 +0200 Subject: [PATCH 4/8] Fix mapping ambiguity resolver false positive Fixes #1309 --- .../OptimizedRenamingTransformer.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/sinytra/connector/transformer/OptimizedRenamingTransformer.java b/src/main/java/org/sinytra/connector/transformer/OptimizedRenamingTransformer.java index 9df0f825..da358e0a 100644 --- a/src/main/java/org/sinytra/connector/transformer/OptimizedRenamingTransformer.java +++ b/src/main/java/org/sinytra/connector/transformer/OptimizedRenamingTransformer.java @@ -24,6 +24,8 @@ import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.VarInsnNode; +import org.sinytra.adapter.patch.analysis.MethodCallAnalyzer; import org.sinytra.adapter.patch.analysis.selector.AnnotationHandle; import org.sinytra.adapter.patch.analysis.selector.AnnotationValueHandle; import org.sinytra.adapter.patch.util.MethodQualifier; @@ -105,20 +107,26 @@ protected void postProcess(ClassNode node) { } private void avoidAmbigousMappingRecursion(ClassNode classNode, MethodNode method) { - if (isOverridenMethod(classNode, method)) { + if (isAmbigousOverridenMethod(classNode, method)) { for (AbstractInsnNode insn : method.instructions) { - if (insn instanceof MethodInsnNode minsn && minsn.owner.equals(classNode.name) && minsn.name.equals(method.name) && minsn.desc.equals(method.desc)) { - method.instructions.set(minsn, new MethodInsnNode(Opcodes.INVOKESPECIAL, classNode.superName, minsn.name, minsn.desc, minsn.itf)); + if (insn instanceof MethodInsnNode minsn && minsn.getOpcode() == Opcodes.INVOKEVIRTUAL && minsn.owner.equals(classNode.name) && minsn.name.equals(method.name) && minsn.desc.equals(method.desc)) { + List insns = MethodCallAnalyzer.findMethodCallParamInsns(method, minsn); + if (!insns.isEmpty() && insns.getFirst() instanceof VarInsnNode varInsn && varInsn.var == 0) { + method.instructions.set(minsn, new MethodInsnNode(Opcodes.INVOKESPECIAL, classNode.superName, minsn.name, minsn.desc, minsn.itf)); + } } } } } - private boolean isOverridenMethod(ClassNode classNode, MethodNode method) { - return classNode.superName != null && ((MixinAwareEnhancedRemapper) this.remapper).getUpstreamProvider().getClass(classNode.superName) - .flatMap(m -> m.getMethod(method.name, method.desc)) - .filter(m -> (m.getAccess() & (ACC_PRIVATE | ACC_STATIC)) == 0) - .isPresent(); + private boolean isAmbigousOverridenMethod(ClassNode classNode, MethodNode method) { + return classNode.superName != null && this.remapper.getClass(classNode.name) + .map(c -> c.getMethods().stream() + .flatMap(Optional::stream) + .filter(m -> !m.getName().equals(m.getMapped()) && m.getMapped().equals(method.name) && method.desc.equals(this.remapper.mapMethodDesc(m.getDescriptor())) + && (m.getAccess() & (ACC_PRIVATE | ACC_STATIC)) == 0) + .count() > 1) + .orElse(false); } private void processMixinAnnotation(AnnotationNode annotation, PostProcessRemapper postProcessRemapper) { From 7550d07db3da2251e004c04afa85417404b27adc Mon Sep 17 00:00:00 2001 From: Su5eD Date: Sun, 11 Aug 2024 21:33:17 +0200 Subject: [PATCH 5/8] Update to Minecraft 1.21.1 --- build.gradle.kts | 3 ++- gradle.properties | 17 +++++++++-------- src/mod/resources/META-INF/neoforge.mods.toml | 10 +++++----- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 39731a4a..6166f2a3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,6 +19,7 @@ val versionAdapterDefinition: String by project val versionAdapterRuntime: String by project val versionMc: String by project val versionNeoForge: String by project +val versionParchmentMc: String by project val versionParchment: String by project val versionForgeAutoRenamingTool: String by project val versionForgifiedFabricLoader: String by project @@ -84,7 +85,7 @@ neoForge { parchment { mappingsVersion = versionParchment - minecraftVersion = versionMc + minecraftVersion = versionParchmentMc } runs { diff --git a/gradle.properties b/gradle.properties index b32f7d5b..590e1cd0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,17 +8,18 @@ org.gradle.caching=true # Versions versionConnector=2.0.0-beta.2 -versionAdapter=1.13.1+1.21-20240719.094540 -versionAdapterDefinition=1.13.19+1.21 -versionAdapterRuntime=1.0.0+1.21 +versionAdapter=1.13.20+1.21.1-20240811.191740 +versionAdapterDefinition=1.13.20+1.21.1 +versionAdapterRuntime=1.0.0+1.21.1 -versionMc=1.21 -versionNeoForge=21.0.160 -versionParchment=2024.06.23 +versionMc=1.21.1 +versionNeoForge=21.1.5 +versionParchmentMc=1.21 +versionParchment=2024.07.28 versionForgeAutoRenamingTool=1.0.12 -versionForgifiedFabricLoader=2.5.31+0.16.0+1.21 +versionForgifiedFabricLoader=2.5.33+0.16.0+1.21.1 versionAccessWidener=2.1.0 -versionForgifiedFabricApi=0.100.7+2.0.8+1.21 +versionForgifiedFabricApi=0.102.0+2.0.11+1.21.1 # Publishing curseForgeId=890127 diff --git a/src/mod/resources/META-INF/neoforge.mods.toml b/src/mod/resources/META-INF/neoforge.mods.toml index ef17a8a0..9fae89b1 100644 --- a/src/mod/resources/META-INF/neoforge.mods.toml +++ b/src/mod/resources/META-INF/neoforge.mods.toml @@ -11,22 +11,22 @@ logoFile="logo.png" authors="Su5eD" displayURL="https://github.com/Sinytra/Connector" description=''' -Connector is a translation/compatibility layer that allows running Fabric mods on MinecraftForge. +Connector is a translation/compatibility layer that allows running Fabric mods on NeoForge. Its goal is to bring the two platforms closer together, saving developers time and effort maintaining their mods for multiple platforms at once, as well as allowing players to play all their favourite mods in one modpack. ''' displayTest = 'IGNORE_ALL_VERSION' # Connector is optional for both sides [[mixins]] config="connector.mixins.json" -[[dependencies.connectormod]] +[[dependencies.connector]] modId="neoforge" - mandatory=true + type="required" versionRange="*" ordering="NONE" side="BOTH" -[[dependencies.connectormod]] +[[dependencies.connector]] modId="minecraft" - mandatory=true + type="required" versionRange="[1.21,1.22)" ordering="NONE" side="BOTH" From 0c63fe4a162d96891b29e82e3b943f759e27206c Mon Sep 17 00:00:00 2001 From: Su5eD Date: Mon, 12 Aug 2024 09:26:08 +0200 Subject: [PATCH 6/8] Enable missing mixin Fixes #1320 --- build.gradle.kts | 2 ++ src/mod/resources/connector.mixins.json | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6166f2a3..8f4bc987 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -145,6 +145,8 @@ dependencies { "modCompileOnly"(sourceSets.main.get().output) additionalRuntimeClasspath(files(tasks.jar)) + + implementation("curse.maven:connector-extras-913445:5618470") } val modJar: Jar by tasks.creating(Jar::class) { diff --git a/src/mod/resources/connector.mixins.json b/src/mod/resources/connector.mixins.json index e8370ec5..aafd140d 100644 --- a/src/mod/resources/connector.mixins.json +++ b/src/mod/resources/connector.mixins.json @@ -6,9 +6,9 @@ "plugin": "org.sinytra.connector.mod.ConnectorBootstrap", "mixins": [ "AttributeSupplierBuilderMixin", + "ChunkGeneratorMixin", "CommonHooksMixin", "PlayerListMixin", - "ChunkGeneratorMixin", "boot.DatagenModLoaderMixin", "item.IItemExtensionMixin", "item.ItemStackMixin", @@ -18,9 +18,10 @@ "recipebook.RecipeBookManagerMixin", "registries.DataPackRegistriesHooksAccessor", "registries.MappedRegistryAccessor", + "registries.NeoForgeRegistriesSetupAccessor", "registries.BuiltInRegistriesMixin", "registries.EntityDataSerializersMixin", - "registries.NeoForgeRegistriesSetupAccessor", + "registries.ItemBlockRenderTypesMixin", "registries.NeoForgeRegistriesSetupMixin", "registries.NetworkRegistryMixin", "registries.PoiTypesMixin", @@ -28,11 +29,11 @@ ], "client": [ "boot.MinecraftMixin", + "client.BlockColorsMixin", "client.ForgeHooksClientMixin", + "client.ItemColorsMixin", "client.ItemOverridesMixin", "client.KeyMappingMixin", - "client.BlockColorsMixin", - "client.ItemColorsMixin", "client.ParticleEngineMixin" ], "server": [ From a04d85b032a02b38286b880dae518d34c5733d62 Mon Sep 17 00:00:00 2001 From: Su5eD Date: Tue, 13 Aug 2024 10:54:31 +0200 Subject: [PATCH 7/8] Update adapter definition to 1.13.21 Fixes #1307 --- gradle.properties | 2 +- .../org/sinytra/connector/transformer/MixinPatches.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 590e1cd0..6afe9211 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ org.gradle.caching=true # Versions versionConnector=2.0.0-beta.2 versionAdapter=1.13.20+1.21.1-20240811.191740 -versionAdapterDefinition=1.13.20+1.21.1 +versionAdapterDefinition=1.13.21+1.21.1 versionAdapterRuntime=1.0.0+1.21.1 versionMc=1.21.1 diff --git a/src/main/java/org/sinytra/connector/transformer/MixinPatches.java b/src/main/java/org/sinytra/connector/transformer/MixinPatches.java index ff3a1262..14db8999 100644 --- a/src/main/java/org/sinytra/connector/transformer/MixinPatches.java +++ b/src/main/java/org/sinytra/connector/transformer/MixinPatches.java @@ -108,6 +108,13 @@ public static List getPatches() { return Patch.Result.APPLY; }) .build(), + // NeoForge moves this behaviour out completely with no viable replacement, so we disable it for now + Patch.builder() + .targetClass("net/minecraft/world/entity/animal/SnowGolem", "net/minecraft/world/entity/animal/Sheep", "net/minecraft/world/entity/animal/MushroomCow") + .targetMethod("mobInteract") + .targetInjectionPoint("Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z") + .disable() + .build(), // ======= Rendering patches Patch.builder() .targetClass("net/minecraft/client/renderer/ShaderInstance") From 0b2b43c7eca34c706f9aad8c2379c588c965cb00 Mon Sep 17 00:00:00 2001 From: Su5eD Date: Wed, 14 Aug 2024 10:19:44 +0200 Subject: [PATCH 8/8] Re-add LVT scope transformer Fixes #1295 --- .../sinytra/connector/ConnectorCoremods.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sinytra/connector/ConnectorCoremods.java b/src/main/java/org/sinytra/connector/ConnectorCoremods.java index d93b634c..8921605d 100644 --- a/src/main/java/org/sinytra/connector/ConnectorCoremods.java +++ b/src/main/java/org/sinytra/connector/ConnectorCoremods.java @@ -10,14 +10,17 @@ import net.neoforged.neoforgespi.coremod.ICoreMod; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.LocalVariableNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.TypeInsnNode; import org.objectweb.asm.tree.VarInsnNode; +import org.sinytra.adapter.patch.analysis.locals.LocalVariableLookup; import org.slf4j.Logger; import java.util.List; @@ -113,12 +116,29 @@ public Iterable> getTransformers() { } } ); + ITransformer expandLocalVarScope = new BaseTransformer<>( + TargetType.METHOD, + ITransformer.Target.targetMethod("net.minecraft.world.entity.LivingEntity", "forceAddEffect", "(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)V"), + input -> { + LocalVariableLookup lvt = new LocalVariableLookup(input); + LocalVariableNode mobEffect = lvt.getByTypedOrdinal(Type.getObjectType("net/minecraft/world/effect/MobEffectInstance"), 1).orElse(null); + if (mobEffect != null) { + mobEffect.start = lvt.getByIndex(0).start; + input.instructions.insert(mobEffect.start, ASMAPI.listOf( + new InsnNode(Opcodes.ACONST_NULL), + new VarInsnNode(Opcodes.ASTORE, mobEffect.index) + )); + LOGGER.debug("Expanded local variable scope for LivingEntity#forceAddEffect index {}", mobEffect.index); + } + } + ); return ImmutableList.>builder() .add(keyMappingFieldTypeTransform, creativeModeTabConstructorTransform) .addAll(addedFields) .addAll(getFabricASMTransformers()) .add(missingOrderingCall) + .add(expandLocalVarScope) .build(); } @@ -128,7 +148,7 @@ private static ITransformer addFieldToClass(String cls, String name, String d ITransformer.Target.targetClass(cls), input -> { input.fields.add(new FieldNode(access, name, desc, null, null)); - + LOGGER.debug("Added field {} to class {}", name, cls); } );