diff options
Diffstat (limited to 'patches/api/0079-PreCreatureSpawnEvent.patch')
-rw-r--r-- | patches/api/0079-PreCreatureSpawnEvent.patch | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/patches/api/0079-PreCreatureSpawnEvent.patch b/patches/api/0079-PreCreatureSpawnEvent.patch new file mode 100644 index 0000000000..60f65dc98d --- /dev/null +++ b/patches/api/0079-PreCreatureSpawnEvent.patch @@ -0,0 +1,131 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar <[email protected]> +Date: Sun, 14 Jan 2018 16:59:43 -0500 +Subject: [PATCH] PreCreatureSpawnEvent + +Adds an event to fire before an Entity is created, so that plugins that need to cancel +CreatureSpawnEvent can do so from this event instead. + +Cancelling CreatureSpawnEvent rapidly causes a lot of garbage collection and CPU waste +as it's done after the Entity object has been fully created. + +Mob Limiting plugins and blanket "ban this type of monster" plugins should use this event +instead and save a lot of server resources. + +See: https://github.com/PaperMC/Paper/issues/917 + +diff --git a/src/main/java/com/destroystokyo/paper/event/entity/PreCreatureSpawnEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/PreCreatureSpawnEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..633ef4dcc701916f2dbfefbbebd5994f93ffc2a4 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/event/entity/PreCreatureSpawnEvent.java +@@ -0,0 +1,109 @@ ++package com.destroystokyo.paper.event.entity; ++ ++import org.bukkit.Location; ++import org.bukkit.entity.EntityType; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.Event; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.entity.CreatureSpawnEvent; ++import org.jetbrains.annotations.ApiStatus; ++import org.jetbrains.annotations.NotNull; ++ ++/** ++ * WARNING: This event only fires for a limited number of cases, and not for every case that {@link CreatureSpawnEvent} does. ++ * <p> ++ * You should still listen to {@link CreatureSpawnEvent} as a backup, and only use this event as an "enhancement". ++ * The intent of this event is to improve server performance, so it fires even if the spawning might fail later, for ++ * example when the entity would be unable to spawn due to limited space or lighting. ++ * <p> ++ * Currently: NATURAL and SPAWNER based reasons. <!-- Please submit a Pull Request for future additions. --> ++ * Also, Plugins that replace Entity Registrations with their own custom entities might not fire this event. ++ */ ++public class PreCreatureSpawnEvent extends Event implements Cancellable { ++ ++ private static final HandlerList HANDLER_LIST = new HandlerList(); ++ ++ @NotNull private final Location location; ++ @NotNull private final EntityType type; ++ @NotNull private final CreatureSpawnEvent.SpawnReason reason; ++ private boolean shouldAbortSpawn; ++ ++ private boolean cancelled; ++ ++ @ApiStatus.Internal ++ public PreCreatureSpawnEvent(@NotNull Location location, @NotNull EntityType type, @NotNull CreatureSpawnEvent.SpawnReason reason) { ++ this.location = location; ++ this.type = type; ++ this.reason = reason; ++ } ++ ++ /** ++ * @return The location this creature is being spawned at ++ */ ++ @NotNull ++ public Location getSpawnLocation() { ++ return this.location.clone(); ++ } ++ ++ /** ++ * @return The type of creature being spawned ++ */ ++ @NotNull ++ public EntityType getType() { ++ return this.type; ++ } ++ ++ /** ++ * @return Reason this creature is spawning (ie, NATURAL vs SPAWNER) ++ */ ++ @NotNull ++ public CreatureSpawnEvent.SpawnReason getReason() { ++ return this.reason; ++ } ++ ++ /** ++ * @return If the spawn process should be aborted vs trying more attempts ++ */ ++ public boolean shouldAbortSpawn() { ++ return this.shouldAbortSpawn; ++ } ++ ++ /** ++ * Set this if you are more blanket blocking all types of these spawns, and wish to abort the spawn process from ++ * trying more attempts after this cancellation. ++ * ++ * @param shouldAbortSpawn Set if the spawn process should be aborted vs trying more attempts ++ */ ++ public void setShouldAbortSpawn(boolean shouldAbortSpawn) { ++ this.shouldAbortSpawn = shouldAbortSpawn; ++ } ++ ++ /** ++ * @return If the spawn of this creature is cancelled or not ++ */ ++ @Override ++ public boolean isCancelled() { ++ return this.cancelled; ++ } ++ ++ /** ++ * Cancelling this event is more efficient than cancelling {@link CreatureSpawnEvent} ++ * ++ * @param cancel {@code true} if you wish to cancel this event, and abort the spawn of this creature ++ */ ++ @Override ++ public void setCancelled(boolean cancel) { ++ this.cancelled = cancel; ++ } ++ ++ @NotNull ++ @Override ++ public HandlerList getHandlers() { ++ return HANDLER_LIST; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return HANDLER_LIST; ++ } ++} |