From 90848b8972ca9d6def612246cb74a0bbf3902e7f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 30 Apr 2024 18:04:30 -0400 Subject: [PATCH] Update optimization to 1.20 --- .../ChunkGeneratorAccessor.java | 17 ------------ .../ServerLevelMixin.java | 22 ++++++++++++++++ .../StructureCheckMixin.java | 26 ++++++++++++------- .../modernfix/duck/IStructureCheck.java | 7 +++++ 4 files changed, 45 insertions(+), 27 deletions(-) delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/ChunkGeneratorAccessor.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/ServerLevelMixin.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/duck/IStructureCheck.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/ChunkGeneratorAccessor.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/ChunkGeneratorAccessor.java deleted file mode 100644 index 32fc1811..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/ChunkGeneratorAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.faster_structure_location; - -import net.minecraft.core.Holder; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.RandomState; -import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.List; - -@Mixin(ChunkGenerator.class) -public interface ChunkGeneratorAccessor { - @Invoker("getPlacementsForStructure") - List invokeGetPlacementsForStructure(Holder structure, RandomState random); -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/ServerLevelMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/ServerLevelMixin.java new file mode 100644 index 00000000..393ae367 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/ServerLevelMixin.java @@ -0,0 +1,22 @@ +package org.embeddedt.modernfix.common.mixin.perf.faster_structure_location; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.levelgen.structure.StructureCheck; +import org.embeddedt.modernfix.duck.IStructureCheck; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ServerLevel.class) +public class ServerLevelMixin { + @Shadow @Final private ServerChunkCache chunkSource; + + @ModifyExpressionValue(method = "", at = @At(value = "NEW", target = "(Lnet/minecraft/world/level/chunk/storage/ChunkScanAccess;Lnet/minecraft/core/RegistryAccess;Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/chunk/ChunkGenerator;Lnet/minecraft/world/level/levelgen/RandomState;Lnet/minecraft/world/level/LevelHeightAccessor;Lnet/minecraft/world/level/biome/BiomeSource;JLcom/mojang/datafixers/DataFixer;)Lnet/minecraft/world/level/levelgen/structure/StructureCheck;", ordinal = 0)) + private StructureCheck attachGeneratorState(StructureCheck check) { + ((IStructureCheck)check).mfix$setStructureState(this.chunkSource.getGeneratorState()); + return check; + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/StructureCheckMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/StructureCheckMixin.java index c99749dd..8b9e2b23 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/StructureCheckMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_structure_location/StructureCheckMixin.java @@ -3,22 +3,26 @@ package org.embeddedt.modernfix.common.mixin.perf.faster_structure_location; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.core.Registry; import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.RandomState; +import net.minecraft.world.level.chunk.ChunkGeneratorStructureState; import net.minecraft.world.level.levelgen.structure.Structure; import net.minecraft.world.level.levelgen.structure.StructureCheck; import net.minecraft.world.level.levelgen.structure.StructureCheckResult; +import org.embeddedt.modernfix.duck.IStructureCheck; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @Mixin(StructureCheck.class) -public class StructureCheckMixin { - @Shadow @Final private ChunkGenerator chunkGenerator; - @Shadow @Final private long seed; +public class StructureCheckMixin implements IStructureCheck { @Shadow @Final private Registry structureConfigs; - @Shadow @Final private RandomState randomState; + + private ChunkGeneratorStructureState mfix$structureState; + + @Override + public void mfix$setStructureState(ChunkGeneratorStructureState state) { + mfix$structureState = state; + } /** * @author embeddedt (inspired by 24w04a and Bytzo's comment on https://bugs.mojang.com/browse/MC-249136) @@ -29,17 +33,19 @@ public class StructureCheckMixin { private StructureCheckResult mfix$checkForValidPosition(StructureCheckResult storageResult, ChunkPos chunkPos, Structure structure, boolean skipKnownStructures) { if (storageResult != null) { return storageResult; - } else { + } else if(mfix$structureState != null) { // Check if any of the placements allow for this structure to be in this chunk - var structureHolder = this.structureConfigs.getHolder(this.structureConfigs.getId(structure)).orElseThrow(); - for (var placement : ((ChunkGeneratorAccessor)this.chunkGenerator).invokeGetPlacementsForStructure(structureHolder, this.randomState)) { - if (placement.isStructureChunk(this.chunkGenerator, this.randomState, this.seed, chunkPos.x, chunkPos.z)) { + var structureHolder = this.structureConfigs.wrapAsHolder(structure); + for (var placement : mfix$structureState.getPlacementsForStructure(structureHolder)) { + if (placement.isStructureChunk(mfix$structureState, chunkPos.x, chunkPos.z)) { // Allowed - return null so regular check runs return null; } } // Not allowed - early exit by returning a non-null value return StructureCheckResult.START_NOT_PRESENT; + } else { + return null; } } } diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/IStructureCheck.java b/common/src/main/java/org/embeddedt/modernfix/duck/IStructureCheck.java new file mode 100644 index 00000000..99fb8f9a --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/duck/IStructureCheck.java @@ -0,0 +1,7 @@ +package org.embeddedt.modernfix.duck; + +import net.minecraft.world.level.chunk.ChunkGeneratorStructureState; + +public interface IStructureCheck { + void mfix$setStructureState(ChunkGeneratorStructureState state); +}