103 lines
5.9 KiB
Diff
103 lines
5.9 KiB
Diff
From da358531a943040a325275a457afe2a94571e7b1 Mon Sep 17 00:00:00 2001
|
|
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/EntityTypes.java b/src/main/java/net/minecraft/server/EntityTypes.java
|
|
index 9aed0d6b8..dce9e2fc1 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityTypes.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityTypes.java
|
|
@@ -271,6 +271,7 @@ public class EntityTypes<T extends Entity> {
|
|
return this.bf;
|
|
}
|
|
|
|
+ public final MinecraftKey getKey() { return this.g(); } // Paper - OBFHELPER
|
|
public MinecraftKey g() {
|
|
if (this.bg == null) {
|
|
MinecraftKey minecraftkey = IRegistry.ENTITY_TYPE.getKey(this);
|
|
diff --git a/src/main/java/net/minecraft/server/MobSpawnerAbstract.java b/src/main/java/net/minecraft/server/MobSpawnerAbstract.java
|
|
index d8ae336e9..bca0e3a2e 100644
|
|
--- a/src/main/java/net/minecraft/server/MobSpawnerAbstract.java
|
|
+++ b/src/main/java/net/minecraft/server/MobSpawnerAbstract.java
|
|
@@ -103,6 +103,27 @@ public abstract class MobSpawnerAbstract {
|
|
double d4 = j >= 2 ? nbttaglist.h(1) : (double) (blockposition.getY() + world.random.nextInt(3) - 1);
|
|
double d5 = j >= 3 ? nbttaglist.h(2) : (double) blockposition.getZ() + (world.random.nextDouble() - world.random.nextDouble()) * (double) this.spawnRange + 0.5D;
|
|
|
|
+ // Paper start
|
|
+ EntityTypes entityType = optional.get();
|
|
+ String key = entityType.getKey().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()) {
|
|
+ flag = true;
|
|
+ if (event.shouldAbortSpawn()) {
|
|
+ break;
|
|
+ }
|
|
+ continue;
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
if (world.c(((EntityTypes) optional.get()).a(d3, d4, d5))) {
|
|
Entity entity = EntityTypes.a(nbttagcompound, world, (entity1) -> {
|
|
entity1.setPositionRotation(d3, d4, d5, entity1.yaw, entity1.pitch);
|
|
diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
index 7e58e4714..e5695c760 100644
|
|
--- a/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
+++ b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
@@ -38,7 +38,7 @@ public final class SpawnerCreature {
|
|
BiomeBase.BiomeMeta biomebase_biomemeta = null;
|
|
GroupDataEntity groupdataentity = null;
|
|
int l1 = MathHelper.f(Math.random() * 4.0D);
|
|
- int i2 = 0;
|
|
+ int i2 = 0; // Paper - force diff on name change
|
|
int j2 = 0;
|
|
|
|
while (true) {
|
|
@@ -74,6 +74,25 @@ public final class SpawnerCreature {
|
|
if (entitypositiontypes_surface != null && a(entitypositiontypes_surface, (IWorldReader) world, (BlockPosition) blockposition_mutableblockposition, entitytypes) && world.c(entitytypes.a((double) f, (double) k, (double) f1))) {
|
|
EntityInsentient entityinsentient;
|
|
|
|
+ // Paper start
|
|
+ com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event;
|
|
+ EntityTypes<?> cls = biomebase_biomemeta.b;
|
|
+ org.bukkit.entity.EntityType type = org.bukkit.entity.EntityType.fromName(cls.getKey().getKey());
|
|
+ if (type != null) {
|
|
+ event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
|
|
+ MCUtil.toLocation(world, blockposition_mutableblockposition),
|
|
+ type, SpawnReason.NATURAL
|
|
+ );
|
|
+ if (!event.callEvent()) {
|
|
+ if (event.shouldAbortSpawn()) {
|
|
+ return;
|
|
+ }
|
|
+ ++i2;
|
|
+ continue;
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
try {
|
|
Entity entity = entitytypes.a(world);
|
|
|
|
--
|
|
2.21.0
|
|
|