From b2f98146b39d7ce91a285ea261c8fbc958c679db Mon Sep 17 00:00:00 2001
From: Jedediah Smith <jedediah@silencegreys.com>
Date: Tue, 1 Mar 2016 14:47:52 -0600
Subject: [PATCH] Player affects spawning API


diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index ffaeb76d0f..d0713bfcd1 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -70,6 +70,9 @@ public abstract class EntityHuman extends EntityLiving {
     private final ItemCooldown bY;
     @Nullable
     public EntityFishingHook hookedFish;
+    // Paper start
+    public boolean affectsSpawning = true;
+    // Paper end
 
     // CraftBukkit start
     public boolean fauxSleeping;
diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java
index 265e734af2..5d830b245d 100644
--- a/src/main/java/net/minecraft/server/EntityInsentient.java
+++ b/src/main/java/net/minecraft/server/EntityInsentient.java
@@ -613,7 +613,7 @@ public abstract class EntityInsentient extends EntityLiving {
         if (!this.isPersistent() && !this.I()) {
             EntityHuman entityhuman = this.world.findNearbyPlayer(this, -1.0D);
 
-            if (entityhuman != null) {
+            if (entityhuman != null && entityhuman.affectsSpawning) { // Paper - Affects Spawning API
                 double d0 = entityhuman.h(this);
 
                 if (d0 > world.paperConfig.hardDespawnDistance) { // CraftBukkit - remove isTypeNotPersistent() check // Paper - custom despawn distances
diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java
index dbbc34d91b..d823c6b6d9 100644
--- a/src/main/java/net/minecraft/server/EntitySilverfish.java
+++ b/src/main/java/net/minecraft/server/EntitySilverfish.java
@@ -106,7 +106,7 @@ public class EntitySilverfish extends EntityMonster {
         if (super.a(generatoraccess, enummobspawn)) {
             EntityHuman entityhuman = this.world.a(EntitySilverfish.b, (EntityLiving) this);
 
-            return entityhuman == null;
+            return !(entityhuman != null && !entityhuman.affectsSpawning) && entityhuman == null; // Paper - Affects Spawning API
         } else {
             return false;
         }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index e45fd0028b..ffe29917ce 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -1641,7 +1641,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
     @Override
     public String getLocale() {
         return getHandle().locale;
+
+    }
+
+    // Paper start
+    public void setAffectsSpawning(boolean affects) {
+        this.getHandle().affectsSpawning = affects;
+    }
+
+    @Override
+    public boolean getAffectsSpawning() {
+        return this.getHandle().affectsSpawning;
     }
+    // Paper end
 
     @Override
     public void updateCommands() {
-- 
2.21.0