9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-19 15:09:25 +00:00
Files
Leaf/leaf-archived-patches/removed/1.20.5/server/0065-Fix-MC-249136-lag-when-attempting-to-locate-a-buried.patch
2025-06-29 23:39:55 +08:00

112 lines
7.5 KiB
Diff

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<Structure> 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) {