From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Thu, 22 Feb 2024 18:30:22 -0500 Subject: [PATCH] Fix MC-249136: lag when attempting to locate a buried treasure or opening/breaking a chest containing a map Removed since 1.20.5 This patch ported from 1.20.5 snapshot - 24w04a Mojang issues: https://bugs.mojang.com/browse/MC-249136 diff --git a/src/main/java/net/minecraft/world/level/StructureManager.java b/src/main/java/net/minecraft/world/level/StructureManager.java index 07eb481380e8fd4e492f36342ba633579c1b624e..9f1ab055bbad2d96831c207f8f1b612617377f79 100644 --- a/src/main/java/net/minecraft/world/level/StructureManager.java +++ b/src/main/java/net/minecraft/world/level/StructureManager.java @@ -25,6 +25,7 @@ import net.minecraft.world.level.levelgen.structure.StructureCheck; import net.minecraft.world.level.levelgen.structure.StructureCheckResult; import net.minecraft.world.level.levelgen.structure.StructurePiece; import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; public class StructureManager { public final LevelAccessor level; @@ -164,9 +165,11 @@ public class StructureManager { return this.level.getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES).getAllReferences(); } - public StructureCheckResult checkStructurePresence(ChunkPos chunkPos, Structure structure, boolean skipExistingChunk) { - return this.structureCheck.checkStart(chunkPos, structure, skipExistingChunk); + // Leaf start - Fix MC-249136 + public StructureCheckResult checkStructurePresence(ChunkPos chunkPos, Structure structure, StructurePlacement placement, boolean skipExistingChunk) { + return this.structureCheck.checkStart(chunkPos, structure, placement, skipExistingChunk); } + // Leaf end public void addReference(StructureStart structureStart) { structureStart.addReference(); diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java index 4c03297fb523ef59cd9d11edbed437398e562a00..0e54af504001fb94e65bff1c81a8e2e2e6b039c3 100644 --- a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java +++ b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java @@ -302,7 +302,7 @@ public abstract class ChunkGenerator { } holder = (Holder) iterator.next(); - structurecheckresult = structureAccessor.checkStructurePresence(pos, (Structure) holder.value(), skipReferencedStructures); + structurecheckresult = structureAccessor.checkStructurePresence(pos, (Structure) holder.value(), placement, skipReferencedStructures); // Leaf - Fix MC-249136 } while (structurecheckresult == StructureCheckResult.START_NOT_PRESENT); if (!skipReferencedStructures && structurecheckresult == StructureCheckResult.START_PRESENT) { diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java b/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java index 09867812600b24b3b7d05b58f98582650d313fc8..2193b21de33a59d5a9100d5a34fc54e29866b436 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/StructureCheck.java @@ -31,6 +31,7 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.storage.ChunkScanAccess; import net.minecraft.world.level.chunk.storage.ChunkStorage; import net.minecraft.world.level.levelgen.RandomState; +import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; import org.slf4j.Logger; @@ -171,7 +172,7 @@ public class StructureCheck { this.structureConfigs = registryManager.registryOrThrow(Registries.STRUCTURE); } - public StructureCheckResult checkStart(ChunkPos pos, Structure type, boolean skipReferencedStructures) { + public StructureCheckResult checkStart(ChunkPos pos, Structure type, StructurePlacement placement, boolean skipReferencedStructures) { // Leaf - Fix MC-249136 long l = pos.toLong(); Object2IntMap object2IntMap = this.loadedChunksSafe.get(l); // Paper - rewrite chunk system - synchronise this class if (object2IntMap != null) { @@ -181,6 +182,11 @@ public class StructureCheck { if (structureCheckResult != null) { return structureCheckResult; } else { + // Leaf start - Fix MC-249136 + if (!placement.applyAdditionalChunkRestrictions(pos.x, pos.z, this.seed, null)) { + return StructureCheckResult.START_NOT_PRESENT; + } + // Leaf end boolean bl = this.featureChecksSafe // Paper - rewrite chunk system - synchronise this class .computeIfAbsent(type, structure2 -> new SynchronisedLong2BooleanMap(PER_FEATURE_CHECK_LIMIT)) // Paper - rewrite chunk system - synchronise this class .getOrCompute(l, chunkPos -> this.canCreateStructure(pos, type)); // Paper - rewrite chunk system - synchronise this class diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java b/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java index dc44ae806dc2779e5f0ec0de3fdb4b53da806a5b..c154b3213864f697cc679e2ecdd3b31a97113542 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java +++ b/src/main/java/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java @@ -94,11 +94,21 @@ public abstract class StructurePlacement { } } // Paper end - Add missing structure set seed configs + // Leaf start - Fix MC-249136 return this.isPlacementChunk(calculator, chunkX, chunkZ) - && (!(this.frequency < 1.0F) || this.frequencyReductionMethod.shouldGenerate(calculator.getLevelSeed(), this.salt, chunkX, chunkZ, this.frequency, saltOverride)) // Paper - Add missing structure set seed configs - && (!this.exclusionZone.isPresent() || !this.exclusionZone.get().isPlacementForbidden(calculator, chunkX, chunkZ)); + && this.applyAdditionalChunkRestrictions(chunkX, chunkZ, calculator.getLevelSeed(), saltOverride) + && this.applyInteractionsWithOtherStructures(calculator, chunkX, chunkZ); } + public boolean applyAdditionalChunkRestrictions(int chunkX, int chunkZ, long levelSeed, Integer saltOverride) { + return !(this.frequency < 1.0f) || this.frequencyReductionMethod.shouldGenerate(levelSeed, this.salt, chunkX, chunkZ, this.frequency, saltOverride); // Paper - Add missing structure set seed configs + } + + public boolean applyInteractionsWithOtherStructures(ChunkGeneratorStructureState calculator, int chunkX, int chunkZ) { + return this.exclusionZone.isEmpty() || !this.exclusionZone.get().isPlacementForbidden(calculator, chunkX, chunkZ); + } + // Leaf end + protected abstract boolean isPlacementChunk(ChunkGeneratorStructureState calculator, int chunkX, int chunkZ); public BlockPos getLocatePos(ChunkPos chunkPos) {