diff --git a/.clang-format b/.clang-format index d48bed8..1bd68c9 100644 --- a/.clang-format +++ b/.clang-format @@ -78,7 +78,6 @@ IndentWidth: 4 IndentWrappedFunctionNames: false #InsertBraces: false InsertTrailingCommas: Wrapped -JavaImportGroups: ["java"] JavaScriptQuotes: Double JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false @@ -94,7 +93,7 @@ ReflowComments: true #RequiresClausePosition: OwnLine #RequiresExpressionIndentation: OuterScope SeparateDefinitionBlocks: Always -SortIncludes: CaseInsensitive +SortIncludes: false SortJavaStaticImport: Before SortUsingDeclarations: true SpaceAfterCStyleCast: true diff --git a/.gitignore b/.gitignore index ccb0c56..8bd852f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ classes/ .metadata .vscode .settings -*.launch \ No newline at end of file +*.launch +.factorypath diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/WildBackport.java b/common/src/main/java/com/cursedcauldron/wildbackport/WildBackport.java index a6a17ec..10ec877 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/WildBackport.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/WildBackport.java @@ -1,9 +1,9 @@ package com.cursedcauldron.wildbackport; +import org.slf4j.Logger; + import com.cursedcauldron.wildbackport.client.registry.WBParticleTypes; import com.cursedcauldron.wildbackport.client.registry.WBSoundEvents; -import com.cursedcauldron.wildbackport.common.entities.access.Recovery; -import com.cursedcauldron.wildbackport.common.items.CompassItemPropertyFunction; import com.cursedcauldron.wildbackport.common.registry.Instruments; import com.cursedcauldron.wildbackport.common.registry.WBBiomes; import com.cursedcauldron.wildbackport.common.registry.WBBlockEntities; @@ -20,6 +20,7 @@ import com.cursedcauldron.wildbackport.common.registry.entity.WBMemoryModules; import com.cursedcauldron.wildbackport.common.registry.entity.WBSensorTypes; import com.cursedcauldron.wildbackport.common.registry.worldgen.RootPlacerType; import com.cursedcauldron.wildbackport.common.registry.worldgen.WBFeatures; +import com.cursedcauldron.wildbackport.common.registry.worldgen.WBStructures; import com.cursedcauldron.wildbackport.common.registry.worldgen.WBTreeDecorators; import com.cursedcauldron.wildbackport.common.registry.worldgen.WBTrunkPlacers; import com.cursedcauldron.wildbackport.common.tag.InstrumentTags; @@ -29,10 +30,6 @@ import com.cursedcauldron.wildbackport.common.tag.WBEntityTypeTags; import com.cursedcauldron.wildbackport.common.tag.WBGameEventTags; import com.cursedcauldron.wildbackport.common.tag.WBItemTags; import com.mojang.logging.LogUtils; -import net.minecraft.client.renderer.item.ItemProperties; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import org.slf4j.Logger; //<> @@ -64,6 +61,8 @@ public class WildBackport { WBGameRules.setup(); + WBStructures.setup(); + // Tags WBBiomeTags.TAGS.bootstrap(); WBBlockTags.BUILDER.bootstrap(); @@ -72,11 +71,14 @@ public class WildBackport { WBItemTags.TAGS.bootstrap(); InstrumentTags.TAGS.bootstrap(); - // ItemProperties.register(WBItems.RECOVERY_COMPASS.get(), new - // ResourceLocation("angle"), new CompassItemPropertyFunction((level, - // stack, entity) -> { - // return entity instanceof Player player ? - // Recovery.of(player).getLastDeathLocation().orElse(null) : null; - // })); + //ItemProperties.register( + // WBItems.RECOVERY_COMPASS.get(), + // new ResourceLocation("angle"), + // new CompassItemPropertyFunction((level, stack, entity) -> { + // return entity instanceof Player player + // ? Recovery.of(player).getLastDeathLocation().orElse(null) + // : null; + // }) + //); } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/registry/worldgen/WBFeatures.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/registry/worldgen/WBFeatures.java index cdeb3bf..80bf389 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/common/registry/worldgen/WBFeatures.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/registry/worldgen/WBFeatures.java @@ -2,7 +2,8 @@ package com.cursedcauldron.wildbackport.common.registry.worldgen; import java.util.function.Supplier; -import com.cursedcauldron.wildbackport.WildBackport; +import com.cursedcauldron.wildbackport.common.worldgen.AdvancedJigsawConfiguration; +import com.cursedcauldron.wildbackport.common.worldgen.features.AncientCityFeature; import com.cursedcauldron.wildbackport.common.worldgen.features.GrassDiskConfiguration; import com.cursedcauldron.wildbackport.common.worldgen.features.GrassDiskFeature; import com.cursedcauldron.wildbackport.common.worldgen.features.RootedTreeConfig; @@ -11,7 +12,10 @@ import com.cursedcauldron.wildbackport.common.worldgen.features.SculkGrowthFeatu import com.cursedcauldron.wildbackport.common.worldgen.features.SculkPatchConfiguration; import com.cursedcauldron.wildbackport.common.worldgen.features.SculkPatchFeature; import com.cursedcauldron.wildbackport.core.api.CoreRegistry; +import com.cursedcauldron.wildbackport.core.mixin.access.StructureFeatureAccessor; + import net.minecraft.core.Registry; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.GlowLichenConfiguration; @@ -36,4 +40,11 @@ public class WBFeatures { = FEATURES.register( "sculk_growth", () -> new SculkGrowthFeature(GlowLichenConfiguration.CODEC) ); -} \ No newline at end of file + + public static final AncientCityFeature ANCIENT_CITY + = StructureFeatureAccessor.callRegister( + "ancient_city", + new AncientCityFeature(AdvancedJigsawConfiguration.CODEC), + Decoration.UNDERGROUND_STRUCTURES + ); +} 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 b739239..ab4eb1e 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 @@ -1,18 +1,66 @@ package com.cursedcauldron.wildbackport.common.registry.worldgen; -import com.cursedcauldron.wildbackport.WildBackport; +import java.util.Arrays; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.cursedcauldron.wildbackport.common.tag.WBBiomeTags; +import com.cursedcauldron.wildbackport.common.worldgen.AdvancedJigsawConfiguration; +import com.cursedcauldron.wildbackport.common.worldgen.structure.AncientCityStructurePieces; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.random.WeightedRandomList; +import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import net.minecraft.world.level.levelgen.structure.StructureSpawnOverride; +import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement; +import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType; public class WBStructures { - // public static final Holder> ANCIENT_CITY = - // create("ancient_city", ) + public static final Holder> ANCIENT_CITY = create( + "ancient_city", + WBFeatures.ANCIENT_CITY.configured( + new AdvancedJigsawConfiguration( + AncientCityStructurePieces.START, + 7, + 116, + Optional.of(new ResourceLocation("city_anchor")) + ), + WBBiomeTags.HAS_ANCIENT_CITY, + true, + Arrays.stream(MobCategory.values()) + .collect(Collectors.toMap( + mobCategory + -> mobCategory, + mobCategory + -> new StructureSpawnOverride( + StructureSpawnOverride.BoundingBoxType.STRUCTURE, + WeightedRandomList.create() + ) + )) + ) + ); + + public static final Holder ANCIENT_CITIES = BuiltinRegistries.register( + BuiltinRegistries.STRUCTURE_SETS, + ResourceKey.create( + Registry.STRUCTURE_SET_REGISTRY, new ResourceLocation("ancient_cities") + ), + new StructureSet( + ANCIENT_CITY, + new RandomSpreadStructurePlacement(24, 8, RandomSpreadType.LINEAR, 20083232) + ) + ); + + public static void setup() { + AncientCityStructurePieces.bootstrap(); + } private static > Holder> @@ -25,4 +73,4 @@ public class WBStructures { feature ); } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/tag/WBBlockTags.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/tag/WBBlockTags.java index abe8cbf..cf1f920 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/common/tag/WBBlockTags.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/tag/WBBlockTags.java @@ -1,7 +1,7 @@ package com.cursedcauldron.wildbackport.common.tag; -import com.cursedcauldron.wildbackport.WildBackport; import com.cursedcauldron.wildbackport.core.api.TagBuilder; + import net.minecraft.core.Registry; import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; @@ -32,4 +32,4 @@ public class WBBlockTags { // Compatibility public static final TagKey MUD = BUILDER.create("mud"); -} \ No newline at end of file +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/AdvancedJigsawConfiguration.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/AdvancedJigsawConfiguration.java new file mode 100644 index 0000000..2478ac4 --- /dev/null +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/AdvancedJigsawConfiguration.java @@ -0,0 +1,53 @@ +package com.cursedcauldron.wildbackport.common.worldgen; + +import java.util.Optional; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; +import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; + +public class AdvancedJigsawConfiguration extends JigsawConfiguration { + public static final Codec CODEC = RecordCodecBuilder.create( + (instance) -> { + return instance + .group( + StructureTemplatePool.CODEC.fieldOf("start_pool") + .forGetter( + (self) -> ((AdvancedJigsawConfiguration) self).startPool() + ), + Codec.intRange(0, 7).fieldOf("size").forGetter( + (self) -> ((AdvancedJigsawConfiguration) self).maxDepth() + ), + Codec.INT.fieldOf("max_distance_from_center") + .forGetter( + (self) + -> ((AdvancedJigsawConfiguration) self) + .maxDistanceFromCenter + ), + ResourceLocation.CODEC.optionalFieldOf("start_jigsaw_name") + .forGetter( + (self) -> ((AdvancedJigsawConfiguration) self).startJigsawName + ) + ) + .apply(instance, AdvancedJigsawConfiguration::new); + } + ); + + public int maxDistanceFromCenter; + public Optional startJigsawName; + + public AdvancedJigsawConfiguration( + Holder holder, + int i, + int maxDistanceFromCenter, + Optional startJigsawName + ) { + super(holder, i); + this.maxDistanceFromCenter = maxDistanceFromCenter; + this.startJigsawName = startJigsawName; + } +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/features/AncientCityFeature.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/features/AncientCityFeature.java new file mode 100644 index 0000000..82f0f68 --- /dev/null +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/features/AncientCityFeature.java @@ -0,0 +1,21 @@ +package com.cursedcauldron.wildbackport.common.worldgen.features; + +import com.mojang.serialization.Codec; +import net.minecraft.world.level.levelgen.feature.JigsawFeature; +import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; + +public class AncientCityFeature extends JigsawFeature { + public AncientCityFeature(Codec codec) { + super( + codec, + // Y level + -27, + // disable placement hack (?) + false, + // don't generate on surface + false, + // placable predicate + (alec) -> true + ); + } +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/AncientCityStructurePieces.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/AncientCityStructurePieces.java index 864e177..93de037 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/AncientCityStructurePieces.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/AncientCityStructurePieces.java @@ -1,10 +1,10 @@ package com.cursedcauldron.wildbackport.common.worldgen.structure; -import com.cursedcauldron.wildbackport.WildBackport; import com.cursedcauldron.wildbackport.common.worldgen.structure.pools.AncientCityStructurePools; import com.cursedcauldron.wildbackport.common.worldgen.structure.processors.WBProcessorLists; import com.google.common.collect.ImmutableList; import com.mojang.datafixers.util.Pair; + import net.minecraft.core.Holder; import net.minecraft.data.worldgen.Pools; import net.minecraft.resources.ResourceLocation; @@ -45,4 +45,4 @@ public class AncientCityStructurePieces { public static void bootstrap() { AncientCityStructurePools.bootstrap(); } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/StructureGeneration.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/StructureGeneration.java index 10f8f32..6033265 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/StructureGeneration.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/StructureGeneration.java @@ -2,9 +2,9 @@ package com.cursedcauldron.wildbackport.common.worldgen.structure; import java.util.List; -import com.cursedcauldron.wildbackport.WildBackport; import com.cursedcauldron.wildbackport.core.mixin.access.StructureTemplatePoolAccessor; import com.mojang.datafixers.util.Pair; + import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.worldgen.PillagerOutpostPools; import net.minecraft.data.worldgen.ProcessorLists; @@ -44,4 +44,4 @@ public class StructureGeneration { templates.add(piece); rawTemplates.add(Pair.of(piece, weight)); } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/pools/AncientCityStructurePools.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/pools/AncientCityStructurePools.java index d2cf1a8..cc93252 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/pools/AncientCityStructurePools.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/pools/AncientCityStructurePools.java @@ -1,10 +1,10 @@ package com.cursedcauldron.wildbackport.common.worldgen.structure.pools; -import com.cursedcauldron.wildbackport.WildBackport; import com.cursedcauldron.wildbackport.common.registry.worldgen.WBWorldGeneration; import com.cursedcauldron.wildbackport.common.worldgen.structure.processors.WBProcessorLists; import com.google.common.collect.ImmutableList; import com.mojang.datafixers.util.Pair; + import net.minecraft.data.worldgen.Pools; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement; @@ -484,4 +484,4 @@ public class AncientCityStructurePools { StructureTemplatePool.Projection.RIGID )); } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/processors/BlockTagRotProcessor.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/processors/BlockTagRotProcessor.java index 432e415..58ac7c9 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/processors/BlockTagRotProcessor.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/processors/BlockTagRotProcessor.java @@ -34,7 +34,7 @@ public class BlockTagRotProcessor extends StructureProcessor { }); private static final StructureProcessorType BLOCK_TAG_ROT = Registry.register( - Registry.STRUCTURE_PROCESSOR, new ResourceLocation("block_rot"), () -> CODEC + Registry.STRUCTURE_PROCESSOR, new ResourceLocation("block_rot_alec"), () -> CODEC ); private final Optional> rottableBlocks; private final float integrity; @@ -70,4 +70,4 @@ public class BlockTagRotProcessor extends StructureProcessor { protected StructureProcessorType getType() { return BLOCK_TAG_ROT; } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/processors/WBProcessorLists.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/processors/WBProcessorLists.java index 8daf5d9..03c1131 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/processors/WBProcessorLists.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/worldgen/structure/processors/WBProcessorLists.java @@ -1,8 +1,8 @@ package com.cursedcauldron.wildbackport.common.worldgen.structure.processors; -import com.cursedcauldron.wildbackport.WildBackport; import com.cursedcauldron.wildbackport.common.tag.WBBlockTags; import com.google.common.collect.ImmutableList; + import net.minecraft.core.Holder; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceLocation; @@ -107,4 +107,4 @@ public class WBProcessorLists { new StructureProcessorList(processors) ); } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/core/mixin/access/StructureFeatureAccessor.java b/common/src/main/java/com/cursedcauldron/wildbackport/core/mixin/access/StructureFeatureAccessor.java new file mode 100644 index 0000000..f2dd4ee --- /dev/null +++ b/common/src/main/java/com/cursedcauldron/wildbackport/core/mixin/access/StructureFeatureAccessor.java @@ -0,0 +1,15 @@ +package com.cursedcauldron.wildbackport.core.mixin.access; + +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(StructureFeature.class) +public interface StructureFeatureAccessor { + @Invoker + public static > + F callRegister(String string, F arg, Decoration arg2) { + throw new AssertionError(); + } +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/core/mixin/common/BeardifierMixin.java b/common/src/main/java/com/cursedcauldron/wildbackport/core/mixin/common/BeardifierMixin.java new file mode 100644 index 0000000..93c493c --- /dev/null +++ b/common/src/main/java/com/cursedcauldron/wildbackport/core/mixin/common/BeardifierMixin.java @@ -0,0 +1,126 @@ +package com.cursedcauldron.wildbackport.core.mixin.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" + ) + ) + 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/common/src/main/java/com/cursedcauldron/wildbackport/core/mixin/common/JigsawPlacementMixin.java b/common/src/main/java/com/cursedcauldron/wildbackport/core/mixin/common/JigsawPlacementMixin.java new file mode 100644 index 0000000..2c05d08 --- /dev/null +++ b/common/src/main/java/com/cursedcauldron/wildbackport/core/mixin/common/JigsawPlacementMixin.java @@ -0,0 +1,31 @@ +package com.cursedcauldron.wildbackport.core.mixin.common; + +import com.cursedcauldron.wildbackport.common.worldgen.AdvancedJigsawConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; +import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; +import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; +import net.minecraft.world.phys.AABB; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(JigsawPlacement.class) +public class JigsawPlacementMixin { + // this is a lambda + @ModifyVariable(method = "method_39824", at = @At(value = "STORE", ordinal = 0)) + private static AABB adjustAncientCityBoundingBox( + AABB aabb, PoolElementStructurePiece alec, JigsawConfiguration conf + ) { + if (conf instanceof AdvancedJigsawConfiguration aconf) { + return new AABB( + aabb.minX + 80 - aconf.maxDistanceFromCenter, + aabb.minY + 80 - aconf.maxDistanceFromCenter, + aabb.minZ + 80 - aconf.maxDistanceFromCenter, + aabb.maxX - 80 + aconf.maxDistanceFromCenter, + aabb.maxY - 80 + aconf.maxDistanceFromCenter, + aabb.maxZ - 80 + aconf.maxDistanceFromCenter + ); + } + return aabb; + } +} 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 new file mode 100644 index 0000000..fb0377d --- /dev/null +++ b/common/src/main/java/com/cursedcauldron/wildbackport/core/mixinhelper/BeardifierLocals.java @@ -0,0 +1,14 @@ +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/common/src/main/resources/data/minecraft/tags/blocks/ancient_city_replacable.json b/common/src/main/resources/data/minecraft/tags/blocks/ancient_city_replacable.json new file mode 100644 index 0000000..15c2255 --- /dev/null +++ b/common/src/main/resources/data/minecraft/tags/blocks/ancient_city_replacable.json @@ -0,0 +1,16 @@ +{ + "values": [ + "minecraft:deepslate", + "minecraft:deepslate_bricks", + "minecraft:deepslate_tiles", + "minecraft:deepslate_brick_slab", + "minecraft:deepslate_tile_slab", + "minecraft:deepslate_brick_stairs", + "minecraft:deepslate_tile_wall", + "minecraft:deepslate_brick_wall", + "minecraft:cobbled_deepslate", + "minecraft:cracked_deepslate_bricks", + "minecraft:cracked_deepslate_tiles", + "minecraft:gray_wool" + ] +} diff --git a/common/src/main/resources/wildbackport-common.mixins.json b/common/src/main/resources/wildbackport-common.mixins.json index 8046161..fcb9b8c 100644 --- a/common/src/main/resources/wildbackport-common.mixins.json +++ b/common/src/main/resources/wildbackport-common.mixins.json @@ -24,6 +24,7 @@ "access.SheetsAccessor", "access.SimpleParticleTypeAccessor", "access.StairBlockAccessor", + "access.StructureFeatureAccessor", "access.StructureTemplatePoolAccessor", "access.TrapDoorBlockAccessor", "access.TreeDecoratorTypeAccessor", @@ -32,7 +33,9 @@ "access.WalkNodeEvaluatorAccessor", "access.WoodButtonBlockAccessor", "access.WoodTypeAccessor", + "common.BeardifierMixin", "common.ItemsMixin", + "common.JigsawPlacementMixin", "common.BlockEntityTypeMixin", "common.FlyNodeEvaluatorMixin", "common.LivingEntityMixin", diff --git a/gradle.properties b/gradle.properties index 2a14066..e92bcf4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,4 +12,4 @@ fabric_api_version=0.57.0+1.18.2 forge_version=1.18.2-40.1.54 -terrablender_version=1.1.0.95 \ No newline at end of file +terrablender_version=1.1.0.95 diff --git a/gradlew b/gradlew old mode 100644 new mode 100755