PaperMC/Spigot-API-Patches/Add-source-block-to-BlockPhysicsEvent.patch
Aikar 68b25624d8 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
2018-09-09 01:04:29 -04:00

46 lines
No EOL
1.6 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Sotr <i@omc.hk>
Date: Thu, 23 Aug 2018 16:14:25 +0800
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 5e47eabe8..9d9e4712b 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 {
private static final HandlerList handlers = new HandlerList();
private final BlockData changed;
private boolean cancel = false;
+ // Paper start - add source block
+ private int sourceX;
+ private int sourceY;
+ private int sourceZ;
+ private Block sourceBlock;
+
+ public BlockPhysicsEvent(final Block block, final BlockData changed, final int sourceX, final int sourceY, final int sourceZ) {
+ this(block, changed);
+ this.sourceX = sourceX;
+ this.sourceY = sourceY;
+ this.sourceZ = sourceZ;
+ this.sourceBlock = null;
+ }
+
+ /**
+ * Gets the source block, causing this event
+ *
+ * @return Source block
+ */
+ public Block getSourceBlock() {
+ return sourceBlock == null ? (sourceBlock = block.getWorld().getBlockAt(sourceX, sourceY, sourceZ)) : sourceBlock;
+ }
+ // Paper end
public BlockPhysicsEvent(final Block block, final BlockData changed) {
super(block);
this.changed = changed;
+ this.sourceBlock = block; // Paper - add source block
}
/**
--