diff --git a/leaf-server/minecraft-patches/features/0282-Skip-PreCreatureSpawnEvent-if-no-listeners.patch b/leaf-server/minecraft-patches/features/0282-Skip-PreCreatureSpawnEvent-if-no-listeners.patch new file mode 100644 index 00000000..13b4ced4 --- /dev/null +++ b/leaf-server/minecraft-patches/features/0282-Skip-PreCreatureSpawnEvent-if-no-listeners.patch @@ -0,0 +1,54 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Taiyou06 +Date: Sun, 17 Aug 2025 14:46:30 +0200 +Subject: [PATCH] Skip PreCreatureSpawnEvent if no listeners + + +diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java +index 3a54fa25bf491902235392168a00c17378e01c0d..af436d22630713110ad581c955d7ed1cd53a43de 100644 +--- a/net/minecraft/world/level/NaturalSpawner.java ++++ b/net/minecraft/world/level/NaturalSpawner.java +@@ -541,17 +541,35 @@ public final class NaturalSpawner { + LevelChunk chunk + ) { + EntityType entityType = data.type(); +- // Paper start - PreCreatureSpawnEvent +- com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent( +- org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), +- org.bukkit.craftbukkit.entity.CraftEntityType.minecraftToBukkit(entityType), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL +- ); +- if (!event.callEvent()) { +- if (event.shouldAbortSpawn()) { +- return PreSpawnStatus.ABORT; ++ ++ // Leaf start - Skip PreCreatureSpawnEvent if no listeners ++ boolean shouldAbort = false; ++ boolean cancelled = false; ++ ++ if (com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent.getHandlerList().getRegisteredListeners().length != 0) { ++ // Paper start - PreCreatureSpawnEvent ++ com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent( ++ org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), ++ org.bukkit.craftbukkit.entity.CraftEntityType.minecraftToBukkit(entityType), ++ org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL ++ ); ++ if (!event.callEvent()) { ++ if (event.shouldAbortSpawn()) { ++ shouldAbort = true; ++ } ++ cancelled = true; + } ++ // Paper end - PreCreatureSpawnEvent ++ } ++ ++ if (shouldAbort) { ++ return PreSpawnStatus.ABORT; ++ } ++ if (cancelled) { + return PreSpawnStatus.CANCELLED; + } ++ // Leaf end - Skip PreCreatureSpawnEvent if no listeners ++ + final boolean success = entityType.getCategory() != MobCategory.MISC + // Paper end - PreCreatureSpawnEvent + && (