mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
112 lines
7.5 KiB
Diff
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) {
|