From 5301642c906ad5eba7589f9def43c64610eab9e3 Mon Sep 17 00:00:00 2001 From: CraftBukkit/Spigot Date: Sat, 10 Jun 2023 07:22:51 +1000 Subject: [PATCH] Implement SpawnerSpawnEvent By: md_5 Also-by: Andy Shulman --- .../world/level/MobSpawnerAbstract.patch | 9 +++++++-- .../craftbukkit/event/CraftEventFactory.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/paper-server/nms-patches/net/minecraft/world/level/MobSpawnerAbstract.patch b/paper-server/nms-patches/net/minecraft/world/level/MobSpawnerAbstract.patch index 9dd0552fc2..c29b73b5e3 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/MobSpawnerAbstract.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/MobSpawnerAbstract.patch @@ -8,12 +8,17 @@ } private boolean isNearPlayer(World world, BlockPosition blockposition) { -@@ -152,7 +153,7 @@ +@@ -152,7 +153,12 @@ } } - if (!worldserver.tryAddFreshEntityWithPassengers(entity)) { -+ if (!worldserver.tryAddFreshEntityWithPassengers(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER)) { // CraftBukkit ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callSpawnerSpawnEvent(entity, blockposition).isCancelled()) { ++ continue; ++ } ++ if (!worldserver.tryAddFreshEntityWithPassengers(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER)) { ++ // CraftBukkit end this.delay(worldserver, blockposition); return; } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 58134f53e2..690e662f75 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -195,6 +195,7 @@ import org.bukkit.event.entity.PlayerLeashEntityEvent; import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.entity.SpawnerSpawnEvent; import org.bukkit.event.entity.StriderTemperatureChangeEvent; import org.bukkit.event.entity.VillagerCareerChangeEvent; import org.bukkit.event.inventory.InventoryCloseEvent; @@ -1519,6 +1520,21 @@ public class CraftEventFactory { return event; } + /** + * Mob spawner event. + */ + public static SpawnerSpawnEvent callSpawnerSpawnEvent(Entity spawnee, BlockPosition pos) { + org.bukkit.craftbukkit.entity.CraftEntity entity = spawnee.getBukkitEntity(); + BlockState state = CraftBlock.at(spawnee.level(), pos).getState(); + if (!(state instanceof org.bukkit.block.CreatureSpawner)) { + state = null; + } + + SpawnerSpawnEvent event = new SpawnerSpawnEvent(entity, (org.bukkit.block.CreatureSpawner) state); + entity.getServer().getPluginManager().callEvent(event); + return event; + } + public static EntityToggleGlideEvent callToggleGlideEvent(EntityLiving entity, boolean gliding) { EntityToggleGlideEvent event = new EntityToggleGlideEvent((LivingEntity) entity.getBukkitEntity(), gliding); entity.level().getCraftServer().getPluginManager().callEvent(event);