diff --git a/Spigot-Server-Patches/0114-Option-to-disable-BlockPhysicsEvent-for-Redstone.patch b/Spigot-Server-Patches/0114-Option-to-disable-BlockPhysicsEvent-for-Redstone.patch new file mode 100644 index 0000000000..27907179d1 --- /dev/null +++ b/Spigot-Server-Patches/0114-Option-to-disable-BlockPhysicsEvent-for-Redstone.patch @@ -0,0 +1,71 @@ +From ee488c87907477ec2a49d7c1e7b6ebf2797d7126 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Mon, 28 Mar 2016 19:55:45 -0400 +Subject: [PATCH] Option to disable BlockPhysicsEvent for Redstone + +Not sure of any reason a plugin would need to act on a Physics event +for redstone. There is a BlockRedstoneEvent that plugins can also use +for accessing redstone activity. + +Defaulting this to false will provide substantial performance improvement +by saving millions of event calls on redstone heavy servers. + +diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +index 66ba48a..2740906 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java ++++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +@@ -306,4 +306,9 @@ public class PaperWorldConfig { + private void skeleHorseSpawnChance() { + skeleHorseSpawnChance = getDouble("skeleton-horse-thunder-spawn-chance", -1.0D); // -1.0D represents a "vanilla" state + } ++ ++ public boolean firePhysicsEventForRedstone = false; ++ private void firePhysicsEventForRedstone() { ++ firePhysicsEventForRedstone = getBoolean("fire-physics-event-for-redstone", firePhysicsEventForRedstone); ++ } + } +diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java +index e5ea99c..8f732bb 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -574,7 +574,7 @@ public abstract class World implements IBlockAccess { + try { + // CraftBukkit start + CraftWorld world = ((WorldServer) this).getWorld(); +- if (world != null) { ++ if (world != null && !((WorldServer)this).stopPhysicsEvent) { // Paper + BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftMagicNumbers.getId(block)); + this.getServer().getPluginManager().callEvent(event); + +diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java +index f7bb918..3c41a0c 100644 +--- a/src/main/java/net/minecraft/server/WorldServer.java ++++ b/src/main/java/net/minecraft/server/WorldServer.java +@@ -29,6 +29,7 @@ import org.bukkit.event.weather.LightningStrikeEvent; + public class WorldServer extends World implements IAsyncTaskHandler { + + private static final Logger a = LogManager.getLogger(); ++ boolean stopPhysicsEvent = false; // Paper + private final MinecraftServer server; + public EntityTracker tracker; + private final PlayerChunkMap manager; +@@ -766,6 +767,7 @@ public class WorldServer extends World implements IAsyncTaskHandler { + + if (iblockdata.getMaterial() != Material.AIR && Block.a(iblockdata.getBlock(), nextticklistentry.a())) { + try { ++ stopPhysicsEvent = !paperConfig.firePhysicsEventForRedstone && iblockdata.getBlock() instanceof BlockDiodeAbstract; // Paper + iblockdata.getBlock().b((World) this, nextticklistentry.a, iblockdata, this.random); + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Exception while ticking a block"); +@@ -773,7 +775,7 @@ public class WorldServer extends World implements IAsyncTaskHandler { + + CrashReportSystemDetails.a(crashreportsystemdetails, nextticklistentry.a, iblockdata); + throw new ReportedException(crashreport); +- } ++ } finally { stopPhysicsEvent = false; } // Paper + } + timing.stopTiming(); // Paper + } else { +-- +2.7.4 +