geforkt von Mirrors/Paper
aa52bf9e33
Mojang made some changes to priorities in 1.17 and it seems that these changes conflict with the changes made in this patch, which in some cases appears to cause excessive rescheduling of tasks. This, however, is not confirmed as such but seems to be the behavior that we're seeing to cause this issue, if mojang has adopted the changes we suggested, then a good chunk of this patch may be unneeded, but, this needs a much better look than I'm currently able to do
72 Zeilen
4.8 KiB
Diff
72 Zeilen
4.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Phoenix616 <mail@moep.tv>
|
|
Date: Mon, 13 Jan 2020 15:40:32 +0100
|
|
Subject: [PATCH] Seed based feature search
|
|
|
|
This tries to work around the issue where the server will load
|
|
surrounding chunks up to a radius of 100 chunks in order to search for
|
|
features e.g. when running the /locate command or for treasure maps
|
|
(issue #2312).
|
|
This is done by backporting Mojang's change in 1.17 which makes it so
|
|
that the biome (generated by the seed) is checked first if the feature
|
|
can be generated before actually to load the chunk.
|
|
|
|
Additionally to that the center location of the target chunk is simply
|
|
returned if the chunk is not loaded to avoid the sync chunk load.
|
|
As this can lead to less precise locations a toggle is provided to
|
|
enable the sync loading of the target chunk again.
|
|
|
|
The main downside of this is that it breaks once the seed or generator
|
|
changes but this should usually not happen. A config option to disable
|
|
this completely is added though in case that should ever be necessary.
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
index a03b835320bb99c38ec5f23f0c23284c08bd4171..45e65d1c56b693d8f7c5c12da7774849c737aa96 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -376,6 +376,14 @@ public class PaperWorldConfig {
|
|
}
|
|
}
|
|
|
|
+ public boolean seedBasedFeatureSearch = true;
|
|
+ public boolean seedBasedFeatureSearchLoadsChunks = true;
|
|
+ private void seedBasedFeatureSearch() {
|
|
+ seedBasedFeatureSearch = getBoolean("seed-based-feature-search", seedBasedFeatureSearch);
|
|
+ seedBasedFeatureSearchLoadsChunks = getBoolean("seed-based-feature-search-loads-chunks", seedBasedFeatureSearchLoadsChunks);
|
|
+ log("Feature search is based on seed: " + seedBasedFeatureSearch + ", loads chunks:" + seedBasedFeatureSearchLoadsChunks);
|
|
+ }
|
|
+
|
|
public int maxCollisionsPerEntity;
|
|
private void maxEntityCollision() {
|
|
maxCollisionsPerEntity = getInt( "max-entity-collisions", this.spigotConfig.getInt("max-entity-collisions", 8) );
|
|
diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/StructureFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/StructureFeature.java
|
|
index d7129f3379f2edecbcfd85f83d75e4d7064ce71d..7705ad4460ddf5166d922888f3a1368c50bb11ca 100644
|
|
--- a/src/main/java/net/minecraft/world/level/levelgen/feature/StructureFeature.java
|
|
+++ b/src/main/java/net/minecraft/world/level/levelgen/feature/StructureFeature.java
|
|
@@ -171,7 +171,24 @@ public abstract class StructureFeature<C extends FeatureConfiguration> {
|
|
if (!world.getWorldBorder().isChunkInBounds(chunkPos.x, chunkPos.z)) { continue; } // Paper
|
|
boolean bl3 = world.getBiomeManager().getPrimaryBiomeAtChunk(chunkPos).getGenerationSettings().isValidStart(this);
|
|
if (bl3) {
|
|
- ChunkAccess chunkAccess = world.getChunk(chunkPos.x, chunkPos.z, ChunkStatus.STRUCTURE_STARTS);
|
|
+ // Paper start - seed based feature search
|
|
+ ChunkAccess chunkAccess = null;
|
|
+ if (structureAccessor.getWorld().paperConfig.seedBasedFeatureSearch) {
|
|
+ Biome biomeBase = structureAccessor.getWorld().getBiomeManager().getBiome(new BlockPos(chunkPos.getMinBlockX() + 9, 0, chunkPos.getMinBlockZ() + 9));
|
|
+ if (!biomeBase.getGenerationSettings().isValidStart(this)) {
|
|
+ continue;
|
|
+ }
|
|
+ if (!structureAccessor.getWorld().paperConfig.seedBasedFeatureSearchLoadsChunks) {
|
|
+ chunkAccess = structureAccessor.getWorld().getChunkIfLoaded(chunkPos.x, chunkPos.z);
|
|
+ if (chunkAccess == null) {
|
|
+ return chunkPos.getWorldPosition().offset(8, searchStartPos.getY(), 8);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ if (chunkAccess == null) {
|
|
+ chunkAccess = world.getChunk(chunkPos.x, chunkPos.z, ChunkStatus.STRUCTURE_STARTS);
|
|
+ }
|
|
+ // Paper end
|
|
StructureStart<?> structureStart = structureAccessor.getStartForFeature(SectionPos.bottomOf(chunkAccess), this, chunkAccess);
|
|
if (structureStart != null && structureStart.isValid()) {
|
|
if (skipExistingChunks && structureStart.canBeReferenced()) {
|