aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0611-Improve-and-expand-AsyncCatcher.patch
diff options
context:
space:
mode:
authorJake Potrebic <[email protected]>2024-05-29 13:58:57 -0700
committerGitHub <[email protected]>2024-05-29 22:58:57 +0200
commita31dc90741ed9c121a13a3c124c9ebf5bafd0da7 (patch)
tree81963bd94fe7772ee08bd21710230de21b6b25da /patches/server/0611-Improve-and-expand-AsyncCatcher.patch
parented85aac53cfd93d29fa24e6071dbdddd0e49624b (diff)
downloadPaper-a31dc90741ed9c121a13a3c124c9ebf5bafd0da7.tar.gz
Paper-a31dc90741ed9c121a13a3c124c9ebf5bafd0da7.zip
Several fixes and new api for experience merging/stacking (#9242)
Diffstat (limited to 'patches/server/0611-Improve-and-expand-AsyncCatcher.patch')
-rw-r--r--patches/server/0611-Improve-and-expand-AsyncCatcher.patch227
1 files changed, 227 insertions, 0 deletions
diff --git a/patches/server/0611-Improve-and-expand-AsyncCatcher.patch b/patches/server/0611-Improve-and-expand-AsyncCatcher.patch
new file mode 100644
index 0000000000..3fa3ba5e71
--- /dev/null
+++ b/patches/server/0611-Improve-and-expand-AsyncCatcher.patch
@@ -0,0 +1,227 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Wed, 25 Aug 2021 20:17:12 -0700
+Subject: [PATCH] Improve and expand AsyncCatcher
+
+Log when the async catcher is tripped
+ The chunk system can swallow the exception given it's all
+ built with completablefuture, so ensure it is at least printed.
+
+Add/move several async catchers
+
+Async catch modifications to critical entity state
+ These used to be here from Spigot, but were dropped with 1.17.
+ Now in 1.17, this state is _even more_ critical than it was before,
+ so these must exist to catch stupid plugins.
+
+Co-authored-by: Jake Potrebic <[email protected]>
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 40d2c7bfc8ba8b8b366f23e53cf37f331e19ccf7..795e65c7c98d50ff67953ccb1ff68dac0088116e 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -1565,6 +1565,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ }
+
+ public void internalTeleport(double d0, double d1, double d2, float f, float f1, Set<RelativeMovement> set) { // Paper
++ org.spigotmc.AsyncCatcher.catchOp("teleport"); // Paper
+ // Paper start - Prevent teleporting dead entities
+ if (player.isRemoved()) {
+ LOGGER.info("Attempt to teleport removed player {} restricted", player.getScoreboardName());
+diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index 5dc4deca24f966bd4cb0b7f296f74487964e4c95..a1edb9465872f762e1bc3daf1a3121bc3654e847 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -1147,7 +1147,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ }
+
+ public boolean addEffect(MobEffectInstance mobeffect, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause) {
+- org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot
++ // org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot // Paper - move to API
+ if (this.isTickingEffects) {
+ this.effectsToProcess.add(new ProcessableEffect(mobeffect, cause));
+ return true;
+diff --git a/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java b/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java
+index 219062cff8a05c765b092f1525043d9d9a1153ae..1c6e8438219f355274db4e0fa849cdd90648fbb4 100644
+--- a/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java
++++ b/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java
+@@ -78,6 +78,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private boolean addEntityUuid(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity add by UUID"); // Paper
+ if (!this.knownUuids.add(entity.getUUID())) {
+ PersistentEntitySectionManager.LOGGER.warn("UUID of added entity already exists: {}", entity);
+ return false;
+@@ -91,6 +92,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private boolean addEntity(T entity, boolean existing) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity add"); // Paper
+ // Paper start - chunk system hooks
+ if (existing) {
+ // I don't want to know why this is a generic type.
+@@ -146,19 +148,23 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ void startTicking(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity start ticking"); // Paper
+ this.callbacks.onTickingStart(entity);
+ }
+
+ void stopTicking(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity stop ticking"); // Paper
+ this.callbacks.onTickingEnd(entity);
+ }
+
+ void startTracking(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity start tracking"); // Paper
+ this.visibleEntityStorage.add(entity);
+ this.callbacks.onTrackingStart(entity);
+ }
+
+ void stopTracking(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity stop tracking"); // Paper
+ this.callbacks.onTrackingEnd(entity);
+ this.visibleEntityStorage.remove(entity);
+ }
+@@ -170,6 +176,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void updateChunkStatus(ChunkPos chunkPos, Visibility trackingStatus) {
++ org.spigotmc.AsyncCatcher.catchOp("Update chunk status"); // Paper
+ long i = chunkPos.toLong();
+
+ if (trackingStatus == Visibility.HIDDEN) {
+@@ -214,6 +221,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void ensureChunkQueuedForLoad(long chunkPos) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity chunk save"); // Paper
+ PersistentEntitySectionManager.ChunkLoadStatus persistententitysectionmanager_b = (PersistentEntitySectionManager.ChunkLoadStatus) this.chunkLoadStatuses.get(chunkPos);
+
+ if (persistententitysectionmanager_b == PersistentEntitySectionManager.ChunkLoadStatus.FRESH) {
+@@ -258,6 +266,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private void requestChunkLoad(long chunkPos) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity chunk load request"); // Paper
+ this.chunkLoadStatuses.put(chunkPos, PersistentEntitySectionManager.ChunkLoadStatus.PENDING);
+ ChunkPos chunkcoordintpair = new ChunkPos(chunkPos);
+ CompletableFuture completablefuture = this.permanentStorage.loadEntities(chunkcoordintpair);
+@@ -271,6 +280,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private boolean processChunkUnload(long chunkPos) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity chunk unload process"); // Paper
+ boolean flag = this.storeChunkSections(chunkPos, (entityaccess) -> {
+ entityaccess.getPassengersAndSelf().forEach(this::unloadEntity);
+ }, true); // CraftBukkit - add boolean for event call
+@@ -295,6 +305,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private void processPendingLoads() {
++ org.spigotmc.AsyncCatcher.catchOp("Entity chunk process pending loads"); // Paper
+ ChunkEntities<T> chunkentities; // CraftBukkit - decompile error
+
+ while ((chunkentities = (ChunkEntities) this.loadingInbox.poll()) != null) {
+@@ -311,6 +322,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void tick() {
++ org.spigotmc.AsyncCatcher.catchOp("Entity manager tick"); // Paper
+ this.processPendingLoads();
+ this.processUnloads();
+ }
+@@ -331,6 +343,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void autoSave() {
++ org.spigotmc.AsyncCatcher.catchOp("Entity manager autosave"); // Paper
+ this.getAllChunksToSave().forEach((java.util.function.LongConsumer) (i) -> { // CraftBukkit - decompile error
+ boolean flag = this.chunkVisibility.get(i) == Visibility.HIDDEN;
+
+@@ -345,6 +358,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void saveAll() {
++ org.spigotmc.AsyncCatcher.catchOp("Entity manager save"); // Paper
+ LongSet longset = this.getAllChunksToSave();
+
+ while (!longset.isEmpty()) {
+@@ -452,6 +466,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ long i = SectionPos.asLong(blockposition);
+
+ if (i != this.currentSectionKey) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity move"); // Paper
+ Visibility visibility = this.currentSection.getStatus();
+
+ if (!this.currentSection.remove(this.entity)) {
+@@ -506,6 +521,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+
+ @Override
+ public void onRemove(Entity.RemovalReason reason) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity remove"); // Paper
+ if (!this.currentSection.remove(this.entity)) {
+ PersistentEntitySectionManager.LOGGER.warn("Entity {} wasn't found in section {} (destroying due to {})", new Object[]{this.entity, SectionPos.of(this.currentSectionKey), reason});
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+index 5f6cec79745aa8e5ae3aa8139c93bbdd1c36c6d5..1bf9fbc8f39ec4b0dd1369cace6bbd347c81541a 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+@@ -1756,6 +1756,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ @Override
+ public void playSound(Location loc, Sound sound, org.bukkit.SoundCategory category, float volume, float pitch, long seed) {
++ org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
+ if (loc == null || sound == null || category == null) return;
+
+ double x = loc.getX();
+@@ -1767,6 +1768,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ @Override
+ public void playSound(Location loc, String sound, org.bukkit.SoundCategory category, float volume, float pitch, long seed) {
++ org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
+ if (loc == null || sound == null || category == null) return;
+
+ double x = loc.getX();
+@@ -1799,6 +1801,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ @Override
+ public void playSound(Entity entity, Sound sound, org.bukkit.SoundCategory category, float volume, float pitch, long seed) {
++ org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
+ if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return;
+
+ ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(CraftSound.bukkitToMinecraftHolder(sound), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed);
+@@ -1810,6 +1813,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ @Override
+ public void playSound(Entity entity, String sound, org.bukkit.SoundCategory category, float volume, float pitch, long seed) {
++ org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
+ if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return;
+
+ ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(Holder.direct(SoundEvent.createVariableRangeEvent(new ResourceLocation(sound))), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed);
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+index f0e9d68381fb75900bcd6976a83fd94028fd2712..a4c6fd2f6066ecc4a36a423cb2980ec60d9c7ec1 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+@@ -516,6 +516,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
+
+ @Override
+ public boolean addPotionEffect(PotionEffect effect, boolean force) {
++ org.spigotmc.AsyncCatcher.catchOp("effect add"); // Paper
+ this.getHandle().addEffect(org.bukkit.craftbukkit.potion.CraftPotionUtil.fromBukkit(effect), EntityPotionEffectEvent.Cause.PLUGIN); // Paper - Don't ignore icon
+ return true;
+ }
+diff --git a/src/main/java/org/spigotmc/AsyncCatcher.java b/src/main/java/org/spigotmc/AsyncCatcher.java
+index 78669fa035b7537ff7e533cf32aaf2995625424f..e8e3cc48cf1c58bd8151d1f28df28781859cd0e3 100644
+--- a/src/main/java/org/spigotmc/AsyncCatcher.java
++++ b/src/main/java/org/spigotmc/AsyncCatcher.java
+@@ -11,6 +11,7 @@ public class AsyncCatcher
+ {
+ if ( (AsyncCatcher.enabled || io.papermc.paper.util.TickThread.STRICT_THREAD_CHECKS) && Thread.currentThread() != MinecraftServer.getServer().serverThread ) // Paper
+ {
++ MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable()); // Paper
+ throw new IllegalStateException( "Asynchronous " + reason + "!" );
+ }
+ }