mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-28 05:25:42 +01:00
29b17a892d
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 5efeb7bd Also update compiler version c13b867a Update some Maven plugin versions deb28d9f PR-837: Add more bell API e938d62a PR-819: Allow Player#sendBlockDamage() to specify a source entity 0e75532c PR-818: Add more Guardian API, particularly for its laser a10155aa PR-839: Add BlockData#rotate and BlockData#mirror 77e690b4 PR-836: Add missing API for explosive minecarts 60722059 PR-832: Allow getting chunks without generating them and optimize chunk data request for ungenerated chunks 0a2c4b4b PR-834: Add Player#sendHurtAnimation() CraftBukkit Changes: be8682aa8 Also update compiler version 08e305f5b Update some Maven plugin versions 187bdd463 PR-1160: Add more bell API 2f8e5bc7c PR-1145: Allow Player#sendBlockDamage() to specify a source entity bcbb61b36 PR-1144: Add more Guardian API, particularly for its laser 722ddff6d PR-1162: Add BlockData#rotate and BlockData#mirror 80998277c PR-1159: Add missing API for explosive minecarts 1fddefce1 PR-1155: Allow getting chunks without generating them and optimize chunk data request for ungenerated chunks 20e8a486f PR-1157: Add Player#sendHurtAnimation() Spigot Changes: b31949f2 Rebuild patches
232 lines
12 KiB
Diff
232 lines
12 KiB
Diff
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/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index b647007dc94e2ea416ce4dc659c8b2d623426979..9367b999e91d53b742fb161fd9131a2c99e35c6d 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -740,31 +740,34 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
|
|
// CraftBukkit start
|
|
public void prepareLevels(ChunkProgressListener worldloadlistener, ServerLevel worldserver) {
|
|
+ ServerChunkCache chunkproviderserver = worldserver.getChunkSource(); // Paper
|
|
// WorldServer worldserver = this.overworld();
|
|
this.forceTicks = true;
|
|
// CraftBukkit end
|
|
+ if (worldserver.getWorld().getKeepSpawnInMemory()) { // Paper
|
|
|
|
MinecraftServer.LOGGER.info("Preparing start region for dimension {}", worldserver.dimension().location());
|
|
BlockPos blockposition = worldserver.getSharedSpawnPos();
|
|
|
|
worldloadlistener.updateSpawnPos(new ChunkPos(blockposition));
|
|
- ServerChunkCache chunkproviderserver = worldserver.getChunkSource();
|
|
+ //ChunkProviderServer chunkproviderserver = worldserver.getChunkProvider(); // Paper - move up
|
|
|
|
chunkproviderserver.getLightEngine().setTaskPerBatch(500);
|
|
this.nextTickTime = Util.getMillis();
|
|
- // CraftBukkit start
|
|
- if (worldserver.getWorld().getKeepSpawnInMemory()) {
|
|
- chunkproviderserver.addRegionTicket(TicketType.START, new ChunkPos(blockposition), 11, Unit.INSTANCE);
|
|
-
|
|
- while (chunkproviderserver.getTickingGenerated() != 441) {
|
|
- // this.nextTickTime = SystemUtils.getMillis() + 10L;
|
|
- this.executeModerately();
|
|
- }
|
|
- }
|
|
+ // Paper start - configurable spawn reason
|
|
+ int radiusBlocks = worldserver.paperConfig().spawn.keepSpawnLoadedRange * 16;
|
|
+ int radiusChunks = radiusBlocks / 16 + ((radiusBlocks & 15) != 0 ? 1 : 0);
|
|
+ int totalChunks = ((radiusChunks) * 2 + 1);
|
|
+ totalChunks *= totalChunks;
|
|
+ worldloadlistener.setChunkRadius(radiusBlocks / 16);
|
|
+
|
|
+ worldserver.addTicketsForSpawn(radiusBlocks, blockposition);
|
|
+ // Paper end
|
|
|
|
// this.nextTickTime = SystemUtils.getMillis() + 10L;
|
|
this.executeModerately();
|
|
// Iterator iterator = this.levels.values().iterator();
|
|
+ }
|
|
|
|
if (true) {
|
|
ServerLevel worldserver1 = worldserver;
|
|
@@ -787,7 +790,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
// this.nextTickTime = SystemUtils.getMillis() + 10L;
|
|
this.executeModerately();
|
|
// CraftBukkit end
|
|
- worldloadlistener.stop();
|
|
+ if (worldserver.getWorld().getKeepSpawnInMemory()) worldloadlistener.stop(); // Paper
|
|
chunkproviderserver.getLightEngine().setTaskPerBatch(5);
|
|
// CraftBukkit start
|
|
// this.updateMobSpawningFlags();
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
index 58c1769ea15249df950a40e2f164e2ff7aeb05bd..2a2e795923ecaa300c7fc26fd71444711bd43535 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
@@ -64,6 +64,7 @@ import net.minecraft.network.protocol.game.ClientboundSoundEntityPacket;
|
|
import net.minecraft.network.protocol.game.ClientboundSoundPacket;
|
|
import net.minecraft.network.protocol.game.DebugPackets;
|
|
import net.minecraft.resources.ResourceKey;
|
|
+import io.papermc.paper.util.MCUtil;
|
|
import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.server.ServerScoreboard;
|
|
import net.minecraft.server.level.progress.ChunkProgressListener;
|
|
@@ -1725,12 +1726,84 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
|
return ((MapIndex) this.getServer().overworld().getDataStorage().computeIfAbsent(MapIndex::load, MapIndex::new, "idcounts")).getFreeAuxValueForMap();
|
|
}
|
|
|
|
+ // Paper start - helper function for configurable spawn radius
|
|
+ public void addTicketsForSpawn(int radiusInBlocks, BlockPos spawn) {
|
|
+ // In order to respect vanilla behavior, which is ensuring everything but the spawn border can tick, we add tickets
|
|
+ // with level 31 for the non-border spawn chunks
|
|
+ ServerChunkCache chunkproviderserver = this.getChunkSource();
|
|
+ int tickRadius = radiusInBlocks - 16;
|
|
+
|
|
+ // add ticking chunks
|
|
+ for (int x = -tickRadius; x <= tickRadius; x += 16) {
|
|
+ for (int z = -tickRadius; z <= tickRadius; z += 16) {
|
|
+ // radius of 2 will have the current chunk be level 31
|
|
+ chunkproviderserver.addRegionTicket(TicketType.START, new ChunkPos(spawn.offset(x, 0, z)), 2, Unit.INSTANCE);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // add border chunks
|
|
+
|
|
+ // add border along x axis (including corner chunks)
|
|
+ for (int x = -radiusInBlocks; x <= radiusInBlocks; x += 16) {
|
|
+ // top
|
|
+ chunkproviderserver.addRegionTicket(TicketType.START, new ChunkPos(spawn.offset(x, 0, radiusInBlocks)), 1, Unit.INSTANCE); // level 32
|
|
+ // bottom
|
|
+ chunkproviderserver.addRegionTicket(TicketType.START, new ChunkPos(spawn.offset(x, 0, -radiusInBlocks)), 1, Unit.INSTANCE); // level 32
|
|
+ }
|
|
+
|
|
+ // add border along z axis (excluding corner chunks)
|
|
+ for (int z = -radiusInBlocks + 16; z < radiusInBlocks; z += 16) {
|
|
+ // right
|
|
+ chunkproviderserver.addRegionTicket(TicketType.START, new ChunkPos(spawn.offset(radiusInBlocks, 0, z)), 1, Unit.INSTANCE); // level 32
|
|
+ // left
|
|
+ chunkproviderserver.addRegionTicket(TicketType.START, new ChunkPos(spawn.offset(-radiusInBlocks, 0, z)), 1, Unit.INSTANCE); // level 32
|
|
+ }
|
|
+ }
|
|
+ public void removeTicketsForSpawn(int radiusInBlocks, BlockPos spawn) {
|
|
+ // In order to respect vanilla behavior, which is ensuring everything but the spawn border can tick, we added tickets
|
|
+ // with level 31 for the non-border spawn chunks
|
|
+ ServerChunkCache chunkproviderserver = this.getChunkSource();
|
|
+ int tickRadius = radiusInBlocks - 16;
|
|
+
|
|
+ // remove ticking chunks
|
|
+ for (int x = -tickRadius; x <= tickRadius; x += 16) {
|
|
+ for (int z = -tickRadius; z <= tickRadius; z += 16) {
|
|
+ // radius of 2 will have the current chunk be level 31
|
|
+ chunkproviderserver.removeRegionTicket(TicketType.START, new ChunkPos(spawn.offset(x, 0, z)), 2, Unit.INSTANCE);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // remove border chunks
|
|
+
|
|
+ // remove border along x axis (including corner chunks)
|
|
+ for (int x = -radiusInBlocks; x <= radiusInBlocks; x += 16) {
|
|
+ // top
|
|
+ chunkproviderserver.removeRegionTicket(TicketType.START, new ChunkPos(spawn.offset(x, 0, radiusInBlocks)), 1, Unit.INSTANCE); // level 32
|
|
+ // bottom
|
|
+ chunkproviderserver.removeRegionTicket(TicketType.START, new ChunkPos(spawn.offset(x, 0, -radiusInBlocks)), 1, Unit.INSTANCE); // level 32
|
|
+ }
|
|
+
|
|
+ // remove border along z axis (excluding corner chunks)
|
|
+ for (int z = -radiusInBlocks + 16; z < radiusInBlocks; z += 16) {
|
|
+ // right
|
|
+ chunkproviderserver.removeRegionTicket(TicketType.START, new ChunkPos(spawn.offset(radiusInBlocks, 0, z)), 1, Unit.INSTANCE); // level 32
|
|
+ // left
|
|
+ chunkproviderserver.removeRegionTicket(TicketType.START, new ChunkPos(spawn.offset(-radiusInBlocks, 0, z)), 1, Unit.INSTANCE); // level 32
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public void setDefaultSpawnPos(BlockPos pos, float angle) {
|
|
- ChunkPos chunkcoordintpair = new ChunkPos(new BlockPos(this.levelData.getXSpawn(), 0, this.levelData.getZSpawn()));
|
|
+ // Paper - configurable spawn radius
|
|
+ BlockPos prevSpawn = this.getSharedSpawnPos();
|
|
+ //ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(new BlockPosition(this.worldData.a(), 0, this.worldData.c()));
|
|
|
|
this.levelData.setSpawn(pos, angle);
|
|
- this.getChunkSource().removeRegionTicket(TicketType.START, chunkcoordintpair, 11, Unit.INSTANCE);
|
|
- this.getChunkSource().addRegionTicket(TicketType.START, new ChunkPos(pos), 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().spawn.keepSpawnLoadedRange * 16, prevSpawn);
|
|
+ this.addTicketsForSpawn(this.paperConfig().spawn.keepSpawnLoadedRange * 16, pos);
|
|
+ }
|
|
this.getServer().getPlayerList().broadcastAll(new ClientboundSetDefaultSpawnPositionPacket(pos, angle));
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/progress/ChunkProgressListener.java b/src/main/java/net/minecraft/server/level/progress/ChunkProgressListener.java
|
|
index 1b565b2809c2d367e21971c5154f35c9763995e6..b0f899835ded29aff108d1674bf4a1a6c89693db 100644
|
|
--- a/src/main/java/net/minecraft/server/level/progress/ChunkProgressListener.java
|
|
+++ b/src/main/java/net/minecraft/server/level/progress/ChunkProgressListener.java
|
|
@@ -12,4 +12,6 @@ public interface ChunkProgressListener {
|
|
void start();
|
|
|
|
void stop();
|
|
+
|
|
+ void setChunkRadius(int radius); // Paper - allow changing chunk radius
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/level/progress/LoggerChunkProgressListener.java b/src/main/java/net/minecraft/server/level/progress/LoggerChunkProgressListener.java
|
|
index 4d2348df25410a0b5364eec066880326d6667dad..286aad3205ef8a9e21a47ef07893844fe857556a 100644
|
|
--- a/src/main/java/net/minecraft/server/level/progress/LoggerChunkProgressListener.java
|
|
+++ b/src/main/java/net/minecraft/server/level/progress/LoggerChunkProgressListener.java
|
|
@@ -11,12 +11,19 @@ import org.slf4j.Logger;
|
|
|
|
public class LoggerChunkProgressListener implements ChunkProgressListener {
|
|
private static final Logger LOGGER = LogUtils.getLogger();
|
|
- private final int maxCount;
|
|
+ private int maxCount;// Paper - remove final
|
|
private int count;
|
|
private long startTime;
|
|
private long nextTickTime = Long.MAX_VALUE;
|
|
|
|
public LoggerChunkProgressListener(int radius) {
|
|
+ // Paper start - Allow changing radius later for configurable spawn patch
|
|
+ this.setChunkRadius(radius); // Move to method
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setChunkRadius(int radius) {
|
|
+ // Paper end
|
|
int i = radius * 2 + 1;
|
|
this.maxCount = i * i;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
index d828b777ae2435579d5f7ea51f920e77a684bb7b..112d6202635d8e9ce101248d69cc7ab5e1feb2cb 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -1356,15 +1356,21 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
|
|
@Override
|
|
public void setKeepSpawnInMemory(boolean keepLoaded) {
|
|
- world.keepSpawnInMemory = keepLoaded;
|
|
+ // Paper start - Configurable spawn radius
|
|
+ if (keepLoaded == world.keepSpawnInMemory) {
|
|
+ // do nothing, nothing has changed
|
|
+ return;
|
|
+ }
|
|
+ this.world.keepSpawnInMemory = keepLoaded;
|
|
// Grab the worlds spawn chunk
|
|
BlockPos chunkcoordinates = this.world.getSharedSpawnPos();
|
|
if (keepLoaded) {
|
|
- this.world.getChunkSource().addRegionTicket(TicketType.START, new ChunkPos(chunkcoordinates), 11, Unit.INSTANCE);
|
|
+ this.world.addTicketsForSpawn(this.world.paperConfig().spawn.keepSpawnLoadedRange * 16, chunkcoordinates);
|
|
} else {
|
|
- // TODO: doesn't work well if spawn changed....
|
|
- this.world.getChunkSource().removeRegionTicket(TicketType.START, new ChunkPos(chunkcoordinates), 11, Unit.INSTANCE);
|
|
+ // TODO: doesn't work well if spawn changed.... // Paper - resolved
|
|
+ this.world.removeTicketsForSpawn(this.world.paperConfig().spawn.keepSpawnLoadedRange * 16, chunkcoordinates);
|
|
}
|
|
+ // Paper end
|
|
}
|
|
|
|
@Override
|