mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-29 15:49:00 +01:00
Add configurable spawn loaded range back (#2051)
This commit is contained in:
parent
50c66c63aa
commit
b8fb51a017
1 changed files with 180 additions and 0 deletions
|
@ -0,0 +1,180 @@
|
|||
From 0000000000000000000000000000000000000000 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
|
||||
@@ -0,0 +0,0 @@ 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 73ac45bf7a..b7fd59cb89 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -0,0 +0,0 @@ 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();
|
||||
|
||||
@@ -0,0 +0,0 @@ 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
|
||||
@@ -0,0 +0,0 @@ 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
|
||||
@@ -0,0 +0,0 @@ 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
|
||||
@@ -0,0 +0,0 @@ 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 a263d8e7fb..502ed2d03c 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
@@ -0,0 +0,0 @@ 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
|
||||
--
|
Loading…
Reference in a new issue