Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,12 @@
}
}
}
@@ -136,7 +_,7 @@
} else if (EntitySpawnReason.isSpawner(spawnReason)) {
return true;
} else {
- Player nearestPlayer = level.getNearestPlayer(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 5.0, true);
+ Player nearestPlayer = level.getNearestPlayerThatAffectsSpawning(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 5.0, true); // Paper - Affects Spawning API
return nearestPlayer == null;
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
--- a/net/minecraft/world/entity/monster/Silverfish.java
+++ b/net/minecraft/world/entity/monster/Silverfish.java
@@ -118,7 +_,7 @@
@@ -117,7 +_,7 @@
} else if (EntitySpawnReason.isSpawner(spawnReason)) {
return true;
} else {
Player nearestPlayer = level.getNearestPlayer(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 5.0, true);
- return nearestPlayer == null;
+ return !(nearestPlayer != null && !nearestPlayer.affectsSpawning) && nearestPlayer == null; // Paper - Affects Spawning API
- Player nearestPlayer = level.getNearestPlayer(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 5.0, true);
+ Player nearestPlayer = level.getNearestPlayerThatAffectsSpawning(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 5.0, true); // Paper - Affects Spawning API
return nearestPlayer == null;
}
}

@@ -168,9 +_,14 @@
BlockPos blockPos = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5, this.mob.getZ()).relative(this.selectedDirection);
BlockState blockState = levelAccessor.getBlockState(blockPos);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,21 @@
default @Nullable Player getNearestPlayer(Entity entity, double distance) {
return this.getNearestPlayer(entity.getX(), entity.getY(), entity.getZ(), distance, false);
}
@@ -97,6 +_,20 @@
@@ -97,6 +_,25 @@
return this.getNearestPlayer(x, y, z, distance, predicate);
}

+ // Paper start - Affects Spawning API
+ default @Nullable Player getNearestPlayerThatAffectsSpawning(double x, double y, double z, double maxDist, boolean filterOutCreative) {
+ Predicate<Entity> predicate = filterOutCreative ? EntitySelector.NO_CREATIVE_OR_SPECTATOR : EntitySelector.NO_SPECTATORS;
+ return this.getNearestPlayer(x, y, z, maxDist, predicate.and(entity -> ((Player) entity).affectsSpawning));
+ }
+
+ 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) {
+ double playerDist = player.distanceToSqr(x, y, z);
+ if (range < 0.0D || playerDist < range * range) {
+ return true;
+ }
+ }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- a/net/minecraft/world/level/block/entity/CreakingHeartBlockEntity.java
+++ b/net/minecraft/world/level/block/entity/CreakingHeartBlockEntity.java
@@ -110,7 +_,7 @@
if (creakingHeart.creakingInfo == null) {
if (blockState.getValue(CreakingHeartBlock.STATE) == CreakingHeartState.AWAKE) {
if (serverLevel.isSpawningMonsters()) {
- Player nearestPlayer = level.getNearestPlayer(pos.getX(), pos.getY(), pos.getZ(), 32.0, false);
+ Player nearestPlayer = level.getNearestPlayerThatAffectsSpawning(pos.getX(), pos.getY(), pos.getZ(), 32.0, false); // Paper - Affects Spawning API
if (nearestPlayer != null) {
Creaking creaking = spawnProtector(serverLevel, creakingHeart);
if (creaking != null) {
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- a/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java
+++ b/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java
@@ -22,7 +_,7 @@

public interface PlayerDetector {
PlayerDetector NO_CREATIVE_PLAYERS = (level, entitySelector, pos, maxDistance, requireLineOfSight) -> entitySelector.getPlayers(
- level, player -> player.blockPosition().closerThan(pos, maxDistance) && !player.isCreative() && !player.isSpectator()
+ level, player -> player.blockPosition().closerThan(pos, maxDistance) && !player.isCreative() && !player.isSpectator() && player.affectsSpawning // Paper - Affects Spawning API
)
.stream()
.filter(player -> !requireLineOfSight || inLineOfSight(level, pos.getCenter(), player.getEyePosition()))
Loading