mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-29 07:48:53 +01:00
789bc79280
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: c9a46ebf #653: Add World#spawn with randomizeData parameter e49c2e3a Damageable should extend ItemMeta 01ff04f4 SPIGOT-5880, SPIGOT-5567: New ChunkGenerator API ca5b4b1a SPIGOT-6697: Deprecate generateTree with BlockChangeDelegate as it does not handle tiles CraftBukkit Changes: 7c8bbcbe SPIGOT-6716: Preserve the order of stored enchantments of enchanted books. 18027d02 #914: Add World#spawn with randomizeData parameter 3cad0316 SPIGOT-6714: Don't fire PlayerBucketEvent when empty 8c6d60cf Fix server crash with BlockPopulator when entities are at a negative chunk border 4f6bcc84 SPIGOT-5880, SPIGOT-5567: New ChunkGenerator API 78d5b35b SPIGOT-6697: Restore generateTree with BlockChangeDelegate behaviour 15792f0d Rebuild patch c949675e SPIGOT-6713: Cancelling EntityTransformEvent Causes Deceased Slimes To Not Despawn a955f15c Fix issues with new ChunkGenerator API a0a37f41 SPIGOT-6630: Replacing an enchantment on an item creates a conflict error Spigot Changes: b166a49b Rebuild patches 3c1fc60a SPIGOT-6693: Composters only take in one item at custom hopper speeds
121 lines
7.1 KiB
Diff
121 lines
7.1 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 7a0950a22009a0ae606e74da8026a224817d5037..65fcf1300022b66c87b00637775dbed02b2c734e 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -360,7 +360,7 @@ public final class CraftServer implements Server {
|
|
this.ambientSpawn = this.configuration.getInt("spawn-limits.ambient");
|
|
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();
|
|
}
|
|
@@ -845,7 +845,7 @@ public final class CraftServer implements Server {
|
|
this.waterAmbientSpawn = this.configuration.getInt("spawn-limits.water-ambient");
|
|
this.ambientSpawn = this.configuration.getInt("spawn-limits.ambient");
|
|
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 059b901e79cf0e2d152375453d36437a43c4f244..496bb91da1138fb6a4e004da1eab43e588c82592 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -265,8 +265,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) {
|
|
@@ -341,7 +354,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;
|
|
@@ -418,9 +431,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);
|
|
}
|
|
@@ -428,7 +444,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;
|
|
}
|
|
@@ -454,7 +470,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
|
|
@@ -1898,6 +1914,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());
|
|
}
|