Paper/Spigot-Server-Patches/0396-Configurable-Keep-Spawn-Loaded-range-per-world.patch
Shane Freeder b3aa7dadcd
Updated Upstream (CraftBukkit)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

CraftBukkit Changes:
c45c0a98 SPIGOT-4972: Cannot add contextual data to loot table API
2019-05-24 04:49:27 +01:00

183 lines
8.5 KiB
Diff

From 628c3118f290f4d5bf6259de1c7a7a28b620012b Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Sat, 13 Sep 2014 23:14:43 -0400
Subject: [PATCH] Configurable Keep Spawn Loaded range per world
This lets you disable it for some worlds and lower it for others.
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index 385b3ac0ce..b854061983 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -488,4 +488,10 @@ public class PaperWorldConfig {
break;
}
}
+
+ public short keepLoadedRange;
+ private void keepLoadedRange() {
+ keepLoadedRange = (short) (getInt("keep-spawn-loaded-range", Math.min(spigotConfig.viewDistance, 10)) * 16);
+ log( "Keep Spawn Loaded Range: " + (keepLoadedRange/16));
+ }
}
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index f1cd38d421..184f1b00f0 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -570,6 +570,13 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
this.forceTicks = true;
// CraftBukkit end
+ // Paper start - configurable spawn reason
+ int radiusBlocks = worldserver.paperConfig.keepLoadedRange;
+ worldloadlistener.setChunkRadius(radiusBlocks / 16);
+ int totalChunks = ((radiusBlocks / 16) * 2 + 1);
+ totalChunks *= totalChunks;
+ // Paper end
+
MinecraftServer.LOGGER.info("Preparing start region for dimension '{}'/{}", worldserver.getWorldData().getName(), DimensionManager.a(worldserver.worldProvider.getDimensionManager().getType())); // CraftBukkit
BlockPosition blockposition = worldserver.getSpawn();
@@ -578,14 +585,19 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
chunkproviderserver.getLightEngine().a(500);
this.nextTick = SystemUtils.getMonotonicMillis();
- chunkproviderserver.addTicket(TicketType.START, new ChunkCoordIntPair(blockposition), 11, Unit.INSTANCE);
+ // Paper start - Configurable spawn radius
+ if (worldserver.keepSpawnInMemory) {
+ worldserver.addTicketsForSpawn(radiusBlocks, blockposition);
+ }
- while (chunkproviderserver.b() != 441) {
+ while (worldserver.keepSpawnInMemory && chunkproviderserver.b() != totalChunks) {
+ // Paper end
// CraftBukkit start
// this.nextTick = SystemUtils.getMonotonicMillis() + 10L;
this.executeModerately();
// CraftBukkit end
}
+ LOGGER.info("Loaded " + chunkproviderserver.b() + " spawn chunks for world " + worldserver.getWorldData().getName()); // Paper
// CraftBukkit start
// this.nextTick = SystemUtils.getMonotonicMillis() + 10L;
diff --git a/src/main/java/net/minecraft/server/WorldLoadListener.java b/src/main/java/net/minecraft/server/WorldLoadListener.java
index d6762d3853..7b6f5b2da0 100644
--- a/src/main/java/net/minecraft/server/WorldLoadListener.java
+++ b/src/main/java/net/minecraft/server/WorldLoadListener.java
@@ -9,4 +9,6 @@ public interface WorldLoadListener {
void a(ChunkCoordIntPair chunkcoordintpair, @Nullable ChunkStatus chunkstatus);
void b();
+
+ void setChunkRadius(int radius); // Paper - allow changing chunk radius
}
diff --git a/src/main/java/net/minecraft/server/WorldLoadListenerLogger.java b/src/main/java/net/minecraft/server/WorldLoadListenerLogger.java
index f71e1aece1..e1efc61724 100644
--- a/src/main/java/net/minecraft/server/WorldLoadListenerLogger.java
+++ b/src/main/java/net/minecraft/server/WorldLoadListenerLogger.java
@@ -7,16 +7,24 @@ import org.apache.logging.log4j.Logger;
public class WorldLoadListenerLogger implements WorldLoadListener {
private static final Logger LOGGER = LogManager.getLogger();
- private final int b;
+ private int b; // Paper - remove final
private int c;
private long d;
private long e = Long.MAX_VALUE;
public WorldLoadListenerLogger(int i) {
- int j = i * 2 + 1;
+ // Paper start - Allow changing radius later for configurable spawn patch
+ this.setChunkRadius(i); // Move to method
+ }
+
+ @Override
+ public void setChunkRadius(int radius) {
+ // Paper - copied from above
+ int j = radius * 2 + 1;
this.b = j * j;
}
+ // Paper end
@Override
public void a(ChunkCoordIntPair chunkcoordintpair) {
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 3ed12672e3..dd2133665f 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -1487,13 +1487,37 @@ public class WorldServer extends World {
return ((PersistentIdCounts) this.getMinecraftServer().getWorldServer(DimensionManager.OVERWORLD).getWorldPersistentData().a(PersistentIdCounts::new, "idcounts")).a();
}
+ // Paper start - helper function for configurable spawn radius
+ public void addTicketsForSpawn(int radiusInBlocks, BlockPosition spawn) {
+ ChunkProviderServer chunkproviderserver = this.getChunkProvider();
+ for (int x = -radiusInBlocks; x <= radiusInBlocks; x+= 16) {
+ for (int z = -radiusInBlocks; z <= radiusInBlocks; z += 16) {
+ chunkproviderserver.addTicket(TicketType.START, new ChunkCoordIntPair(spawn.add(x, 0, z)), 1, Unit.INSTANCE);
+ }
+ }
+ }
+ public void removeTicketsForSpawn(int radiusInBlocks, BlockPosition spawn) {
+ ChunkProviderServer chunkproviderserver = this.getChunkProvider();
+ for (int x = -radiusInBlocks; x <= radiusInBlocks; x+= 16) {
+ for (int z = -radiusInBlocks; z <= radiusInBlocks; z += 16) {
+ chunkproviderserver.removeTicket(TicketType.START, new ChunkCoordIntPair(spawn.add(x, 0, z)), 1, Unit.INSTANCE);
+ }
+ }
+ }
+ // Paper end
+
@Override
public void a_(BlockPosition blockposition) {
- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(new BlockPosition(this.worldData.b(), 0, this.worldData.d()));
+ // Paper - configurable spawn radius
+ BlockPosition prevSpawn = this.getSpawn();
super.a_(blockposition);
- this.getChunkProvider().removeTicket(TicketType.START, chunkcoordintpair, 11, Unit.INSTANCE);
- this.getChunkProvider().addTicket(TicketType.START, new ChunkCoordIntPair(blockposition), 11, Unit.INSTANCE);
+ if (this.keepSpawnInMemory) {
+ // if this keepSpawnInMemory is false a plugin has already removed our tickets, do not re-add
+ this.removeTicketsForSpawn(this.paperConfig.keepLoadedRange, prevSpawn);
+ this.addTicketsForSpawn(this.paperConfig.keepLoadedRange, blockposition);
+ }
+ // Paper end
}
public LongSet getForceLoadedChunks() {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 5632d3e3f7..d39ef83085 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -1749,15 +1749,21 @@ public class CraftWorld implements World {
@Override
public void setKeepSpawnInMemory(boolean keepLoaded) {
+ // Paper start - Configurable spawn radius
+ if (keepLoaded == world.keepSpawnInMemory) {
+ // do nothing, nothing has changed
+ return;
+ }
world.keepSpawnInMemory = keepLoaded;
// Grab the worlds spawn chunk
- BlockPosition chunkcoordinates = this.world.getSpawn();
+ BlockPosition prevSpawn = this.world.getSpawn();
if (keepLoaded) {
- world.getChunkProvider().addTicket(TicketType.START, new ChunkCoordIntPair(chunkcoordinates), 11, Unit.INSTANCE);
+ world.addTicketsForSpawn(world.paperConfig.keepLoadedRange, prevSpawn);
} else {
- // TODO: doesn't work well if spawn changed....
- world.getChunkProvider().removeTicket(TicketType.START, new ChunkCoordIntPair(chunkcoordinates), 11, Unit.INSTANCE);
+ // TODO: doesn't work well if spawn changed.... // paper - resolved
+ world.removeTicketsForSpawn(world.paperConfig.keepLoadedRange, prevSpawn);
}
+ // Paper end
}
@Override
--
2.21.0