aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0081-PreCreatureSpawnEvent.patch
diff options
context:
space:
mode:
authorJake <[email protected]>2021-11-23 17:09:49 -0800
committerMiniDigger | Martin <[email protected]>2021-11-30 19:26:33 +0100
commite481692afdb08c4486866bc856919c585d6d9646 (patch)
tree66774ecbddc504c3b0fb9460139b6dc8c367d03d /patches/api/0081-PreCreatureSpawnEvent.patch
parent7665ae86d65b964822b307c085fc86c0fcc442f2 (diff)
downloadPaper-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.patch127
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;
++ }
++}