aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0030-Player-affects-spawning-API.patch
diff options
context:
space:
mode:
authorOwen <[email protected]>2023-02-19 09:57:10 -0500
committerGitHub <[email protected]>2023-02-19 08:57:10 -0600
commit841da90501564e5b430a8469cac6e6a77627725d (patch)
tree934f58b2dfbf689e502651e4a3ad51383779f4c0 /patches/server/0030-Player-affects-spawning-API.patch
parentf9dc371fd8c56f1ad1359fc3bf1f7a40921ec66f (diff)
downloadPaper-841da90501564e5b430a8469cac6e6a77627725d.tar.gz
Paper-841da90501564e5b430a8469cac6e6a77627725d.zip
Paper Plugins (#8108)
Diffstat (limited to 'patches/server/0030-Player-affects-spawning-API.patch')
-rw-r--r--patches/server/0030-Player-affects-spawning-API.patch163
1 files changed, 163 insertions, 0 deletions
diff --git a/patches/server/0030-Player-affects-spawning-API.patch b/patches/server/0030-Player-affects-spawning-API.patch
new file mode 100644
index 0000000000..da16ad1762
--- /dev/null
+++ b/patches/server/0030-Player-affects-spawning-API.patch
@@ -0,0 +1,163 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jedediah Smith <[email protected]>
+Date: Tue, 1 Mar 2016 14:47:52 -0600
+Subject: [PATCH] Player affects spawning API
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java
+index 5c3b11f738c1ea19981cc878aa6c2323497391a0..6fd874a83a248e6a7d427d18d11fc608544662c5 100644
+--- a/src/main/java/net/minecraft/world/entity/EntitySelector.java
++++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java
+@@ -29,6 +29,11 @@ public final class EntitySelector {
+ public static final Predicate<Entity> CAN_BE_COLLIDED_WITH = EntitySelector.NO_SPECTATORS.and(Entity::canBeCollidedWith);
+
+ private EntitySelector() {}
++ // Paper start
++ public static final Predicate<Entity> PLAYER_AFFECTS_SPAWNING = (entity) -> {
++ return !entity.isSpectator() && entity.isAlive() && entity instanceof Player player && player.affectsSpawning;
++ };
++ // Paper end
+
+ public static Predicate<Entity> withinDistance(double x, double y, double z, double max) {
+ double d4 = max * max;
+diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
+index 99218eac34374a4d13451cfec15006c3bf0d755f..bb7c459c126be789bb12d08a569fe344e08914b8 100644
+--- a/src/main/java/net/minecraft/world/entity/Mob.java
++++ b/src/main/java/net/minecraft/world/entity/Mob.java
+@@ -808,7 +808,7 @@ public abstract class Mob extends LivingEntity {
+ if (this.level.getDifficulty() == Difficulty.PEACEFUL && this.shouldDespawnInPeaceful()) {
+ this.discard();
+ } else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) {
+- Player entityhuman = this.level.getNearestPlayer(this, -1.0D);
++ Player entityhuman = this.level.findNearbyPlayer(this, -1.0D, EntitySelector.PLAYER_AFFECTS_SPAWNING); // Paper
+
+ if (entityhuman != null) {
+ double d0 = entityhuman.distanceToSqr((Entity) this);
+diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
+index e368478dba01a9b11adf23ed64bed61c73a78a28..17fda4857f74d2994525262472700e7788dec383 100644
+--- a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
++++ b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
+@@ -25,7 +25,7 @@ public class SkeletonTrapGoal extends Goal {
+
+ @Override
+ public boolean canUse() {
+- return this.horse.level.hasNearbyAlivePlayer(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D);
++ return this.horse.level.hasNearbyAlivePlayerThatAffectsSpawning(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D); // Paper - Affects Spawning API
+ }
+
+ @Override
+diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
+index 87f66fd33e404367d924137b2d8aac3b06937f43..2dcda3b03796655da443e1b3dd68c6f6bca20d21 100644
+--- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
++++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
+@@ -127,7 +127,7 @@ public class Silverfish extends Monster {
+ if (checkAnyLightMonsterSpawnRules(type, world, spawnReason, pos, random)) {
+ Player entityhuman = world.getNearestPlayer((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, 5.0D, true);
+
+- return entityhuman == null;
++ return !(entityhuman != null && !entityhuman.affectsSpawning) && entityhuman == null; // Paper - Affects Spawning API
+ } else {
+ return false;
+ }
+diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+index 8ea60d388fff4a6368652ff96f648e5880053a2b..8ecbb64f9db9346757c5597404489496a0945508 100644
+--- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
++++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+@@ -325,7 +325,7 @@ public class Zombie extends Monster {
+
+ if (NaturalSpawner.isSpawnPositionOk(entitypositiontypes_surface, this.level, blockposition, entitytypes) && SpawnPlacements.checkSpawnRules(entitytypes, worldserver, MobSpawnType.REINFORCEMENT, blockposition, this.level.random)) {
+ entityzombie.setPos((double) i1, (double) j1, (double) k1);
+- if (!this.level.hasNearbyAlivePlayer((double) i1, (double) j1, (double) k1, 7.0D) && this.level.isUnobstructed(entityzombie) && this.level.noCollision((Entity) entityzombie) && !this.level.containsAnyLiquid(entityzombie.getBoundingBox())) {
++ if (!this.level.hasNearbyAlivePlayerThatAffectsSpawning((double) i1, (double) j1, (double) k1, 7.0D) && this.level.isUnobstructed(entityzombie) && this.level.noCollision((Entity) entityzombie) && !this.level.containsAnyLiquid(entityzombie.getBoundingBox())) { // Paper - Affects Spawning API
+ entityzombie.setTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); // CraftBukkit
+ entityzombie.finalizeSpawn(worldserver, this.level.getCurrentDifficultyAt(entityzombie.blockPosition()), MobSpawnType.REINFORCEMENT, (SpawnGroupData) null, (CompoundTag) null);
+ worldserver.addFreshEntityWithPassengers(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit
+diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
+index 47b5ef810348f8c702acb09b280b41b6b7227b6f..60fb74537fdc96005cbf6aa1670e773c0faa2f26 100644
+--- a/src/main/java/net/minecraft/world/entity/player/Player.java
++++ b/src/main/java/net/minecraft/world/entity/player/Player.java
+@@ -179,6 +179,9 @@ public abstract class Player extends LivingEntity {
+ private Optional<GlobalPos> lastDeathLocation;
+ @Nullable
+ public FishingHook fishing;
++ // Paper start
++ public boolean affectsSpawning = true;
++ // Paper end
+
+ // CraftBukkit start
+ public boolean fauxSleeping;
+diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java
+index f035206f2f59cb293d503c638ff06333a797a7a9..3e83bff81a0656d5e1d079ad9e63c7d27561c8e3 100644
+--- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
++++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
+@@ -54,7 +54,7 @@ public abstract class BaseSpawner {
+ }
+
+ public boolean isNearPlayer(Level world, BlockPos pos) {
+- return world.hasNearbyAlivePlayer((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange);
++ return world.hasNearbyAlivePlayerThatAffectsSpawning((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange); // Paper - Affects Spawning API
+ }
+
+ public void clientTick(Level world, BlockPos pos) {
+diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java
+index be6e3e21ad62da01e5e2dd78e300cbc8efdbeb42..ea98625fe7c00743b8df74a24e6d4b75df4189a5 100644
+--- a/src/main/java/net/minecraft/world/level/EntityGetter.java
++++ b/src/main/java/net/minecraft/world/level/EntityGetter.java
+@@ -82,6 +82,11 @@ public interface EntityGetter {
+ }
+ }
+
++ // Paper start
++ default @Nullable Player findNearbyPlayer(Entity entity, double maxDistance, @Nullable Predicate<Entity> predicate) {
++ return this.getNearestPlayer(entity.getX(), entity.getY(), entity.getZ(), maxDistance, predicate);
++ }
++ // Paper end
+ @Nullable
+ default Player getNearestPlayer(double x, double y, double z, double maxDistance, @Nullable Predicate<Entity> targetPredicate) {
+ double d = -1.0D;
+@@ -111,6 +116,20 @@ public interface EntityGetter {
+ return this.getNearestPlayer(x, y, z, maxDistance, predicate);
+ }
+
++ // Paper start
++ default boolean hasNearbyAlivePlayerThatAffectsSpawning(double x, double y, double z, double range) {
++ for (Player player : this.players()) {
++ if (EntitySelector.PLAYER_AFFECTS_SPAWNING.test(player)) { // combines NO_SPECTATORS and LIVING_ENTITY_STILL_ALIVE with an "affects spawning" check
++ double distanceSqr = player.distanceToSqr(x, y, z);
++ if (range < 0.0D || distanceSqr < range * range) {
++ return true;
++ }
++ }
++ }
++ return false;
++ }
++ // Paper end
++
+ default boolean hasNearbyAlivePlayer(double x, double y, double z, double range) {
+ for(Player player : this.players()) {
+ if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player)) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 9a6c9c42b162315115781246cdf91af816d93293..69e197c78b4e6265f61f42232ac2d06687b6ca5e 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -2105,8 +2105,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ @Override
+ public String getLocale() {
+ return this.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() {
+ if (this.getHandle().connection == null) return;