diff --git a/Spigot-API-Patches/Add-source-block-to-BlockPhysicsEvent.patch b/Spigot-API-Patches/Add-source-block-to-BlockPhysicsEvent.patch index 03296c531c..bbe8d65b61 100644 --- a/Spigot-API-Patches/Add-source-block-to-BlockPhysicsEvent.patch +++ b/Spigot-API-Patches/Add-source-block-to-BlockPhysicsEvent.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add source block to BlockPhysicsEvent diff --git a/src/main/java/org/bukkit/event/block/BlockPhysicsEvent.java b/src/main/java/org/bukkit/event/block/BlockPhysicsEvent.java -index 01a545b4..d17e05ac 100644 +index 01a545b42..57568cd02 100644 --- a/src/main/java/org/bukkit/event/block/BlockPhysicsEvent.java +++ b/src/main/java/org/bukkit/event/block/BlockPhysicsEvent.java @@ -0,0 +0,0 @@ public class BlockPhysicsEvent extends BlockEvent implements Cancellable { diff --git a/Spigot-API-Patches/Remove-deadlock-risk-in-firing-async-events.patch b/Spigot-API-Patches/Remove-deadlock-risk-in-firing-async-events.patch new file mode 100644 index 0000000000..9b948d78f1 --- /dev/null +++ b/Spigot-API-Patches/Remove-deadlock-risk-in-firing-async-events.patch @@ -0,0 +1,81 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sun, 9 Sep 2018 00:32:05 -0400 +Subject: [PATCH] Remove deadlock risk in firing async events + +The PluginManager incorrectly used synchronization on firing any event +that was marked as synchronous. + +This synchronized did not even protect any concurrency risk as +handlers were already thread safe in terms of mutations during event +dispatch. + +The way it was used, has commonly led to deadlocks on the server, +which results in a hard crash. + +This change removes the synchronize and adds some protection around enable/disable + +diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +index cb2b0b9cb..a7dd902fb 100644 +--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java ++++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + * @param plugin Plugin to check + * @return true if the plugin is enabled, otherwise false + */ +- public boolean isPluginEnabled(Plugin plugin) { ++ public synchronized boolean isPluginEnabled(Plugin plugin) { // Paper - synchronize + if ((plugin != null) && (plugins.contains(plugin))) { + return plugin.isEnabled(); + } else { +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + } + } + +- public void enablePlugin(final Plugin plugin) { ++ public synchronized void enablePlugin(final Plugin plugin) { // Paper - synchronize + if (!plugin.isEnabled()) { + List pluginCommands = PluginCommandYamlParser.parse(plugin); + +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + disablePlugin(plugin, false); + } + +- public void disablePlugin(final Plugin plugin, boolean closeClassloader) { ++ public synchronized void disablePlugin(final Plugin plugin, boolean closeClassloader) { // Paper - synchronize + // Paper end - close Classloader on disable + if (plugin.isEnabled()) { + try { +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + defaultPerms.get(false).clear(); + } + } ++ private void fireEvent(Event event) { callEvent(event); } // Paper - support old method incase plugin uses reflection + + /** + * Calls an event with the given details. +@@ -0,0 +0,0 @@ public final class SimplePluginManager implements PluginManager { + * @param event Event details + */ + public void callEvent(Event event) { +- if (event.isAsynchronous()) { +- if (Thread.holdsLock(this)) { +- throw new IllegalStateException(event.getEventName() + " cannot be triggered asynchronously from inside synchronized code."); +- } +- if (server.isPrimaryThread()) { +- throw new IllegalStateException(event.getEventName() + " cannot be triggered asynchronously from primary server thread."); +- } +- fireEvent(event); +- } else { +- synchronized (this) { +- fireEvent(event); +- } +- } +- } +- +- private void fireEvent(Event event) { ++ // Paper - replace callEvent by merging to below method + HandlerList handlers = event.getHandlers(); + RegisteredListener[] listeners = handlers.getRegisteredListeners(); + +-- \ No newline at end of file diff --git a/Spigot-API-Patches/isChunkGenerated-API.patch b/Spigot-API-Patches/isChunkGenerated-API.patch index ee0a7cc4e4..69bfe8d6ca 100644 --- a/Spigot-API-Patches/isChunkGenerated-API.patch +++ b/Spigot-API-Patches/isChunkGenerated-API.patch @@ -6,7 +6,7 @@ Subject: [PATCH] isChunkGenerated API Resolves #1329 diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java -index 7e1ee875..9457832b 100644 +index 7e1ee875e..9457832bc 100644 --- a/src/main/java/org/bukkit/Location.java +++ b/src/main/java/org/bukkit/Location.java @@ -0,0 +0,0 @@ import org.bukkit.util.NumberConversions; @@ -34,7 +34,7 @@ index 7e1ee875..9457832b 100644 /** * Sets the position of this Location and returns itself diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index a6facc4b..d5058634 100644 +index a6facc4b0..d50586349 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java @@ -0,0 +0,0 @@ public interface World extends PluginMessageRecipient, Metadatable { diff --git a/Spigot-Server-Patches/Add-source-block-to-BlockPhysicsEvent.patch b/Spigot-Server-Patches/Add-source-block-to-BlockPhysicsEvent.patch index 1e5b75e8c9..cfddab860a 100644 --- a/Spigot-Server-Patches/Add-source-block-to-BlockPhysicsEvent.patch +++ b/Spigot-Server-Patches/Add-source-block-to-BlockPhysicsEvent.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add source block to BlockPhysicsEvent diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 04d0fa1d..64d75934 100644 +index 04d0fa1df9..64d75934bc 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess { diff --git a/Spigot-Server-Patches/Anti-Xray.patch b/Spigot-Server-Patches/Anti-Xray.patch index e9d9139192..433d37409e 100644 --- a/Spigot-Server-Patches/Anti-Xray.patch +++ b/Spigot-Server-Patches/Anti-Xray.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Anti-Xray diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -index 646620d0c..4d30cdbc8 100644 +index 646620d0c2..4d30cdbc8b 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -0,0 +0,0 @@ @@ -49,7 +49,7 @@ index 646620d0c..4d30cdbc8 100644 } diff --git a/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockController.java b/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockController.java new file mode 100644 -index 000000000..6833cfad2 +index 0000000000..6833cfad25 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockController.java @@ -0,0 +0,0 @@ @@ -91,7 +91,7 @@ index 000000000..6833cfad2 +} diff --git a/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java b/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java new file mode 100644 -index 000000000..2dc0655a9 +index 0000000000..2dc0655a93 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java @@ -0,0 +0,0 @@ @@ -737,7 +737,7 @@ index 000000000..2dc0655a9 +} diff --git a/src/main/java/com/destroystokyo/paper/antixray/DataBitsReader.java b/src/main/java/com/destroystokyo/paper/antixray/DataBitsReader.java new file mode 100644 -index 000000000..92399318c +index 0000000000..92399318cd --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/antixray/DataBitsReader.java @@ -0,0 +0,0 @@ @@ -799,7 +799,7 @@ index 000000000..92399318c +} diff --git a/src/main/java/com/destroystokyo/paper/antixray/DataBitsWriter.java b/src/main/java/com/destroystokyo/paper/antixray/DataBitsWriter.java new file mode 100644 -index 000000000..aca0b9d71 +index 0000000000..aca0b9d719 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/antixray/DataBitsWriter.java @@ -0,0 +0,0 @@ @@ -889,7 +889,7 @@ index 000000000..aca0b9d71 +} diff --git a/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfo.java b/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfo.java new file mode 100644 -index 000000000..0bd269a07 +index 0000000000..0bd269a079 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfo.java @@ -0,0 +0,0 @@ @@ -975,7 +975,7 @@ index 000000000..0bd269a07 +} diff --git a/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfoAntiXray.java b/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfoAntiXray.java new file mode 100644 -index 000000000..8ea2beb59 +index 0000000000..8ea2beb597 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/antixray/PacketPlayOutMapChunkInfoAntiXray.java @@ -0,0 +0,0 @@ @@ -1008,7 +1008,7 @@ index 000000000..8ea2beb59 + } +} diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java -index 27a36b2b0..cb33cf902 100644 +index 663a41e9e7..0226b96f30 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java @@ -0,0 +0,0 @@ public class Chunk { @@ -1039,7 +1039,7 @@ index 27a36b2b0..cb33cf902 100644 this.initLighting(); } diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java -index 14f88e91d..bcce5e8b7 100644 +index 14f88e91db..bcce5e8b7e 100644 --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java +++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java @@ -0,0 +0,0 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { @@ -1052,7 +1052,7 @@ index 14f88e91d..bcce5e8b7 100644 NibbleArray nibblearray = new NibbleArray(nbttagcompound1.getByteArray("Data")); NibbleArray nibblearray1 = nbttagcompound1.hasKeyOfType("Add", 7) ? new NibbleArray(nbttagcompound1.getByteArray("Add")) : null; diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java -index afdc4a779..aae227fdb 100644 +index afdc4a779a..aae227fdb0 100644 --- a/src/main/java/net/minecraft/server/ChunkSection.java +++ b/src/main/java/net/minecraft/server/ChunkSection.java @@ -0,0 +0,0 @@ public class ChunkSection { @@ -1092,7 +1092,7 @@ index afdc4a779..aae227fdb 100644 int xx = i & 15; int yy = (i >> 8) & 15; diff --git a/src/main/java/net/minecraft/server/DataBits.java b/src/main/java/net/minecraft/server/DataBits.java -index fa0fd8a9c..401dc7cdc 100644 +index fa0fd8a9c8..401dc7cdc5 100644 --- a/src/main/java/net/minecraft/server/DataBits.java +++ b/src/main/java/net/minecraft/server/DataBits.java @@ -0,0 +0,0 @@ public class DataBits { @@ -1104,7 +1104,7 @@ index fa0fd8a9c..401dc7cdc 100644 return this.a; } diff --git a/src/main/java/net/minecraft/server/DataPalette.java b/src/main/java/net/minecraft/server/DataPalette.java -index 5765b2588..d522611ec 100644 +index 5765b25888..d522611ecb 100644 --- a/src/main/java/net/minecraft/server/DataPalette.java +++ b/src/main/java/net/minecraft/server/DataPalette.java @@ -0,0 +0,0 @@ import javax.annotation.Nullable; @@ -1119,7 +1119,7 @@ index 5765b2588..d522611ec 100644 IBlockData a(int i); diff --git a/src/main/java/net/minecraft/server/DataPaletteBlock.java b/src/main/java/net/minecraft/server/DataPaletteBlock.java -index 2cb462b8e..67784b4a6 100644 +index 2cb462b8e3..67784b4a67 100644 --- a/src/main/java/net/minecraft/server/DataPaletteBlock.java +++ b/src/main/java/net/minecraft/server/DataPaletteBlock.java @@ -0,0 +0,0 @@ package net.minecraft.server; @@ -1227,7 +1227,7 @@ index 2cb462b8e..67784b4a6 100644 } diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java -index d0b67d8fd..eeaa625d2 100644 +index d0b67d8fd6..eeaa625d2f 100644 --- a/src/main/java/net/minecraft/server/EntityFallingBlock.java +++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java @@ -0,0 +0,0 @@ public class EntityFallingBlock extends Entity { @@ -1247,7 +1247,7 @@ index d0b67d8fd..eeaa625d2 100644 if (block instanceof BlockFalling) { ((BlockFalling) block).a(this.world, blockposition, this.block, iblockdata); diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java -index e148901e5..61fbdeb6a 100644 +index e148901e53..61fbdeb6ac 100644 --- a/src/main/java/net/minecraft/server/Explosion.java +++ b/src/main/java/net/minecraft/server/Explosion.java @@ -0,0 +0,0 @@ public class Explosion { @@ -1259,7 +1259,7 @@ index e148901e5..61fbdeb6a 100644 if (flag) { double d0 = (double) ((float) blockposition.getX() + this.world.random.nextFloat()); diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java -index d583cced6..2eddb68d7 100644 +index d583cced66..2eddb68d7b 100644 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ b/src/main/java/net/minecraft/server/NetworkManager.java @@ -0,0 +0,0 @@ public class NetworkManager extends SimpleChannelInboundHandler> { @@ -1358,7 +1358,7 @@ index d583cced6..2eddb68d7 100644 public QueuedPacket(Packet packet, GenericFutureListener>... agenericfuturelistener) { this.a = packet; diff --git a/src/main/java/net/minecraft/server/PacketDataSerializer.java b/src/main/java/net/minecraft/server/PacketDataSerializer.java -index c1273e988..d71734df8 100644 +index c1273e988e..d71734df81 100644 --- a/src/main/java/net/minecraft/server/PacketDataSerializer.java +++ b/src/main/java/net/minecraft/server/PacketDataSerializer.java @@ -0,0 +0,0 @@ public class PacketDataSerializer extends ByteBuf { @@ -1370,7 +1370,7 @@ index c1273e988..d71734df8 100644 for (int j = 1; j < 5; ++j) { if ((i & -1 << j * 7) == 0) { diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java -index d16669bcc..306a6b7cd 100644 +index d16669bcc3..306a6b7cd3 100644 --- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java +++ b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java @@ -0,0 +0,0 @@ import java.util.Iterator; @@ -1463,7 +1463,7 @@ index d16669bcc..306a6b7cd 100644 if (flag) { packetdataserializer.writeBytes(chunksection.getSkyLightArray().asBytes()); diff --git a/src/main/java/net/minecraft/server/PlayerChunk.java b/src/main/java/net/minecraft/server/PlayerChunk.java -index 48a008e0a..395386f29 100644 +index 48a008e0a7..395386f295 100644 --- a/src/main/java/net/minecraft/server/PlayerChunk.java +++ b/src/main/java/net/minecraft/server/PlayerChunk.java @@ -0,0 +0,0 @@ public class PlayerChunk { @@ -1493,7 +1493,7 @@ index 48a008e0a..395386f29 100644 } else { this.a((Packet) (new PacketPlayOutMultiBlockChange(this.dirtyCount, this.dirtyBlocks, this.chunk))); diff --git a/src/main/java/net/minecraft/server/PlayerInteractManager.java b/src/main/java/net/minecraft/server/PlayerInteractManager.java -index a49b5c81a..5ec7f5819 100644 +index a49b5c81a8..5ec7f5819f 100644 --- a/src/main/java/net/minecraft/server/PlayerInteractManager.java +++ b/src/main/java/net/minecraft/server/PlayerInteractManager.java @@ -0,0 +0,0 @@ public class PlayerInteractManager { @@ -1506,10 +1506,10 @@ index a49b5c81a..5ec7f5819 100644 public void a(BlockPosition blockposition) { diff --git a/src/main/java/net/minecraft/server/RegistryBlockID.java b/src/main/java/net/minecraft/server/RegistryBlockID.java -index 8860a0129..fa0d66d63 100644 +index 03894df54c..76f6f35bb9 100644 --- a/src/main/java/net/minecraft/server/RegistryBlockID.java +++ b/src/main/java/net/minecraft/server/RegistryBlockID.java -@@ -0,0 +0,0 @@ public class RegistryBlockID implements Registry { // Paper - Fix decompile e +@@ -0,0 +0,0 @@ public class RegistryBlockID implements Registry { return Iterators.filter(this.b.iterator(), Predicates.notNull()); } @@ -1518,7 +1518,7 @@ index 8860a0129..fa0d66d63 100644 return this.a.size(); } diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 90f946e57..ea67b61b2 100644 +index 90f946e57a..ea67b61b2b 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -0,0 +0,0 @@ import org.bukkit.generator.ChunkGenerator; @@ -1555,7 +1555,7 @@ index 90f946e57..ea67b61b2 100644 public void a(BlockPosition blockposition, Block block, EnumDirection enumdirection) { diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java -index 9942f0c75..2da6edc63 100644 +index 9942f0c750..2da6edc63e 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java @@ -0,0 +0,0 @@ public class CustomChunkGenerator extends InternalChunkGenerator { diff --git a/Spigot-Server-Patches/isChunkGenerated-API.patch b/Spigot-Server-Patches/isChunkGenerated-API.patch index 346d8a5f3e..5d5da8bc13 100644 --- a/Spigot-Server-Patches/isChunkGenerated-API.patch +++ b/Spigot-Server-Patches/isChunkGenerated-API.patch @@ -6,7 +6,7 @@ Subject: [PATCH] isChunkGenerated API Resolves #1329 diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java -index 0eba3df5..ad548590 100644 +index 0eba3df571..ad5485908d 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java @@ -0,0 +0,0 @@ public class ChunkProviderServer implements IChunkProvider { @@ -23,7 +23,7 @@ index 0eba3df5..ad548590 100644 public Chunk getLoadedChunkAt(int i, int j) { long k = ChunkCoordIntPair.a(i, j); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 567e9acb..afb141c6 100644 +index 567e9acb13..afb141c629 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -0,0 +0,0 @@ public class CraftWorld implements World {