diff --git a/common/src/main/java/com/cobblemon/mod/common/mixin/JigsawPlacementMixin.java b/common/src/main/java/com/cobblemon/mod/common/mixin/JigsawPlacementMixin.java index 2275f120e6..5e7d3b0bc9 100644 --- a/common/src/main/java/com/cobblemon/mod/common/mixin/JigsawPlacementMixin.java +++ b/common/src/main/java/com/cobblemon/mod/common/mixin/JigsawPlacementMixin.java @@ -10,16 +10,14 @@ package com.cobblemon.mod.common.mixin; import com.cobblemon.mod.common.mixin.accessor.SinglePoolElementAccessor; import com.cobblemon.mod.common.world.structureprocessors.HeightRangeStructureProcessor; -import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; -import net.minecraft.util.RandomSource; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; -import net.minecraft.world.level.levelgen.structure.pools.LegacySinglePoolElement; -import net.minecraft.world.level.levelgen.structure.pools.SinglePoolElement; -import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement; -import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; +import net.minecraft.world.level.levelgen.structure.pools.*; +import net.minecraft.world.level.levelgen.structure.pools.alias.PoolAliasLookup; +import net.minecraft.world.level.levelgen.structure.templatesystem.LiquidSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList; import org.spongepowered.asm.mixin.Mixin; @@ -28,24 +26,38 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.List; import java.util.Optional; @Mixin(JigsawPlacement.class) public class JigsawPlacementMixin { @Inject( - method = "addPieces*", - at = @At("HEAD"), + method = "addPieces(Lnet/minecraft/world/level/levelgen/structure/Structure$GenerationContext;Lnet/minecraft/core/Holder;Ljava/util/Optional;ILnet/minecraft/core/BlockPos;ZLjava/util/Optional;ILnet/minecraft/world/level/levelgen/structure/pools/alias/PoolAliasLookup;Lnet/minecraft/world/level/levelgen/structure/pools/DimensionPadding;Lnet/minecraft/world/level/levelgen/structure/templatesystem/LiquidSettings;)Ljava/util/Optional;", + at = @At("RETURN"), cancellable = true ) - private static void cobblemon$cancelInvalidHeightRangeStart( - CallbackInfoReturnable> cir, - @Local(argsOnly = true, ordinal = 0) Structure.GenerationContext generationContext, - @Local(argsOnly = true, ordinal = 0) Holder startPool, - @Local(argsOnly = true, ordinal = 0) BlockPos startPos + private static void onAddPieces( + Structure.GenerationContext context, + Holder startPool, + Optional startJigsawName, + int maxDepth, + BlockPos pos, + boolean useExpansionHack, + Optional projectStartToHeightmap, + int maxDistanceFromCenter, + PoolAliasLookup aliasLookup, + DimensionPadding dimensionPadding, + LiquidSettings liquidSettings, + CallbackInfoReturnable> cir ) { - if (cobblemon$canAnyStartElementPlace(generationContext, startPool, startPos)) { + Optional result = cir.getReturnValue(); + if (result.isEmpty()) { + return; + } + BlockPos spawnPos = result.get().position(); + boolean canPlace = cobblemon$canAnyStartElementPlace(context, startPool, spawnPos); + + if (canPlace) { return; } @@ -58,19 +70,22 @@ public class JigsawPlacementMixin { Holder startPool, BlockPos startPos ) { - List elements = startPool.value().getShuffledTemplates(RandomSource.create(0L)); - for (StructurePoolElement element : elements) { + for (StructurePoolElement element : startPool.value().templates) { Optional heightRangeProcessor = cobblemon$getHeightRangeProcessor(element); + if (heightRangeProcessor.isEmpty()) { return true; } - if (heightRangeProcessor.get().isValidPlacement( + HeightRangeStructureProcessor processor = heightRangeProcessor.get(); + boolean valid = processor.isValidPlacement( generationContext.chunkGenerator(), generationContext.heightAccessor(), generationContext.randomState(), startPos - )) { + ); + + if (valid) { return true; } } @@ -93,5 +108,4 @@ public class JigsawPlacementMixin { return Optional.empty(); } -} - +} \ No newline at end of file diff --git a/common/src/main/resources/cobblemon-common.accesswidener b/common/src/main/resources/cobblemon-common.accesswidener index 96ba051f94..86e2e0f82b 100644 --- a/common/src/main/resources/cobblemon-common.accesswidener +++ b/common/src/main/resources/cobblemon-common.accesswidener @@ -147,6 +147,8 @@ accessible method net/minecraft/world/level/block/AbstractCandleBlock addParticl transitive-accessible class net/minecraft/world/inventory/BrewingStandMenu$IngredientsSlot transitive-accessible class net/minecraft/world/inventory/BrewingStandMenu$FuelSlot +transitive-accessible field net/minecraft/world/level/levelgen/structure/pools/StructureTemplatePool templates Lit/unimi/dsi/fastutil/objects/ObjectArrayList; + transitive-accessible method net/minecraft/world/level/block/Block spawnDestroyParticles (Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V transitive-accessible method net/minecraft/world/food/FoodData add (IF)V