From f222651ce9a5f5b4c161e7504264c760fdc7620b Mon Sep 17 00:00:00 2001 From: Timo Ley Date: Sun, 26 Nov 2023 12:42:36 +0100 Subject: [PATCH] feat: use AnvilLib beardifier --- common/build.gradle | 2 +- .../registry/worldgen/WBStructures.java | 3 +- .../core/mixinhelper/BeardifierLocals.java | 14 -- fabric/build.gradle | 2 +- .../mixin/fabric/common/BeardifierMixin.java | 127 ---------------- fabric/src/main/resources/fabric.mod.json | 2 +- .../main/resources/wildbackport.mixins.json | 3 +- forge/build.gradle | 2 +- .../mixin/forge/common/BeardifierMixin.java | 139 ------------------ forge/src/main/resources/META-INF/mods.toml | 2 +- .../main/resources/wildbackport.mixins.json | 4 +- gradle.properties | 2 +- 12 files changed, 10 insertions(+), 292 deletions(-) delete mode 100644 common/src/main/java/com/cursedcauldron/wildbackport/core/mixinhelper/BeardifierLocals.java delete mode 100644 fabric/src/main/java/com/cursedcauldron/wildbackport/core/mixin/fabric/common/BeardifierMixin.java delete mode 100644 forge/src/main/java/com/cursedcauldron/wildbackport/core/mixin/forge/common/BeardifierMixin.java diff --git a/common/build.gradle b/common/build.gradle index 1bbb4ea..6566006 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -11,7 +11,7 @@ dependencies { // Do NOT use other classes from fabric loader modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modImplementation("net.anvilcraft:anvillib-18:0.2.0") {transitive = false} + modImplementation("net.anvilcraft:anvillib-18:1.1.0") {transitive = false} // Remove the next line if you don't want to depend on the API // modApi "dev.architectury:architectury:${rootProject.architectury_version}" } diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/registry/worldgen/WBStructures.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/registry/worldgen/WBStructures.java index 404918a..c12bb40 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/common/registry/worldgen/WBStructures.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/registry/worldgen/WBStructures.java @@ -52,7 +52,8 @@ public class WBStructures { new AdvancedStructurePoolFeatureConfig( AncientCityStructurePieces.START, 7, - 116 + 116, + true ), WBBiomeTags.HAS_ANCIENT_CITY, true, diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/core/mixinhelper/BeardifierLocals.java b/common/src/main/java/com/cursedcauldron/wildbackport/core/mixinhelper/BeardifierLocals.java deleted file mode 100644 index fb0377d..0000000 --- a/common/src/main/java/com/cursedcauldron/wildbackport/core/mixinhelper/BeardifierLocals.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.cursedcauldron.wildbackport.core.mixinhelper; - -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructurePiece; - -public record BeardifierLocals( - int x, - int y, - int z, - StructurePiece structurePiece, - BoundingBox boundingBox, - int l, - int m -) {} diff --git a/fabric/build.gradle b/fabric/build.gradle index 7fff084..366ee89 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -30,7 +30,7 @@ dependencies { // modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" modImplementation("com.github.glitchfiend:TerraBlender-fabric:${minecraft_version}-${terrablender_version}") - modImplementation("net.anvilcraft:anvillib-18-fabric:0.2.0") {transitive = false} + modImplementation("net.anvilcraft:anvillib-18-fabric:1.1.0") {transitive = false} common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } diff --git a/fabric/src/main/java/com/cursedcauldron/wildbackport/core/mixin/fabric/common/BeardifierMixin.java b/fabric/src/main/java/com/cursedcauldron/wildbackport/core/mixin/fabric/common/BeardifierMixin.java deleted file mode 100644 index 3621332..0000000 --- a/fabric/src/main/java/com/cursedcauldron/wildbackport/core/mixin/fabric/common/BeardifierMixin.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.cursedcauldron.wildbackport.core.mixin.fabric.common; - -import java.util.HashMap; -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArgs; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; - -import com.cursedcauldron.wildbackport.common.worldgen.features.AncientCityFeature; -import com.cursedcauldron.wildbackport.core.mixinhelper.BeardifierLocals; - -import net.minecraft.util.Mth; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.levelgen.Beardifier; -import net.minecraft.world.level.levelgen.DensityFunction; -import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructurePiece; -import net.minecraft.world.level.levelgen.structure.StructureStart; - -/** - * This mixin is responsible for reimplementing 1.19's BEARD_BOX which causes terrain - * to be removed around ancient city structures. - */ -@Mixin(Beardifier.class) -public class BeardifierMixin { - private static ThreadLocal currentLocals = new ThreadLocal<>(); - @Unique - private Map> featureMap = new HashMap<>(); - - @ModifyArgs( - method = "method_38319", - at = @At( - value = "INVOKE", - target = "Lit/unimi/dsi/fastutil/objects/ObjectList;add(Ljava/lang/Object;)Z" - ), - remap = false - ) - private void - addStructurePieceToMap( - Args args, ChunkPos alec1, int alec2, int alec3, StructureStart ss - ) { - featureMap.put(args.get(0), ss.getFeature().feature); - } - - @Inject( - method = "compute", - at = @At( - value = "INVOKE", - target - = "Lnet/minecraft/world/level/levelgen/structure/StructurePiece;getNoiseEffect()Lnet/minecraft/world/level/levelgen/feature/NoiseEffect;" - ), - locals = LocalCapture.CAPTURE_FAILHARD - ) - private void - collectVariables( - DensityFunction.FunctionContext alec1, - CallbackInfoReturnable ci, - int i, - int j, - int k, - double alec2, - StructurePiece structurePiece, - BoundingBox boundingBox, - int l, - int m - ) { - currentLocals.set(new BeardifierLocals(i, j, k, structurePiece, boundingBox, l, m) - ); - } - - @Shadow - private static double getBeardContribution(int l, int m, int n) { - throw new AssertionError(); - } - - @Redirect( - method = "compute", - at = @At( - value = "INVOKE", - target - = "Lnet/minecraft/world/level/levelgen/Beardifier;getBeardContribution(III)D" - ) - ) - private double - beardContribution(int l, int m, int n) { - BeardifierLocals locals = currentLocals.get(); - if (locals == null) - return getBeardContribution(l, m, n); - currentLocals.remove(); - - StructureFeature sf = this.featureMap.get(locals.structurePiece()); - if (sf == null /* WTF */ || !(sf instanceof AncientCityFeature)) - return getBeardContribution(l, m, n); - - int q = Math.max(0, Math.max(-m, locals.y() - locals.boundingBox().maxY())); - - return getAncientCityBeardContribution(l, q, n, m); - } - - private static double getAncientCityBeardContribution(int i, int j, int k, int l) { - int m = i + 12; - int n = j + 12; - int o = k + 12; - if (!(m >= 0 && m < 24 && n >= 0 && n < 24 && o >= 0 && o < 24)) { - return 0.0; - } - double d = (double) l + 0.5; - double e = Mth.lengthSquared(i, d, k); - double f = -d * Mth.fastInvSqrt(e / 2.0) / 2.0; - return f * (double) computeBeardContribution(o - 12, m - 12, n - 12); - } - - private static double computeBeardContribution(int i, double d, int j) { - double e = Mth.lengthSquared(i, d, j); - double f = Math.pow(Math.E, -e / 16.0); - return f; - } -} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 38b79de..e82283e 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -36,7 +36,7 @@ "fabricloader": ">=0.14.8", "minecraft": ">=1.18.2", "terrablender": ">=1.0.0.59", - "anvillib": ">=0.2.0" + "anvillib": ">=1.1.0" }, "custom": { "modmenu": { diff --git a/fabric/src/main/resources/wildbackport.mixins.json b/fabric/src/main/resources/wildbackport.mixins.json index 822e0a6..a7247a7 100644 --- a/fabric/src/main/resources/wildbackport.mixins.json +++ b/fabric/src/main/resources/wildbackport.mixins.json @@ -4,8 +4,7 @@ "package": "com.cursedcauldron.wildbackport.core.mixin.fabric", "compatibilityLevel": "JAVA_17", "mixins": [ - "access.BiomeAccessor", - "common.BeardifierMixin" + "access.BiomeAccessor" ], "client": [ "client.FogRendererMixin", diff --git a/forge/build.gradle b/forge/build.gradle index ff476c3..82645ae 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -37,7 +37,7 @@ dependencies { forge "net.minecraftforge:forge:${rootProject.forge_version}" modApi "com.github.glitchfiend:TerraBlender-forge:${minecraft_version}-${terrablender_version}" - modImplementation("net.anvilcraft:anvillib-18-forge:0.2.0") {transitive = false} + modImplementation("net.anvilcraft:anvillib-18-forge:1.1.0") {transitive = false} common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } diff --git a/forge/src/main/java/com/cursedcauldron/wildbackport/core/mixin/forge/common/BeardifierMixin.java b/forge/src/main/java/com/cursedcauldron/wildbackport/core/mixin/forge/common/BeardifierMixin.java deleted file mode 100644 index fa5aab8..0000000 --- a/forge/src/main/java/com/cursedcauldron/wildbackport/core/mixin/forge/common/BeardifierMixin.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.cursedcauldron.wildbackport.core.mixin.forge.common; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import com.cursedcauldron.wildbackport.common.worldgen.features.AncientCityFeature; -import com.cursedcauldron.wildbackport.core.mixinhelper.BeardifierLocals; - -import net.minecraft.util.Mth; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.levelgen.Beardifier; -import net.minecraft.world.level.levelgen.DensityFunction; -import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructurePiece; -import net.minecraft.world.level.levelgen.structure.StructureStart; - -/** - * This mixin is responsible for reimplementing 1.19's BEARD_BOX which causes terrain - * to be removed around ancient city structures. - */ -@Mixin(Beardifier.class) -public class BeardifierMixin { - private static ThreadLocal currentLocals = new ThreadLocal<>(); - @Unique - private Map> featureMap = new HashMap<>(); - - // This is different than the fabric implementation where this is @ModifyArgs, but - // that's borked on Forge (as per usual). - @Inject( - // for this nonsense to work in the devenv, replace this with method_38319 - // for prod, use m_208194_ - // very elegant! - method = "m_208194_", - at = @At( - value = "INVOKE", - target = "Lit/unimi/dsi/fastutil/objects/ObjectList;add(Ljava/lang/Object;)Z" - ), - remap = false, - locals = LocalCapture.CAPTURE_FAILHARD - ) - private void - addStructurePieceToMap( - ChunkPos alec1, - int alec2, - int alec3, - StructureStart ss, - CallbackInfo ci, - Iterator alec4, - StructurePiece sp - ) { - featureMap.put(sp, ss.getFeature().feature); - } - - @Inject( - method = "compute", - at = @At( - value = "INVOKE", - target - = "Lnet/minecraft/world/level/levelgen/structure/StructurePiece;getNoiseEffect()Lnet/minecraft/world/level/levelgen/feature/NoiseEffect;" - ), - locals = LocalCapture.CAPTURE_FAILHARD - ) - private void - collectVariables( - DensityFunction.FunctionContext alec1, - CallbackInfoReturnable ci, - int i, - int j, - int k, - double alec2, - StructurePiece structurePiece, - BoundingBox boundingBox, - int l, - int m - ) { - currentLocals.set(new BeardifierLocals(i, j, k, structurePiece, boundingBox, l, m) - ); - } - - @Shadow - protected static double getBeardContribution(int l, int m, int n) { - throw new AssertionError(); - } - - @Redirect( - method = "compute", - at = @At( - value = "INVOKE", - target - = "Lnet/minecraft/world/level/levelgen/Beardifier;getBeardContribution(III)D" - ) - ) - private double - beardContribution(int l, int m, int n) { - BeardifierLocals locals = currentLocals.get(); - if (locals == null) - return getBeardContribution(l, m, n); - currentLocals.remove(); - - StructureFeature sf = this.featureMap.get(locals.structurePiece()); - if (sf == null /* WTF */ || !(sf instanceof AncientCityFeature)) - return getBeardContribution(l, m, n); - - int q = Math.max(0, Math.max(-m, locals.y() - locals.boundingBox().maxY())); - - return getAncientCityBeardContribution(l, q, n, m); - } - - private static double getAncientCityBeardContribution(int i, int j, int k, int l) { - int m = i + 12; - int n = j + 12; - int o = k + 12; - if (!(m >= 0 && m < 24 && n >= 0 && n < 24 && o >= 0 && o < 24)) { - return 0.0; - } - double d = (double) l + 0.5; - double e = Mth.lengthSquared(i, d, k); - double f = -d * Mth.fastInvSqrt(e / 2.0) / 2.0; - return f * (double) computeBeardContribution(o - 12, m - 12, n - 12); - } - - private static double computeBeardContribution(int i, double d, int j) { - double e = Mth.lengthSquared(i, d, j); - double f = Math.pow(Math.E, -e / 16.0); - return f; - } -} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 47b8746..b802990 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -36,6 +36,6 @@ license = "All Rights Reserved" [[dependencies.wildbackport]] modId="anvillib" mandatory=true - versionRange="[0.2.0,)" + versionRange="[1.1.0,)" ordering="NONE" side="BOTH" \ No newline at end of file diff --git a/forge/src/main/resources/wildbackport.mixins.json b/forge/src/main/resources/wildbackport.mixins.json index 80b3459..a5721a7 100644 --- a/forge/src/main/resources/wildbackport.mixins.json +++ b/forge/src/main/resources/wildbackport.mixins.json @@ -3,9 +3,7 @@ "minVersion": "0.8", "package": "com.cursedcauldron.wildbackport.core.mixin.forge", "compatibilityLevel": "JAVA_17", - "mixins": [ - "common.BeardifierMixin" - ], + "mixins": [], "client": [], "injectors": { "defaultRequire": 1 diff --git a/gradle.properties b/gradle.properties index 4230c06..91e96ef 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.18.2 enabled_platforms=fabric,forge archives_base_name=wildbackport -mod_version=2.0.0 +mod_version=2.1.0 maven_group=com.cursedcauldron fabric_loader_version=0.14.8