2020-05-06 11:48:49 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2020-01-24 20:07:14 +01:00
|
|
|
From: Phoenix616 <mail@moep.tv>
|
|
|
|
Date: Mon, 13 Jan 2020 15:40:32 +0100
|
|
|
|
Subject: [PATCH] Seed based feature search
|
|
|
|
|
|
|
|
This fixes 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 using the same seed checking functionality that is used
|
|
|
|
by the server when generating these features before actually attempting
|
|
|
|
to load the chunk to check if a feature is available in it.
|
|
|
|
|
|
|
|
The only 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 improvement 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
|
2020-05-06 11:48:49 +02:00
|
|
|
index fca4b6e20ab407ecaef3c5909c3d5e23a944e01b..ade7af40effbfff72e731628ac45c5fc40507c99 100644
|
2020-01-24 20:07:14 +01:00
|
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
2020-05-06 10:35:20 +02:00
|
|
|
@@ -357,6 +357,12 @@ public class PaperWorldConfig {
|
2020-01-24 20:07:14 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public boolean seedBasedFeatureSearch = true;
|
|
|
|
+ private void seedBasedFeatureSearch() {
|
|
|
|
+ seedBasedFeatureSearch = getBoolean("seed-based-feature-search", seedBasedFeatureSearch);
|
|
|
|
+ log("Feature search is based on seed: " + seedBasedFeatureSearch);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
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/server/BiomeManager.java b/src/main/java/net/minecraft/server/BiomeManager.java
|
2020-05-06 11:48:49 +02:00
|
|
|
index e96f544f126371f6f629a20ba3c99ba42d31e04a..68423645df3aa08d4c5126ff068d5e566927f744 100644
|
2020-01-24 20:07:14 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/BiomeManager.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/BiomeManager.java
|
|
|
|
@@ -12,10 +12,12 @@ public class BiomeManager {
|
|
|
|
this.c = genlayerzoomer;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public BiomeManager withProvider(WorldChunkManager worldchunkmanager) { return a(worldchunkmanager); } // Paper - OBFHELPER
|
|
|
|
public BiomeManager a(WorldChunkManager worldchunkmanager) {
|
|
|
|
return new BiomeManager(worldchunkmanager, this.b, this.c);
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public BiomeBase getBiome(BlockPosition blockposition) { return a(blockposition); } // Paper - OBFHELPER
|
|
|
|
public BiomeBase a(BlockPosition blockposition) {
|
|
|
|
return this.c.a(this.b, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.a);
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkCoordIntPair.java b/src/main/java/net/minecraft/server/ChunkCoordIntPair.java
|
2020-05-06 11:48:49 +02:00
|
|
|
index f2a19acd84561e746bfc8da0331b5d4055e95327..09f1308b0d092877fae64ce3ab4cce7e460e3c4d 100644
|
2020-01-24 20:07:14 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/ChunkCoordIntPair.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/ChunkCoordIntPair.java
|
|
|
|
@@ -64,10 +64,12 @@ public class ChunkCoordIntPair {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public int getBlockX() { return d(); } // Paper - OBFHELPER
|
|
|
|
public int d() {
|
|
|
|
return this.x << 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public int getBlockZ() { return e(); } // Paper - OBFHELPER
|
|
|
|
public int e() {
|
|
|
|
return this.z << 4;
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/StructureGenerator.java b/src/main/java/net/minecraft/server/StructureGenerator.java
|
2020-05-06 11:48:49 +02:00
|
|
|
index e8ce2ecf23e58d82febf6b9441e0004e69cdc858..acfe732af5b9f63fc2f6b78499defabe2e73ee45 100644
|
2020-01-24 20:07:14 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/StructureGenerator.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/StructureGenerator.java
|
|
|
|
@@ -109,6 +109,15 @@ public abstract class StructureGenerator<C extends WorldGenFeatureConfiguration>
|
|
|
|
if (flag1 || flag2) {
|
|
|
|
ChunkCoordIntPair chunkcoordintpair = this.a(chunkgenerator, seededrandom, j, k, i1, j1);
|
|
|
|
if (!world.getWorldBorder().isChunkInBounds(chunkcoordintpair.x, chunkcoordintpair.z)) { continue; } // Paper
|
|
|
|
+ // Paper start - seed based feature search
|
|
|
|
+ if (world.paperConfig.seedBasedFeatureSearch) {
|
|
|
|
+ BiomeManager biomeManager = world.getBiomeManager().withProvider(chunkgenerator.getWorldChunkManager());
|
|
|
|
+ BiomeBase biomeBase = biomeManager.getBiome(new BlockPosition(chunkcoordintpair.getBlockX() + 9, 0, chunkcoordintpair.getBlockZ() + 9));
|
|
|
|
+ if (!shouldGenerate(biomeManager, chunkgenerator, seededrandom, chunkcoordintpair.x, chunkcoordintpair.z, biomeBase)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
StructureStart structurestart = world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z, ChunkStatus.STRUCTURE_STARTS).a(this.b());
|
|
|
|
|
|
|
|
if (structurestart != null && structurestart.e()) {
|
|
|
|
@@ -165,6 +174,7 @@ public abstract class StructureGenerator<C extends WorldGenFeatureConfiguration>
|
|
|
|
return new ChunkCoordIntPair(i + k, j + l);
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public boolean shouldGenerate(BiomeManager biomemanager, ChunkGenerator<?> chunkgenerator, Random random, int chunkX, int chunkZ, BiomeBase biomebase) { return a(biomemanager, chunkgenerator, random, chunkX, chunkZ, biomebase); } // Paper - OBFHELPER
|
|
|
|
public abstract boolean a(BiomeManager biomemanager, ChunkGenerator<?> chunkgenerator, Random random, int i, int j, BiomeBase biomebase);
|
|
|
|
|
|
|
|
public abstract StructureGenerator.a a();
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
2020-05-06 11:48:49 +02:00
|
|
|
index 228e6e9ab997394dc99775a5f787455b8b7d6d63..f1d072a39cc2f0f7b214e7794f8dc5dcc282d6b3 100644
|
2020-01-24 20:07:14 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
Entity Activation Range 2.0! Major improvements to restoring behavior
Calling this 2.0 as it's a pretty major improvement with more knobs to twist.
This update fixes many things. The goal here is to restore vanilla behavior to some degree.
Instead of permanent inactive pools of animals, let them show some signs of life some....
Yes this may reduce performance compared to before, but I hope it is minimal. Got to find a balance.
Previous EAR logic really compromised vanilla behavior of mobs. This tries to restore it.
Changes:
1) All monsters are now classed as Monster. Mojang has an interface, we should use it.
- This now includes Shulker, Slimes, see #2 for Phantom and Ghast
2) Villagers and Flying Monsters now have their own separate activation range configs.
- Villagers will default to your Animals config
3) Added a bunch of more immunities
- Brand new entities are immune for a few seconds
- Entities that recently traveled by portal are immune for few seconds
- Entities that are leashed to a player are immune
- Ender Signals are immune
- Entities that are jumping, climbing, dying (lol) are immune
- Minecarts are now always immune to the movement restriction
4) Villagers immunity received major overhaul...
- Now has many immunities for Villager activities to let them
do their work then go back inactive
- Such as interacting with doors and workstations should be more normal now
- Raids will trigger immunities, in that villagers will run and hide when bell rings.
- Raid should keep the entire village immune during the raid to keep gameplay mechanics
You can disable raids by game rule if you dont want raids
Then the big one.....
Wake Up Inactive Entities:
One issue plagueing "farms" is that we no longer even let entities move now.
Entities become lifeless.
A new system has been introduced to wake up inactive entities every so often, to let
them stretch their legs, eat some food, play with each other and experience the good entity life.
Animals, Villagers, Monsters (Includes Pillagers), and Flying Monsters will now wake up every
so often after staying inactive for a very long. This grants them a temporary immunity, that
the goal is they will then find "stuff to do" by having a longer activity window.
How many to wake up, how often they wake up, and for how long they wake up are all configurable.
Current EAR Immunities really don't give some entities enough of a window to find work
to then keep them immune for the work to even start. This system should help that.
We will only wake up a few entities per tick on the first wave, restoring 1 per type per world per tick.
So say you have 10 monsters qualify for inactive wake up, all 8 will wake up on the first eligible tick,
and then the 9th will wake up on next tick, 10th on next tick.
If for 5 ticks no more inactive wake up, our buffer will have built back up to 5, and then 5 can go next needed tick.
This basically incrementally wakes them up, preventing too many from waking up in a single tick, to reduce impact to TPS.
2020-04-27 06:34:51 +02:00
|
|
|
@@ -1569,8 +1569,8 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
|
2020-01-24 20:07:14 +01:00
|
|
|
return this.methodProfiler;
|
|
|
|
}
|
|
|
|
|
|
|
|
- @Override
|
|
|
|
- public BiomeManager d() {
|
|
|
|
+ public BiomeManager getBiomeManager() { return d(); } // Paper - OBFHELPER
|
|
|
|
+ @Override public BiomeManager d() {
|
|
|
|
return this.biomeManager;
|
|
|
|
}
|
|
|
|
}
|