From 14b9d039886b93eeea08b7223517c0f88f314aac Mon Sep 17 00:00:00 2001 From: Cryptite Date: Sun, 26 Sep 2021 16:36:47 -0500 Subject: [PATCH] Add Player to SpongeAbsorbEvent --- ...0005-Add-Player-to-SpongeAbsorbEvent.patch | 52 +++++++++++++++++++ ...ayer-throughout-entire-block-destroy.patch | 8 +-- ...09-Add-BlockDestroyedByNeighborEvent.patch | 4 +- ...0010-Add-Player-to-SpongeAbsorbEvent.patch | 20 +++++++ 4 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 patches/api/0005-Add-Player-to-SpongeAbsorbEvent.patch create mode 100644 patches/server/0010-Add-Player-to-SpongeAbsorbEvent.patch diff --git a/patches/api/0005-Add-Player-to-SpongeAbsorbEvent.patch b/patches/api/0005-Add-Player-to-SpongeAbsorbEvent.patch new file mode 100644 index 000000000..769186f51 --- /dev/null +++ b/patches/api/0005-Add-Player-to-SpongeAbsorbEvent.patch @@ -0,0 +1,52 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Tom +Date: Sun, 26 Sep 2021 16:36:29 -0500 +Subject: [PATCH] Add Player to SpongeAbsorbEvent + + +diff --git a/src/main/java/org/bukkit/event/block/SpongeAbsorbEvent.java b/src/main/java/org/bukkit/event/block/SpongeAbsorbEvent.java +index 7029cfcd00ed5d9c7f06898ec2b81238ec775a70..0e2f21e0f1983d2e8b67deebf4d12d25107d1582 100644 +--- a/src/main/java/org/bukkit/event/block/SpongeAbsorbEvent.java ++++ b/src/main/java/org/bukkit/event/block/SpongeAbsorbEvent.java +@@ -7,6 +7,7 @@ import org.bukkit.block.BlockState; + import org.bukkit.event.Cancellable; + import org.bukkit.event.HandlerList; + import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; // Paper + + /** + * Called when a sponge absorbs water from the world. +@@ -21,11 +22,13 @@ public class SpongeAbsorbEvent extends BlockEvent implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private boolean cancelled; ++ private final org.bukkit.entity.Player player; // Paper + private final List blocks; + +- public SpongeAbsorbEvent(@NotNull Block block, @NotNull List waterblocks) { ++ public SpongeAbsorbEvent(@NotNull Block block, @Nullable org.bukkit.entity.Player player, @NotNull List waterblocks) { // Paper + super(block); + this.blocks = waterblocks; ++ this.player = player; // Paper + } + + /** +@@ -41,6 +44,18 @@ public class SpongeAbsorbEvent extends BlockEvent implements Cancellable { + return blocks; + } + ++ // Paper start ++ /** ++ * Gets the Player that placed the Sponge Block ++ * ++ * @return The Player that placed the sponge block causing the absorb event, or null if no Player was involved ++ */ ++ @Nullable ++ public org.bukkit.entity.Player getPlayer() { ++ return player; ++ } ++ // Paper end ++ + @Override + public boolean isCancelled() { + return cancelled; diff --git a/patches/server/0008-Track-Player-throughout-entire-block-destroy.patch b/patches/server/0008-Track-Player-throughout-entire-block-destroy.patch index 9c60afb0c..fbde9ab97 100644 --- a/patches/server/0008-Track-Player-throughout-entire-block-destroy.patch +++ b/patches/server/0008-Track-Player-throughout-entire-block-destroy.patch @@ -15,7 +15,7 @@ index 12998d0e9ae0e148a155faa4468b0f78b8462cc9..b03eacbef3cf15b70ec012af0870975d + level.pendingPlayerBlockEvents.put(pos, new Level.PendingBlockEvent(pos, this.player)); // Paper block.playerWillDestroy((Level) this.level, pos, iblockdata, (Player) this.player); boolean flag = this.level.removeBlock(pos, false); - + @@ -465,6 +466,7 @@ public class ServerPlayerGameMode { // CraftBukkit start java.util.List itemsToDrop = level.captureDrops; // Paper - store current list @@ -37,13 +37,13 @@ index 3e5e358e24bd84a05785a9391526f316475e95ff..9914a92040a63b6102eb6171f058ea1c CompoundTag newData = this.getTagClone(); int newCount = this.getCount(); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index b93056b91e7ebd49e6ddb53ccb6c05c056088df9..3fed792374c48026755cca2f5727b2d978ecc292 100644 +index a9315b7acec3c2ccaf879e0f1d45c062d8e201b1..7dec61b831860e372f1785c2ae838cb3ad2fc623 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -175,6 +175,27 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public final Map explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Move from Map in BlockRedstoneTorch to here - + + // Paper start - Holder class used to track what Player is responsible the last block event + public static class PendingBlockEvent { + @@ -81,7 +81,7 @@ index b93056b91e7ebd49e6ddb53ccb6c05c056088df9..3fed792374c48026755cca2f5727b2d9 if (!this.isClientSide) { BlockState iblockdata = this.getBlockState(pos); + org.bukkit.block.Block blockAt = world.getBlockAt(pos.getX(), pos.getY(), pos.getZ()); // Paper - + try { + // Paper start - If this is a non-air block being set to an air block, get (remove, if exists) + // our PendingBlockEvent diff --git a/patches/server/0009-Add-BlockDestroyedByNeighborEvent.patch b/patches/server/0009-Add-BlockDestroyedByNeighborEvent.patch index 75ca1cf73..d57d90d5a 100644 --- a/patches/server/0009-Add-BlockDestroyedByNeighborEvent.patch +++ b/patches/server/0009-Add-BlockDestroyedByNeighborEvent.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add BlockDestroyedByNeighborEvent diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index a9315b7acec3c2ccaf879e0f1d45c062d8e201b1..194dd5d6e34097fe78b4cce7e850352510dc804d 100644 +index 7dec61b831860e372f1785c2ae838cb3ad2fc623..9b704693ea8d8677d3c25d5a3c08d4ef26aa1fc3 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -725,6 +725,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -747,6 +747,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable { if (iblockdata.isAir()) { return false; } else { diff --git a/patches/server/0010-Add-Player-to-SpongeAbsorbEvent.patch b/patches/server/0010-Add-Player-to-SpongeAbsorbEvent.patch new file mode 100644 index 000000000..a1044272a --- /dev/null +++ b/patches/server/0010-Add-Player-to-SpongeAbsorbEvent.patch @@ -0,0 +1,20 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Tom +Date: Sun, 26 Sep 2021 16:36:29 -0500 +Subject: [PATCH] Add Player to SpongeAbsorbEvent + + +diff --git a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java +index 1ef8eadd4e59f2e5d2bbd84f6f9bcf37b59db5bd..ea711757413e2580a5806e0063b3e4fa5d4eddbb 100644 +--- a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java +@@ -110,7 +110,8 @@ public class SpongeBlock extends Block { + if (!blocks.isEmpty()) { + final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); + +- SpongeAbsorbEvent event = new SpongeAbsorbEvent(bblock, (List) (List) blocks); ++ Level.PendingBlockEvent blockEvent = world.pendingPlayerBlockEvents.remove(pos); // Paper ++ SpongeAbsorbEvent event = new SpongeAbsorbEvent(bblock, blockEvent != null ? (org.bukkit.entity.Player) blockEvent.player.getBukkitEntity() : null, (List) (List) blocks); // Paper + world.getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) {