2019-08-13 20:38:28 +10:00
|
|
|
From c9bc57620066ba8433fbca3aaa20bc4afbef54cf Mon Sep 17 00:00:00 2001
|
2014-03-25 16:11:22 +11:00
|
|
|
From: md_5 <git@md-5.net>
|
|
|
|
Date: Tue, 25 Mar 2014 16:10:01 +1100
|
2013-03-23 18:05:22 +11:00
|
|
|
Subject: [PATCH] Async Operation Catching
|
2013-03-07 20:12:53 +11:00
|
|
|
|
2013-03-23 18:05:22 +11:00
|
|
|
Catch and throw an exception when a potentially unsafe operation occurs on a thread other than the main server thread.
|
2013-03-07 20:12:53 +11:00
|
|
|
|
2013-08-03 19:09:09 +10:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index f13a0be0..abba434d 100644
|
2013-08-03 19:09:09 +10:00
|
|
|
--- a/src/main/java/net/minecraft/server/Block.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/Block.java
|
2019-05-28 06:30:00 +10:00
|
|
|
@@ -376,10 +376,13 @@ public class Block implements IMaterial {
|
2013-08-03 19:09:09 +10:00
|
|
|
}
|
|
|
|
|
2018-07-15 10:00:00 +10:00
|
|
|
@Deprecated
|
2019-04-23 12:00:00 +10:00
|
|
|
- public void onPlace(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag) {}
|
|
|
|
+ public void onPlace(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("block onPlace"); // Spigot
|
2013-08-03 19:09:09 +10:00
|
|
|
+ }
|
|
|
|
|
2018-07-15 10:00:00 +10:00
|
|
|
@Deprecated
|
2019-04-23 12:00:00 +10:00
|
|
|
public void remove(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData iblockdata1, boolean flag) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("block remove"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
if (this.isTileEntity() && iblockdata.getBlock() != iblockdata1.getBlock()) {
|
|
|
|
world.removeTileEntity(blockposition);
|
|
|
|
}
|
2019-01-07 10:30:38 +11:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/CraftingManager.java b/src/main/java/net/minecraft/server/CraftingManager.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index 29a79be7..d0b4bf8b 100644
|
2019-01-07 10:30:38 +11:00
|
|
|
--- a/src/main/java/net/minecraft/server/CraftingManager.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/CraftingManager.java
|
2019-06-21 20:00:00 +10:00
|
|
|
@@ -65,6 +65,7 @@ public class CraftingManager extends ResourceDataJson {
|
2019-01-07 10:30:38 +11:00
|
|
|
|
2019-06-21 20:00:00 +10:00
|
|
|
// CraftBukkit start
|
2019-04-23 12:00:00 +10:00
|
|
|
public void addRecipe(IRecipe<?> irecipe) {
|
2019-01-07 10:30:38 +11:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("Recipe Add"); // Spigot
|
2019-06-21 20:00:00 +10:00
|
|
|
Object2ObjectLinkedOpenHashMap<MinecraftKey, IRecipe<?>> map = this.recipes.get(irecipe.g()); // CraftBukkit
|
2019-04-23 12:00:00 +10:00
|
|
|
|
|
|
|
if (map.containsKey(irecipe.getKey())) {
|
2015-01-12 11:38:47 +11:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index a6bf7239..3bc4dd9d 100644
|
2015-01-12 11:38:47 +11:00
|
|
|
--- a/src/main/java/net/minecraft/server/EntityLiving.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
|
2019-05-28 06:30:00 +10:00
|
|
|
@@ -821,6 +821,7 @@ public abstract class EntityLiving extends Entity {
|
2015-01-12 11:38:47 +11:00
|
|
|
}
|
|
|
|
|
2018-07-20 16:13:18 +10:00
|
|
|
public boolean addEffect(MobEffect mobeffect, EntityPotionEffectEvent.Cause cause) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot
|
2015-02-12 14:25:18 +00:00
|
|
|
if (isTickingEffects) {
|
2018-07-20 16:13:18 +10:00
|
|
|
effectsToProcess.add(new ProcessableEffect(mobeffect, cause));
|
|
|
|
return true;
|
2019-04-23 12:00:00 +10:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index 2765f37d..6cc87c42 100644
|
2019-04-23 12:00:00 +10:00
|
|
|
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
2019-07-20 09:00:00 +10:00
|
|
|
@@ -954,6 +954,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
2013-03-23 18:27:02 +11:00
|
|
|
}
|
|
|
|
|
2019-04-23 12:00:00 +10:00
|
|
|
protected void addEntity(Entity entity) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("entity track"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
if (!(entity instanceof EntityComplexPart)) {
|
|
|
|
if (!(entity instanceof EntityLightning)) {
|
|
|
|
EntityTypes<?> entitytypes = entity.getEntityType();
|
2019-07-20 09:00:00 +10:00
|
|
|
@@ -988,6 +989,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
2013-03-23 18:27:02 +11:00
|
|
|
}
|
|
|
|
|
2019-04-23 12:00:00 +10:00
|
|
|
protected void removeEntity(Entity entity) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("entity untrack"); // Spigot
|
2013-03-23 18:27:02 +11:00
|
|
|
if (entity instanceof EntityPlayer) {
|
|
|
|
EntityPlayer entityplayer = (EntityPlayer) entity;
|
|
|
|
|
2019-07-20 09:00:00 +10:00
|
|
|
@@ -1175,6 +1177,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
2019-04-23 12:00:00 +10:00
|
|
|
}
|
2013-03-23 18:27:02 +11:00
|
|
|
|
2019-04-23 12:00:00 +10:00
|
|
|
public void clear(EntityPlayer entityplayer) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("player tracker clear"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
if (this.trackedPlayers.remove(entityplayer)) {
|
|
|
|
this.trackerEntry.a(entityplayer);
|
|
|
|
}
|
2019-07-20 09:00:00 +10:00
|
|
|
@@ -1182,6 +1185,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
2019-04-23 12:00:00 +10:00
|
|
|
}
|
2013-03-23 18:27:02 +11:00
|
|
|
|
2019-04-23 12:00:00 +10:00
|
|
|
public void updatePlayer(EntityPlayer entityplayer) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
if (entityplayer != this.tracker) {
|
2019-07-20 09:00:00 +10:00
|
|
|
Vec3D vec3d = (new Vec3D(entityplayer.locX, entityplayer.locY, entityplayer.locZ)).d(this.tracker.getPositionVector()); // MC-155077, SPIGOT-5113
|
2019-05-14 10:00:00 +10:00
|
|
|
int i = Math.min(this.trackingDistance, (PlayerChunkMap.this.viewDistance - 1) * 16);
|
2019-04-23 12:00:00 +10:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index 232b0789..a749179f 100644
|
2019-04-23 12:00:00 +10:00
|
|
|
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
2019-07-20 09:00:00 +10:00
|
|
|
@@ -902,6 +902,7 @@ public class WorldServer extends World {
|
2019-04-23 12:00:00 +10:00
|
|
|
|
|
|
|
// CraftBukkit start
|
|
|
|
private boolean addEntity0(Entity entity, CreatureSpawnEvent.SpawnReason spawnReason) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("entity add"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
if (entity.dead) {
|
2019-04-25 12:00:00 +10:00
|
|
|
// WorldServer.LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getName(entity.getEntityType())); // CraftBukkit
|
2018-12-17 12:35:20 +11:00
|
|
|
return false;
|
2019-07-23 09:48:32 +10:00
|
|
|
@@ -970,6 +971,7 @@ public class WorldServer extends World {
|
2013-03-23 18:27:02 +11:00
|
|
|
}
|
|
|
|
|
2019-07-23 09:48:32 +10:00
|
|
|
public void unregisterEntity(Entity entity) {
|
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("entity unregister"); // Spigot
|
|
|
|
if (entity instanceof EntityEnderDragon) {
|
|
|
|
EntityComplexPart[] aentitycomplexpart = ((EntityEnderDragon) entity).dT();
|
|
|
|
int i = aentitycomplexpart.length;
|
|
|
|
@@ -998,6 +1000,7 @@ public class WorldServer extends World {
|
|
|
|
}
|
|
|
|
|
|
|
|
private void registerEntity(Entity entity) {
|
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
if (this.tickingEntities) {
|
2019-07-23 09:48:32 +10:00
|
|
|
this.entitiesToAdd.add(entity);
|
2019-04-23 12:00:00 +10:00
|
|
|
} else {
|
2018-07-18 12:36:24 +10:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index 580fce0f..fb1127d0 100644
|
2018-07-18 12:36:24 +10:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
2019-07-03 10:30:37 +10:00
|
|
|
@@ -685,6 +685,7 @@ public final class CraftServer implements Server {
|
2018-07-18 12:36:24 +10:00
|
|
|
public boolean dispatchCommand(CommandSender sender, String commandLine) {
|
|
|
|
Validate.notNull(sender, "Sender cannot be null");
|
|
|
|
Validate.notNull(commandLine, "CommandLine cannot be null");
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("command dispatch"); // Spigot
|
2018-07-18 12:36:24 +10:00
|
|
|
|
|
|
|
if (commandMap.dispatch(sender, commandLine)) {
|
|
|
|
return true;
|
2013-03-07 20:12:53 +11:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index 254cc6d5..b1055e1f 100644
|
2013-03-07 20:12:53 +11:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
2019-07-10 10:11:27 +10:00
|
|
|
@@ -376,6 +376,7 @@ public class CraftWorld implements World {
|
2013-03-07 20:12:53 +11:00
|
|
|
|
2019-04-28 11:41:06 +10:00
|
|
|
@Override
|
2019-04-23 12:00:00 +10:00
|
|
|
public boolean unloadChunkRequest(int x, int z) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("chunk unload"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
net.minecraft.server.IChunkAccess chunk = world.getChunkProvider().getChunkAt(x, z, ChunkStatus.FULL, false);
|
|
|
|
if (chunk != null) {
|
|
|
|
world.getChunkProvider().removeTicket(TicketType.PLUGIN, chunk.getPos(), 1, Unit.INSTANCE);
|
2019-07-10 10:11:27 +10:00
|
|
|
@@ -385,6 +386,7 @@ public class CraftWorld implements World {
|
2013-03-07 20:12:53 +11:00
|
|
|
}
|
|
|
|
|
2019-04-23 12:00:00 +10:00
|
|
|
private boolean unloadChunk0(int x, int z, boolean save) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("chunk unload"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
net.minecraft.server.Chunk chunk = (net.minecraft.server.Chunk) world.getChunkProvider().getChunkAt(x, z, ChunkStatus.FULL, false);
|
|
|
|
if (chunk == null) {
|
|
|
|
return true;
|
2019-07-10 10:11:27 +10:00
|
|
|
@@ -399,6 +401,7 @@ public class CraftWorld implements World {
|
2018-11-03 20:28:44 +11:00
|
|
|
|
2019-04-28 11:41:06 +10:00
|
|
|
@Override
|
2018-11-03 20:28:44 +11:00
|
|
|
public boolean regenerateChunk(int x, int z) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("chunk regenerate"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
throw new UnsupportedOperationException("Not supported in this Minecraft version! Unless you can fix it, this is not a bug :)");
|
|
|
|
/*
|
2018-11-03 20:28:44 +11:00
|
|
|
if (!unloadChunk0(x, z, false)) {
|
2019-07-10 10:11:27 +10:00
|
|
|
@@ -450,6 +453,7 @@ public class CraftWorld implements World {
|
2013-03-07 20:12:53 +11:00
|
|
|
|
2019-04-28 11:41:06 +10:00
|
|
|
@Override
|
2013-03-07 20:12:53 +11:00
|
|
|
public boolean loadChunk(int x, int z, boolean generate) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("chunk load"); // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
IChunkAccess chunk = world.getChunkProvider().getChunkAt(x, z, generate ? ChunkStatus.FULL : ChunkStatus.EMPTY, true);
|
|
|
|
|
|
|
|
// If generate = false, but the chunk already exists, we will get this back.
|
2019-08-13 20:38:28 +10:00
|
|
|
@@ -1158,6 +1162,7 @@ public class CraftWorld implements World {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void save() {
|
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("world save"); // Spigot
|
|
|
|
this.server.checkSaveState();
|
|
|
|
try {
|
|
|
|
boolean oldSave = world.savingDisabled;
|
2013-03-23 18:05:22 +11:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index ed4e0b28..26fd6984 100644
|
2013-03-23 18:05:22 +11:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
2019-06-25 06:49:54 +10:00
|
|
|
@@ -300,6 +300,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
2013-03-23 18:05:22 +11:00
|
|
|
|
2013-12-01 14:40:53 +11:00
|
|
|
@Override
|
2013-03-23 18:05:22 +11:00
|
|
|
public void kickPlayer(String message) {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("player kick"); // Spigot
|
2013-03-23 18:05:22 +11:00
|
|
|
if (getHandle().playerConnection == null) return;
|
|
|
|
|
|
|
|
getHandle().playerConnection.disconnect(message == null ? "" : message);
|
2014-01-25 15:23:21 +11:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index fd9949e1..ca2be306 100644
|
2014-01-25 15:23:21 +11:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
|
2019-04-28 11:41:06 +10:00
|
|
|
@@ -41,6 +41,7 @@ public final class CraftScoreboardManager implements ScoreboardManager {
|
2014-01-25 15:23:21 +11:00
|
|
|
|
2019-04-28 11:41:06 +10:00
|
|
|
@Override
|
2014-01-25 15:23:21 +11:00
|
|
|
public CraftScoreboard getNewScoreboard() {
|
2019-07-23 09:48:32 +10:00
|
|
|
+ org.spigotmc.AsyncCatcher.catchOp("scoreboard creation"); // Spigot
|
2014-01-25 15:23:21 +11:00
|
|
|
CraftScoreboard scoreboard = new CraftScoreboard(new ScoreboardServer(server));
|
|
|
|
scoreboards.add(scoreboard);
|
|
|
|
return scoreboard;
|
2017-06-19 19:56:13 +10:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
|
2019-08-13 20:38:28 +10:00
|
|
|
index 2e057fd4..ddef523e 100644
|
2017-06-19 19:56:13 +10:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
|
2019-04-23 12:00:00 +10:00
|
|
|
@@ -12,6 +12,7 @@ public class ServerShutdownThread extends Thread {
|
2017-06-19 19:56:13 +10:00
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
try {
|
|
|
|
+ org.spigotmc.AsyncCatcher.enabled = false; // Spigot
|
2019-04-23 12:00:00 +10:00
|
|
|
server.close();
|
|
|
|
} finally {
|
|
|
|
try {
|
2014-03-25 16:11:22 +11:00
|
|
|
diff --git a/src/main/java/org/spigotmc/AsyncCatcher.java b/src/main/java/org/spigotmc/AsyncCatcher.java
|
|
|
|
new file mode 100644
|
2019-08-13 20:38:28 +10:00
|
|
|
index 00000000..aeed7697
|
2014-03-25 16:11:22 +11:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/src/main/java/org/spigotmc/AsyncCatcher.java
|
|
|
|
@@ -0,0 +1,17 @@
|
|
|
|
+package org.spigotmc;
|
|
|
|
+
|
|
|
|
+import net.minecraft.server.MinecraftServer;
|
|
|
|
+
|
|
|
|
+public class AsyncCatcher
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+ public static boolean enabled = true;
|
|
|
|
+
|
|
|
|
+ public static void catchOp(String reason)
|
|
|
|
+ {
|
2019-04-23 12:00:00 +10:00
|
|
|
+ if ( enabled && Thread.currentThread() != MinecraftServer.getServer().serverThread )
|
2014-03-25 16:11:22 +11:00
|
|
|
+ {
|
|
|
|
+ throw new IllegalStateException( "Asynchronous " + reason + "!" );
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
2013-03-07 20:12:53 +11:00
|
|
|
--
|
2019-04-23 09:33:25 +10:00
|
|
|
2.20.1
|
2013-03-07 20:12:53 +11:00
|
|
|
|