228 Zeilen
13 KiB
Diff
228 Zeilen
13 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
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 <jake.m.potrebic@gmail.com>
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index a241e4dfd8ca37365a4fa64f66cc57059492cef1..84ca8fbab4a7ef905a312d4bdee6182bb5ffeafd 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -1578,6 +1578,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 9aa38a42d41a5092186c4eb6188752b5729796e9..01bf2ae30885aefa7cd1ba3c79be4860bc355640 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -1121,7 +1121,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 e6adac1897902dfefe18bd67f903b4a524efdf59..13d7ecd67a94b4651624df3c24d0ae6f4753a32f 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -1781,6 +1781,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();
|
|
@@ -1792,6 +1793,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();
|
|
@@ -1824,6 +1826,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);
|
|
@@ -1835,6 +1838,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(ResourceLocation.parse(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 d1e578ef86f730a3294fdc6330e3ad25572cd6b1..77330142a8c771befd473784ca90608ccd8d4c0d 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
@@ -524,6 +524,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 + "!" );
|
|
}
|
|
}
|