mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-23 15:47:44 +01:00
fb2c24b36d
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: 05ae036c PR-746: Add option to use cached map color palette 57849c1b PR-759: Add preview chat option in ServerListPingEvent 0169e65d PR-758: Add missing server properties methods from 1.19 CraftBukkit Changes: 622dbe6c2 SPIGOT-7068: SKULK and SKULK_VEIN BlockSpreadEvents Still do not reference the correct source (SKULK_CATALYST) 6c61b73f3 PR-1052: Add option to use cached map color palette c882f38ea SPIGOT-7066: Fix custom END worlds not generating DragonBattle 6866aab59 SPIGOT-2420: Can't set exp drops for EnderDragon death 9dcd46530 PR-1067: Add preview chat option in ServerListPingEvent 36c2681af PR-1066: Add missing server properties methods from 1.19 031eaadd0 Increase outdated build delay 8fda4b12f SPIGOT-7060: SCULK and SCULK_VEIN BlockSpreadEvents do not reference the correct source
121 lines
7 KiB
Diff
121 lines
7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Tue, 9 Jun 2020 03:33:03 -0400
|
|
Subject: [PATCH] Add Plugin Tickets to API Chunk Methods
|
|
|
|
Like previous versions, plugins loading chunks kept them loaded until
|
|
they garbage collected to avoid constant spamming of chunk loads
|
|
|
|
This adds tickets to a few more places so that they can be unloaded.
|
|
|
|
Additionally, this drops their ticket level to BORDER so they wont be ticking
|
|
so they will just sit inactive instead.
|
|
|
|
Using .loadChunk to keep a chunk ticking was a horrible idea for upstream
|
|
when we have TWO methods that are able to do that already in the API.
|
|
|
|
Also reduce their collection count down to a maximum of 1 second. Barely
|
|
anyone knows what chunk-gc is in bukkit.yml as its less relevant now, and
|
|
since this wasn't spigot behavior, this is safe to mostly ignore (unless someone
|
|
wants it to collect even faster, they can restore that setting back to 1 instead of 20+)
|
|
|
|
Not adding it to .getType() though to keep behavior consistent with vanilla for performance reasons.
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
index 97f80d43c7f88c9cae6bf2beb9ceb59743bcae60..0efc62fce74e545ed87fa96c25f1178945c87ea5 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -356,7 +356,7 @@ public final class CraftServer implements Server {
|
|
this.overrideSpawnLimits();
|
|
console.autosavePeriod = this.configuration.getInt("ticks-per.autosave");
|
|
this.warningState = WarningState.value(this.configuration.getString("settings.deprecated-verbose"));
|
|
- TicketType.PLUGIN.timeout = this.configuration.getInt("chunk-gc.period-in-ticks");
|
|
+ TicketType.PLUGIN.timeout = Math.min(20, this.configuration.getInt("chunk-gc.period-in-ticks")); // Paper - cap plugin loads to 1 second
|
|
this.minimumAPI = this.configuration.getString("settings.minimum-api");
|
|
this.loadIcon();
|
|
|
|
@@ -927,7 +927,7 @@ public final class CraftServer implements Server {
|
|
this.console.setMotd(config.motd);
|
|
this.overrideSpawnLimits();
|
|
this.warningState = WarningState.value(this.configuration.getString("settings.deprecated-verbose"));
|
|
- TicketType.PLUGIN.timeout = this.configuration.getInt("chunk-gc.period-in-ticks");
|
|
+ TicketType.PLUGIN.timeout = Math.min(20, configuration.getInt("chunk-gc.period-in-ticks")); // Paper - cap plugin loads to 1 second
|
|
this.minimumAPI = this.configuration.getString("settings.minimum-api");
|
|
this.printSaveWarning = false;
|
|
console.autosavePeriod = this.configuration.getInt("ticks-per.autosave");
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
index 86e512629b5ee0133b1c0b9e3d8ec2d4023661f0..914d0bdd82455f938d08d78c75aabead729bb785 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -277,8 +277,21 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
|
|
@Override
|
|
public Chunk getChunkAt(int x, int z) {
|
|
- return this.world.getChunkSource().getChunk(x, z, true).bukkitChunk;
|
|
+ // Paper start - add ticket to hold chunk for a little while longer if plugin accesses it
|
|
+ net.minecraft.world.level.chunk.LevelChunk chunk = world.getChunkSource().getChunkAtIfLoadedImmediately(x, z);
|
|
+ if (chunk == null) {
|
|
+ addTicket(x, z);
|
|
+ chunk = this.world.getChunkSource().getChunk(x, z, true);
|
|
+ }
|
|
+ return chunk.bukkitChunk;
|
|
+ // Paper end
|
|
+ }
|
|
+
|
|
+ // Paper start
|
|
+ private void addTicket(int x, int z) {
|
|
+ net.minecraft.server.MCUtil.MAIN_EXECUTOR.execute(() -> world.getChunkSource().addRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 0, Unit.INSTANCE)); // Paper
|
|
}
|
|
+ // Paper end
|
|
|
|
@Override
|
|
public Chunk getChunkAt(Block block) {
|
|
@@ -345,7 +358,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
public boolean unloadChunkRequest(int x, int z) {
|
|
org.spigotmc.AsyncCatcher.catchOp("chunk unload"); // Spigot
|
|
if (this.isChunkLoaded(x, z)) {
|
|
- this.world.getChunkSource().removeRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 1, Unit.INSTANCE);
|
|
+ this.world.getChunkSource().removeRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 0, Unit.INSTANCE); // Paper
|
|
}
|
|
|
|
return true;
|
|
@@ -428,9 +441,12 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
org.spigotmc.AsyncCatcher.catchOp("chunk load"); // Spigot
|
|
// Paper start - Optimize this method
|
|
ChunkPos chunkPos = new ChunkPos(x, z);
|
|
+ ChunkAccess immediate = world.getChunkSource().getChunkAtIfLoadedImmediately(x, z); // Paper
|
|
+ if (immediate != null) return true; // Paper
|
|
|
|
if (!generate) {
|
|
- ChunkAccess immediate = world.getChunkSource().getChunkAtImmediately(x, z);
|
|
+
|
|
+ //IChunkAccess immediate = world.getChunkProvider().getChunkAtImmediately(x, z); // Paper
|
|
if (immediate == null) {
|
|
immediate = world.getChunkSource().chunkMap.getUnloadingChunk(x, z);
|
|
}
|
|
@@ -438,7 +454,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
if (!(immediate instanceof ImposterProtoChunk) && !(immediate instanceof net.minecraft.world.level.chunk.LevelChunk)) {
|
|
return false; // not full status
|
|
}
|
|
- world.getChunkSource().addRegionTicket(TicketType.PLUGIN, chunkPos, 1, Unit.INSTANCE);
|
|
+ world.getChunkSource().addRegionTicket(TicketType.PLUGIN, chunkPos, 0, Unit.INSTANCE); // Paper
|
|
world.getChunk(x, z); // make sure we're at ticket level 32 or lower
|
|
return true;
|
|
}
|
|
@@ -464,7 +480,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
// we do this so we do not re-read the chunk data on disk
|
|
}
|
|
|
|
- world.getChunkSource().addRegionTicket(TicketType.PLUGIN, chunkPos, 1, Unit.INSTANCE);
|
|
+ world.getChunkSource().addRegionTicket(TicketType.PLUGIN, chunkPos, 0, Unit.INSTANCE); // Paper
|
|
world.getChunkSource().getChunk(x, z, ChunkStatus.FULL, true);
|
|
return true;
|
|
// Paper end
|
|
@@ -1984,6 +2000,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
|
|
return this.world.getChunkSource().getChunkAtAsynchronously(x, z, gen, urgent).thenComposeAsync((either) -> {
|
|
net.minecraft.world.level.chunk.LevelChunk chunk = (net.minecraft.world.level.chunk.LevelChunk) either.left().orElse(null);
|
|
+ if (chunk != null) addTicket(x, z); // Paper
|
|
return java.util.concurrent.CompletableFuture.completedFuture(chunk == null ? null : chunk.getBukkitChunk());
|
|
}, net.minecraft.server.MinecraftServer.getServer());
|
|
}
|