2018-07-26 07:07:56 +08:00
|
|
|
From 9a0a56e528db31e6d9a887b2b3ac7cb408fd8210 Mon Sep 17 00:00:00 2001
|
2018-01-15 06:02:38 +08:00
|
|
|
From: Aikar <aikar@aikar.co>
|
|
|
|
Date: Sun, 14 Jan 2018 17:01:31 -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/net/minecraft/server/MobSpawnerAbstract.java b/src/main/java/net/minecraft/server/MobSpawnerAbstract.java
|
2018-07-26 07:07:56 +08:00
|
|
|
index c76dbe74ac..d10196fcbd 100644
|
2018-01-15 06:02:38 +08:00
|
|
|
--- a/src/main/java/net/minecraft/server/MobSpawnerAbstract.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/MobSpawnerAbstract.java
|
|
|
|
@@ -1,6 +1,7 @@
|
|
|
|
package net.minecraft.server;
|
|
|
|
|
|
|
|
import com.google.common.collect.Lists;
|
|
|
|
+
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
|
|
|
import javax.annotation.Nullable;
|
2018-07-26 07:07:56 +08:00
|
|
|
@@ -94,6 +95,28 @@ public abstract class MobSpawnerAbstract {
|
2018-07-19 02:55:52 +08:00
|
|
|
double d3 = j >= 1 ? nbttaglist.k(0) : (double) blockposition.getX() + (world.random.nextDouble() - world.random.nextDouble()) * (double) this.spawnRange + 0.5D;
|
|
|
|
double d4 = j >= 2 ? nbttaglist.k(1) : (double) (blockposition.getY() + world.random.nextInt(3) - 1);
|
|
|
|
double d5 = j >= 3 ? nbttaglist.k(2) : (double) blockposition.getZ() + (world.random.nextDouble() - world.random.nextDouble()) * (double) this.spawnRange + 0.5D;
|
2018-01-15 06:02:38 +08:00
|
|
|
+ // Paper start
|
|
|
|
+ if (this.getMobName() == null) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
2018-01-16 12:44:21 +08:00
|
|
|
+ String key = this.getMobName().getKey();
|
|
|
|
+ org.bukkit.entity.EntityType type = org.bukkit.entity.EntityType.fromName(key);
|
|
|
|
+ if (type != null) {
|
|
|
|
+ com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event;
|
|
|
|
+ event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
|
|
|
|
+ MCUtil.toLocation(world, d3, d4, d5),
|
|
|
|
+ type,
|
|
|
|
+ org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER
|
|
|
|
+ );
|
|
|
|
+ if (!event.callEvent()) {
|
2018-07-26 06:19:51 +08:00
|
|
|
+ flag = true;
|
2018-01-16 12:44:21 +08:00
|
|
|
+ if (event.shouldAbortSpawn()) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ continue;
|
2018-01-15 06:02:38 +08:00
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
Entity entity = ChunkRegionLoader.a(nbttagcompound, world, d3, d4, d5, false);
|
|
|
|
|
|
|
|
if (entity == null) {
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
2018-07-23 16:39:55 +08:00
|
|
|
index 342a15db5e..973c3d1e9e 100644
|
2018-01-15 06:02:38 +08:00
|
|
|
--- a/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
2018-07-19 02:55:52 +08:00
|
|
|
@@ -160,10 +160,30 @@ public final class SpawnerCreature {
|
2018-01-15 06:02:38 +08:00
|
|
|
|
2018-07-19 02:55:52 +08:00
|
|
|
if (worldserver.a(enumcreaturetype, biomebase_biomemeta, (BlockPosition) blockposition_mutableblockposition)) {
|
|
|
|
EntityPositionTypes.Surface entitypositiontypes_surface = EntityPositionTypes.a(biomebase_biomemeta.b);
|
|
|
|
-
|
|
|
|
if (entitypositiontypes_surface != null && a(entitypositiontypes_surface, worldserver, blockposition_mutableblockposition, biomebase_biomemeta.b)) {
|
|
|
|
EntityInsentient entityinsentient;
|
|
|
|
|
|
|
|
+ // Paper start
|
|
|
|
+ com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event;
|
|
|
|
+ EntityTypes<? extends EntityInsentient> cls = biomebase_biomemeta.b;
|
|
|
|
+ org.bukkit.entity.EntityType type = EntityTypes.clsToTypeMap.get(cls);
|
|
|
|
+ if (type != null) {
|
|
|
|
+ event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
|
|
|
|
+ MCUtil.toLocation(worldserver, blockposition_mutableblockposition),
|
|
|
|
+ type, SpawnReason.NATURAL
|
|
|
|
+ );
|
|
|
|
+ if (!event.callEvent()) {
|
|
|
|
+ if (event.shouldAbortSpawn()) {
|
|
|
|
+ continue label128; // right above the iterator for c (Chunk Pos Set)
|
|
|
|
+ }
|
|
|
|
+ j1 += l2;
|
|
|
|
+ ++j4;
|
|
|
|
+ continue;
|
2018-01-16 12:44:21 +08:00
|
|
|
+ }
|
2018-01-15 06:02:38 +08:00
|
|
|
+ }
|
2018-07-19 02:55:52 +08:00
|
|
|
+ // Paper end
|
|
|
|
+
|
|
|
|
+
|
|
|
|
try {
|
|
|
|
entityinsentient = (EntityInsentient) biomebase_biomemeta.b.a((World) worldserver);
|
|
|
|
} catch (Exception exception) {
|
2018-01-15 06:02:38 +08:00
|
|
|
--
|
2018-06-30 13:40:52 +08:00
|
|
|
2.18.0
|
2018-01-15 06:02:38 +08:00
|
|
|
|