diff options
author | Jake <[email protected]> | 2021-11-23 17:09:49 -0800 |
---|---|---|
committer | MiniDigger | Martin <[email protected]> | 2021-11-30 19:26:33 +0100 |
commit | e481692afdb08c4486866bc856919c585d6d9646 (patch) | |
tree | 66774ecbddc504c3b0fb9460139b6dc8c367d03d /patches/api/0081-PreCreatureSpawnEvent.patch | |
parent | 7665ae86d65b964822b307c085fc86c0fcc442f2 (diff) | |
download | Paper-e481692afdb08c4486866bc856919c585d6d9646.tar.gz Paper-e481692afdb08c4486866bc856919c585d6d9646.zip |
move extra plugins patch up & more work
Diffstat (limited to 'patches/api/0081-PreCreatureSpawnEvent.patch')
-rw-r--r-- | patches/api/0081-PreCreatureSpawnEvent.patch | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/patches/api/0081-PreCreatureSpawnEvent.patch b/patches/api/0081-PreCreatureSpawnEvent.patch new file mode 100644 index 0000000000..0090330de9 --- /dev/null +++ b/patches/api/0081-PreCreatureSpawnEvent.patch @@ -0,0 +1,127 @@ +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..3ad231aa3206c8cfd5ec995249584cebab5d11f3 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/event/entity/PreCreatureSpawnEvent.java +@@ -0,0 +1,105 @@ ++package com.destroystokyo.paper.event.entity; ++ ++import com.google.common.base.Preconditions; ++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.NotNull; ++ ++/** ++ * WARNING: This event only fires for a limited number of cases, and not for every case that CreatureSpawnEvent does. ++ * ++ * You should still listen to 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. ++ * ++ * 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 { ++ @NotNull private final Location location; ++ @NotNull private final EntityType type; ++ @NotNull private final CreatureSpawnEvent.SpawnReason reason; ++ private boolean shouldAbortSpawn; ++ ++ public PreCreatureSpawnEvent(@NotNull Location location, @NotNull EntityType type, @NotNull CreatureSpawnEvent.SpawnReason reason) { ++ this.location = Preconditions.checkNotNull(location, "Location may not be null").clone(); ++ this.type = Preconditions.checkNotNull(type, "Type may not be null"); ++ this.reason = Preconditions.checkNotNull(reason, "Reason may not be null"); ++ } ++ ++ /** ++ * @return The location this creature is being spawned at ++ */ ++ @NotNull ++ public Location getSpawnLocation() { ++ return location; ++ } ++ ++ /** ++ * @return The type of creature being spawned ++ */ ++ @NotNull ++ public EntityType getType() { ++ return type; ++ } ++ ++ /** ++ * @return Reason this creature is spawning (ie, NATURAL vs SPAWNER) ++ */ ++ @NotNull ++ public CreatureSpawnEvent.SpawnReason getReason() { ++ return reason; ++ } ++ ++ /** ++ * @return If the spawn process should be aborted vs trying more attempts ++ */ ++ public boolean shouldAbortSpawn() { ++ return 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; ++ } ++ ++ private static final HandlerList handlers = new HandlerList(); ++ ++ @NotNull ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++ ++ private boolean cancelled = false; ++ ++ /** ++ * @return If the spawn of this creature is cancelled or not ++ */ ++ @Override ++ public boolean isCancelled() { ++ return cancelled; ++ } ++ ++ /** ++ * Cancelling this event is more effecient than cancelling CreatureSpawnEvent ++ * @param cancel true if you wish to cancel this event, and abort the spawn of this creature ++ */ ++ @Override ++ public void setCancelled(boolean cancel) { ++ cancelled = cancel; ++ } ++} |