From e8a47919cedde0720178f3f00f34da7e97982dba Mon Sep 17 00:00:00 2001 From: Sotr Date: Thu, 7 Mar 2019 13:06:55 +0800 Subject: [PATCH] Add option to fix physics event - PaperMC/Paper#1867 --- .../server/core/AkarinGlobalConfig.java | 5 +++++ src/main/java/net/minecraft/server/Block.java | 22 +++++++++++++++++++ src/main/java/net/minecraft/server/World.java | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java b/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java index 967a845e0..33d575504 100644 --- a/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java +++ b/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java @@ -160,4 +160,9 @@ public class AkarinGlobalConfig { fileIOThreads = fileIOThreads < 1 ? 1 : fileIOThreads; fileIOThreads = fileIOThreads > 8 ? 8 : fileIOThreads; } + + public static boolean fixPhysicsEventBehaviour = false; + private static void fixPhysicsEventBehavior() { + fixPhysicsEventBehaviour = getBoolean("alternative.fix-physics-event-behaviour", fixPhysicsEventBehaviour); + } } \ No newline at end of file diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java index 28efb4d4f..ceef63f87 100644 --- a/src/main/java/net/minecraft/server/Block.java +++ b/src/main/java/net/minecraft/server/Block.java @@ -10,6 +10,9 @@ import java.util.stream.Stream; import javax.annotation.Nullable; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.event.block.BlockPhysicsEvent; public class Block implements IMaterial { @@ -172,7 +175,26 @@ public class Block implements IMaterial { } public static void a(IBlockData iblockdata, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, int i) { + // Akarin start + ensuresTypeAndData(iblockdata, iblockdata1, generatoraccess, blockposition, i, blockposition); + } + + public static void ensuresTypeAndData(IBlockData iblockdata, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, int i, BlockPosition sourceBlockPosition) { + // Akarin end if (iblockdata1 != iblockdata) { + // Akarin start - fixes physics event + if (io.akarin.server.core.AkarinGlobalConfig.fixPhysicsEventBehaviour && ((WorldServer) generatoraccess).hasPhysicsEvent) { + CraftWorld world = ((WorldServer) generatoraccess).getWorld(); + if (world != null) { + BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftBlockData.fromData(iblockdata), world.getBlockAt(sourceBlockPosition.getX(), sourceBlockPosition.getY(), sourceBlockPosition.getZ())); + ((WorldServer) generatoraccess).getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return; + } + } + } + // Akarin end if (iblockdata1.isAir()) { if (!generatoraccess.e()) { generatoraccess.setAir(blockposition, (i & 32) == 0); diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index c7c65205e..9fc226b84 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -519,7 +519,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc // CraftBukkit start iblockdata1.b(this, blockposition, j); // Don't call an event for the old block to limit event spam CraftWorld world = ((WorldServer) this).getWorld(); - if (world != null && ((WorldServer)this).hasPhysicsEvent) { // Paper + if (world != null && ((WorldServer)this).hasPhysicsEvent && !io.akarin.server.core.AkarinGlobalConfig.fixPhysicsEventBehaviour) { // Paper // Akarin - fixes physics event BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftBlockData.fromData(iblockdata)); this.getServer().getPluginManager().callEvent(event);